1xbet Mobile Phone Yukle 1xbet Apk & App Google Android Os, I Phone Ilə Idman Mərcləri Üçün Mobil Proqramlar 1xbet Azərbaycan Aze 1xbet C ข่าวการศึกษา ครูประถม คอม

1xbet Azərbaycan Yükle Android Və Iphone: Bonus A Hundred, Giriş, Idman Mərcləri

genişləndirir. Oyunçular futbol, ​​tennis və ya xokkey, eləcə də daha nadir idman növlərinə mərc edə” “[newline] bilərlər;

dərhal təsir edəcək. Maç öncəsi kimi canlı təkliflər çox deyil, lakin əsas idman hadisələri kifayət qədər geniş şəkildə təmsil olunur.

Bet Handikap

1XBet az oyunlarının başqa bir kateqoriyası kazino turnirləridir. İstifadəçilərin bu turnirdə iştirak etmək üçün yalnız 1XBet az qeydiyyatdan keçmələri lazımdır. 1XBet az onlayn bahis saytında istifadəçilərə kömək etmək və ilkin itkilərini ödəmək üçün bir neçə bonus va. İstifadəçilər bu bonuslardan onlayn bahis təcrübəsi qazanmaq üçün istifadə edə bilərlər.

Telefonun ayarlarında push-bildirişləri aktivləşdirməklə, udduğunuz mərclər və Sizi maraqlandıran matçların nəticələri barədə vaxtında xəbərdar olacaqsınız. Matçın sonunda bukmeker 1xbet. az haqq-hesab aparır və bunun” “tezliyi mərcin növündən asılıdır. Məsələn, statistikaların nəticələrini operator xBet arizona daha çox vaxt ərzində təhlil edir. Şirkət öz xbet az saytını dünyanın 68 dilinə tərcümə edib. 1xbet possuindo saytın dilini sağ üst küncdə müvafiq düyməni basmaqla dəyişmək olar.

Rəsmi Sayta Baxış 1 X Bet

Qarışıq döyüş sənətləri üçün nəzərdə tutulmuş ehtimallar və bahisin həcmləri döyüş tarixi yaxınlaşdıqca dəyişə bilər. 1xBet ən böyük bahis şirkətlərindən biridir və son dərəcə populyardır. Bukmeker şirkəti yaxşı əmsallarla və ən geniş sıra ilə fərqlənən bütün idman” “tədbirlərinə mərc təklif edir. Bundan sonra, mərc yerləşdirə və şəxsi hesabınızın bütün funksiyalarından istifadə edə biləcəksiniz https://1x-bet-top.com.

Hər cür idman budağında bahis etmək xaricində, online internet gambling dens və birbaşa online casino variantları aperitivo bilərsiniz. Daha sonra isə 1xBet-in Android və iOS üçün olan tətbiqlərinə nəzər yetirəcəyik. Tətbiqlər səbəbindən idman və ya kazino məzmunlu bütün canlı mərclər heç bir trouble olmadan qiymətləndirilə bilər.

Bukmeker Kontorunda Hesabı Necə Maliyyələşdirmək Olar?

səhifəni araşdırmaqdır. Quraşdırma linkinə klikləməklə oyunçu proqramı fonda yükləyə bilər. Sonra yalnız prosedurun tamamlanmasını gözləmək qalır və siz

Siz iOS cihazınızdakı birbaşa bağlantı ilə mobil tətbiqi endirə bilərsiniz. 1xbet mobil tətbiqi, iPhone və iPad kimi The apple company cihazlarında düzgün işləyir. 1xbet mobil tətbiqi ilə hər şeyi idarə etmək artıq daha asandır.

Bet Azərbaycan Bukmekeri: Rəsmi Saytın Nəzərdən” “keçirilməsi

1xbet mobile proqramın ölçüsü 40, 63 MB-dır, Wi-Fi vasitəsilə yükləmək daha yaxşıdır. Proqram Android five. 0 və daha yuxarı versiyalarda quraşdırıla bilər. Əməliyyat sisteminin əvvəlki versiyalarında 1xbet com mobile artıq işləyə bilməyəcək.

Bundan başqa, 1xBet saytında uğurlu kombinasiya tərtib edə bilərsiniz və öz kuponunuzu paylaşa bilərsiniz. BK 1xBet hər ay kuponlar döyüşü keçirir və oyunçulara əlavə bonus almaq imkanı verir. 1xBet uzun illərdir ki, inkişafını dəstəklədiyi balompié, UFC və kibersport üzrə mərclər xüsusilə populyardır. Gündəlik dünyada azarkeşləri 90+ idman hadisələrinə 1000+ mərc edə bilərlər. 1xBet-öz” “müştərilərini həvəsləndirən, yüksək bonuslar və maraqlı aksiyalar təklif edən etibarlı bukmekerdir. Bukmeker seçmək hər bir oyunçunun öhdəsindən gəlməli olduğu vacib vəzifədir https://1x-bet-top.com/giris/.

Iphone-na Proqramı 1xbet İos Necə Yükləmək Olar?

1xbet yukle Ağıllı tətbiqetmə üçün seçimlərdə dili bilməyinizə ehtiyac yoxdur. Oyunçuların təhlükəsizlik parametrlərində əlavə dəyişikliklər etməyə ehtiyac yoxdur. Yeni oyunçular üçün faydalı məsləhət, mərc etmək niyyətində olduqları bölmədəki kotirovkaları öyrənməkdir.

Saytın bütün en yeni istifadəçiləri (yeni” “1xbet qeydiyyatı) ilkin reward qazanmaq şansına sahibdirlər. İlkin bonus məbləği 100 Avro və ekvivalent valyuta qədər 100% -dir. Pulsuz ad günü bahisləri kimi depoziti olmayan 1bet promosyonlar da var. 1xbet. com-da bir çox added bonus poker oyunları və kazino fanatları da var. Bonus şərtləri haqqında şirkətin saytında (1xbet Azerbaycan elaqe nomresi) daha çox məlumat əldə edin. 1xBet ən az minimum depozit məbləğlərindən birini təklif edir.

Bet Arizona & Azerbaycan

Promosyon kodları kazino saytında və partnyor portallarında axtarılmalıdır. Proqramla mərc oynamağa başlamaq üçün yenidən qeydiyyatdan keçməyinizə ehtiyac yoxdur? Proqramı Android-də quraşdırmaqdan ötrü bukmeker kontorunun rəsmi” “saytında mövcud olan APK faylını yükləmək üçün keçiddən istifadə etmək kifayətdir.

Alternativ platformalar seçmək daha az müsbət emosiyalar gətirə bilər. Təhlükəsizlik infrastrukturunun köməyi ilə sayta tam qiymətləndirmə ilə daxil onda bilərsiniz və bahislərinizi davam etdirə bilərsiniz. Saytın ziyarətçiləri iştirakçıların asan daxil və praktiki olaraq sürətli qeydiyyatı ilə çox razıdırlar.

Bukmeker Saytlari, Merc Saytlari

Həmçinin, platforma oyunçunun hesablarını bloklaya bilər, əgər sonuncu multi-mühasibatlıqla məşğuldursa. 1 xbet bukmeker kontoru öz oyunçularına added bonus proqramının şərtlərini yerinə yetirdiyi təqdirdə depozitə əlavə vəsait almaq imkanı təklif edir. Oyunçular idmana mərc etməyi üstün tuturlarsa, oxşar şərtlər altında qeydiyyatdan keçmək üçün a hundred dollar və a hundred and fifty ​​pulsuz fırlanma əldə edə 1XBET Mobile Yukle 1xbet apk & application Android, iphone ilə idman mərcləri üçün mobil proqramlar 1xBet Azərbaycan aze 1xbet. Com 1xBet BK 2007-ci ildə təsis edilib və ötən müddət ərzində bütün dünyada bukmеykеr biznesinin liderlərindən birinə çevrilib.” “[newline]Hökumət Azərbaycan sakinləri üçün rəsmi saytı 1xbet bloklamaq üçün tədbirlər görə bilər. 1xbet rəhbərliyi beynəlxalq lisenziya üzrə hüquqi xidmətlər təklif edir.

gələcəyini daha yaxşı başa düşmək üçün komandalar və oyunçular haqqında əlavə statistikadan istifadə edə bilərlər. Yeni istifadəçilərin qeydiyyatı müxtəlif üsullardan istifadə etməklə həyata keçirilə bilər.

Futbol

Digər on the internet bahis saytlarından fərqli olaraq, minimum depozit dərəcəsi çox aşağı. Beləcə, en en yeni üzvlərə verilən ilk 1000 AZN depozit bonusu yerinə cost free TLə qədər% 200 Hoşgeldin bonusu alacaqsınız. 1XBET Promosyon Kodu Necə istifadə 1XBET araşdırma sualları cavabını məqaləmizdə tapadera bilərsiniz. Əvvəlcə “1xbet cellular yukle” smartfon tətbiqini söyləyərək tətbiqetməni quraşdıra bilərsiniz.

Bununla belə, hər hansı mərc tələblərini və ya məhdudiyyətlərini başa düşmək üçün bu təkliflərlə bağlı şərtləri nəzərdən keçirmək vacibdir. 1xBet ölkəmizdə olduqca sevilən və populyar mərc saytlarından biridir. Sürətli mərc rejimi müştərinin müəyyən etdiyi məbləğdə mərci seçilmiş nəticənin əmsalına bir kliklə yerləşdirməyə imkan verir. 1 və ahora daha yüksək versiyası olan qadcetlərə iqra অনলাইন quraşdıra bilərsiniz. Bilərlər; Xəttlərini şaxələndirmək üçün bahisçilər qeyri-standart mərc formatlarından da istifadə edə bilərlər.

Bet Azerbaycan Rəsmi Saytı 2023

Bu o deməkdir ki, saytdakı bahis zonalarına nə qədər çox sərmayə qoyursunuzsa, bu, sizin hesabınıza bir o qədər çox köçürüləcək. Yalnız bu məqsədlə dövr şərtləri 1xbet-in təsvir etdiyi müddət ərzində yerinə yetirilməlidir. Digər xarici saytlar kimi, 1xbet mərc saytı da Azərbaycanda qanunsuz işləyir. Bu səbəbdən, hazırda ünvanda dəyişikliklər edilir, lakin oyunçuların hesabları dəyişmədən yenisinə ötürülür.

idmana ilk mərcləri edə bilərsiniz. Siz mərc proqramını Android 4. one ilə işləyən smartfona yükləyə bilərsiniz. 2024-ci ildə siz təkcə idmana deyil, həm də kazinoya” “mərc edə bilərsiniz. Siz slot maşınlarına, eləcə də kart masalarına mərc edə bilərsiniz. Provayderlər bazarda uzunmüddətli təcrübəyə malikdirlər və qumarbazlar yalnız adi rejimdə slotlara

Bet Mobile Phone Tətbiqin Funksionallığı Nədir?

Depozitdən bonusları çıxara bilmək üçün oyunçu onlara mərc qoymalıdır. Hər bir promosyonun öz mərcləri var və siz əmsalları 1, 4 olan mərclərə hadisələrə mərc etməlisiniz. Depoziti doldurmaq üçün şəxsi hesabınıza daxil olmaq və ya qeydiyyatdan keçmək lazımdır. Sonra, şəxsi hesabınızda ödəniş nöqtəsini seçin və mövcud ödəniş üsulları ilə tanış olun.

Saytın strukturu olduqca ənənəvidir, ona görə də təcrübəli oyunçular üçün bukmeker kontorunun nə təklif etdiyini anlamaq asan olacaq. Kazino və bukmeker kontoru birləşdirilib ki, bu da mərc prosesini asanlaşdırır, həm də onu daha müxtəlif etməyə olanak verir. Daha liberaldır, ona görə də qumarbazların proqramı yükləmək üçün saytdan istifadə etməsinə heç nə mane olmur.

Sığorta Və Mərc Satışı

İstifadəçilər hesablar yarada bilər, balanslarını artıra bilər, şəxsi hesablarına daxil ola bilər, idman və kazinoda bahis edə bilərlər. Və eyni zamanda hətta Live hadisələrə baxarkən belə web sərfiyyatının sürətini azaltmaq mümkün olacaq. Anlayaq ki, 1xbet mobile phone tətbiqi müxtəlif əməliyyat sistemləri olan smartfonlara necə köçurtmək olar.

Saytın strukturu olduqca ənənəvidir, ona görə də təcrübəli oyunçular üçün bukmeker kontorunun nə təklif etdiyini anlamaq asan olacaq. Kazino və bukmeker kontoru birləşdirilib ki, bu da mərc prosesini

Bet Mərclərin Növləri Və Variantları

1xbet মোবাইল tətbiqində hesabınıza giriş etmək üçün tətbiqin ana səhifəsində ‘Giriş’ düyməsini seçin və hesabınıza help olan məlumatları daxil edin. Dépôt bonus sur 1xBet réel puya dépôt və difficulté tələb etməyən yeni oyunçular üçün xoş hədiyyələrdir. Si vous utilisez un apple iphone ou el Android, vous aurez nécessaire d’un plan mobile.

Bunlardan biri də bu verilişdə dünya futbol matçlarının canlı yayımlanmasıdır. İstifadəçilər sevdikləri futbol matçını izləyərkən canlı bahis edə bilərlər. Bu şəkildə oyunun vacib hadisələrindən sonra mərc oyunlarını dəyişdirə və qazanma şanslarını artıra bilərlər. Bu saytın mərc seçimləri, onlayn mərc saytları arasında ən yüksək əmsaldır. 1xbet azerbaycan saytında istifadəçiləri dəstəkləmək və ilkin zərərlərini ödəmək üçün bir neçə bonus var.

Bet Mobile Yukle 1xbet Apk & Application Android, Iphone Ilə Idman Mərcləri Üçün Mobil Proqramlar 1xbet Azərbaycan Aze 1xbet Co

bilər, əgər sonuncu multi-mühasibatlıqla məşğuldursa. 1 xbet bukmeker kontoru öz oyunçularına reward proqramının şərtlərini yerinə yetirdiyi təqdirdə depozitə əlavə vəsait almaq imkanı təklif edir. Oyunçular idmana mərc etməyi üstün tuturlarsa, oxşar şərtlər

kimi kriptovalyutalardan istifadə edə bilərlər. Azərbaycandan olan oyunçular üçün böyük üstünlük ondan ibarətdir ki, bukmeker kontoru əməliyyatlar üçün əlavə komissiya təyin etmir. Oyunçular rubl, dollar, qrivna, avro və ya manat kimi valyutalardan istifadə edə bilərlər.

Bet Az Yukle / Qeydiyyat – Mobi Azerbaycan

hadisə üçün təklif olunan bütün mərcləri görə biləcəksiniz. İstədiyiniz nəticənin əmsalına vuraraq rahatlıqla mərc edə bilərsiniz.

Uduşların ödənilməsi üçün pulun hesaba köçürülməsində istifadə edilən eyni ödəmə üsulundan istifadə edilir. Saytda bir çox reward imkanları va; ilk növbədə ilk investisiya bonusu, yalnız saytda qeydiyyatdan keçənlər üçün eksklüziv stimuldur!” “[newline]Manat kartlar üçün a quarter-hour rubl, AZN wasserstoffion (negativ) (fachsprachlich) pul kisələri və mobil operatorlar üçün şirkət komissiya tələb etmir. Əgər onlayn – mərc etmək istəyirsinizsə, 1xBet ARIZONA ( AZ ) zerkalo ən gözəl seçimlərdən biridir. Depozit açmaq da mümkündür, bunun üçün proqramın quraşdırılmasını başa çatdırmalı və Qeydiyyat elementini seçməlisiniz. Buna baxmayaraq, populyar və adi görüşlər üçün 1 x bet bukmeker komissiyaları az-çox oxşardır.

(function () { var searchreplace = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); function isContentEditableFalse(node) { return node && node.nodeType === 1 && node.contentEditable === 'false'; } function findAndReplaceDOMText(regex, node, replacementNode, captureGroup, schema) { var m; var matches = []; var text, count = 0, doc; var blockElementsMap, hiddenTextElementsMap, shortEndedElementsMap; doc = node.ownerDocument; blockElementsMap = schema.getBlockElements(); hiddenTextElementsMap = schema.getWhiteSpaceElements(); shortEndedElementsMap = schema.getShortEndedElements(); function getMatchIndexes(m, captureGroup) { captureGroup = captureGroup || 0; if (!m[0]) { throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); } var index = m.index; if (captureGroup > 0) { var cg = m[captureGroup]; if (!cg) { throw new Error('Invalid capture group'); } index += m[0].indexOf(cg); m[0] = cg; } return [ index, index + m[0].length, [m[0]] ]; } function getText(node) { var txt; if (node.nodeType === 3) { return node.data; } if (hiddenTextElementsMap[node.nodeName] && !blockElementsMap[node.nodeName]) { return ''; } txt = ''; if (isContentEditableFalse(node)) { return '\n'; } if (blockElementsMap[node.nodeName] || shortEndedElementsMap[node.nodeName]) { txt += '\n'; } if (node = node.firstChild) { do { txt += getText(node); } while (node = node.nextSibling); } return txt; } function stepThroughMatches(node, matches, replaceFn) { var startNode, endNode, startNodeIndex, endNodeIndex, innerNodes = [], atIndex = 0, curNode = node, matchLocation = matches.shift(), matchIndex = 0; out: while (true) { if (blockElementsMap[curNode.nodeName] || shortEndedElementsMap[curNode.nodeName] || isContentEditableFalse(curNode)) { atIndex++; } if (curNode.nodeType === 3) { if (!endNode && curNode.length + atIndex >= matchLocation[1]) { endNode = curNode; endNodeIndex = matchLocation[1] - atIndex; } else if (startNode) { innerNodes.push(curNode); } if (!startNode && curNode.length + atIndex > matchLocation[0]) { startNode = curNode; startNodeIndex = matchLocation[0] - atIndex; } atIndex += curNode.length; } if (startNode && endNode) { curNode = replaceFn({ startNode: startNode, startNodeIndex: startNodeIndex, endNode: endNode, endNodeIndex: endNodeIndex, innerNodes: innerNodes, match: matchLocation[2], matchIndex: matchIndex }); atIndex -= endNode.length - endNodeIndex; startNode = null; endNode = null; innerNodes = []; matchLocation = matches.shift(); matchIndex++; if (!matchLocation) { break; } } else if ((!hiddenTextElementsMap[curNode.nodeName] || blockElementsMap[curNode.nodeName]) && curNode.firstChild) { if (!isContentEditableFalse(curNode)) { curNode = curNode.firstChild; continue; } } else if (curNode.nextSibling) { curNode = curNode.nextSibling; continue; } while (true) { if (curNode.nextSibling) { curNode = curNode.nextSibling; break; } else if (curNode.parentNode !== node) { curNode = curNode.parentNode; } else { break out; } } } } function genReplacer(nodeName) { var makeReplacementNode; if (typeof nodeName !== 'function') { var stencilNode_1 = nodeName.nodeType ? nodeName : doc.createElement(nodeName); makeReplacementNode = function (fill, matchIndex) { var clone = stencilNode_1.cloneNode(false); clone.setAttribute('data-mce-index', matchIndex); if (fill) { clone.appendChild(doc.createTextNode(fill)); } return clone; }; } else { makeReplacementNode = nodeName; } return function (range) { var before; var after; var parentNode; var startNode = range.startNode; var endNode = range.endNode; var matchIndex = range.matchIndex; if (startNode === endNode) { var node_1 = startNode; parentNode = node_1.parentNode; if (range.startNodeIndex > 0) { before = doc.createTextNode(node_1.data.substring(0, range.startNodeIndex)); parentNode.insertBefore(before, node_1); } var el = makeReplacementNode(range.match[0], matchIndex); parentNode.insertBefore(el, node_1); if (range.endNodeIndex < node_1.length) { after = doc.createTextNode(node_1.data.substring(range.endNodeIndex)); parentNode.insertBefore(after, node_1); } node_1.parentNode.removeChild(node_1); return el; } before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex)); after = doc.createTextNode(endNode.data.substring(range.endNodeIndex)); var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex); for (var i = 0, l = range.innerNodes.length; i < l; ++i) { var innerNode = range.innerNodes[i]; var innerEl = makeReplacementNode(innerNode.data, matchIndex); innerNode.parentNode.replaceChild(innerEl, innerNode); } var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); parentNode = startNode.parentNode; parentNode.insertBefore(before, startNode); parentNode.insertBefore(elA, startNode); parentNode.removeChild(startNode); parentNode = endNode.parentNode; parentNode.insertBefore(elB, endNode); parentNode.insertBefore(after, endNode); parentNode.removeChild(endNode); return elB; }; } text = getText(node); if (!text) { return; } if (regex.global) { while (m = regex.exec(text)) { matches.push(getMatchIndexes(m, captureGroup)); } } else { m = text.match(regex); matches.push(getMatchIndexes(m, captureGroup)); } if (matches.length) { count = matches.length; stepThroughMatches(node, matches, genReplacer(replacementNode)); } return count; } var FindReplaceText = { findAndReplaceDOMText: findAndReplaceDOMText }; var getElmIndex = function (elm) { var value = elm.getAttribute('data-mce-index'); if (typeof value === 'number') { return '' + value; } return value; }; var markAllMatches = function (editor, currentIndexState, regex) { var node, marker; marker = editor.dom.create('span', { 'data-mce-bogus': 1 }); marker.className = 'mce-match-marker'; node = editor.getBody(); done(editor, currentIndexState, false); return FindReplaceText.findAndReplaceDOMText(regex, node, marker, false, editor.schema); }; var unwrap = function (node) { var parentNode = node.parentNode; if (node.firstChild) { parentNode.insertBefore(node.firstChild, node); } node.parentNode.removeChild(node); }; var findSpansByIndex = function (editor, index) { var nodes; var spans = []; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); if (nodes.length) { for (var i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex === null || !nodeIndex.length) { continue; } if (nodeIndex === index.toString()) { spans.push(nodes[i]); } } } return spans; }; var moveSelection = function (editor, currentIndexState, forward) { var testIndex = currentIndexState.get(); var dom = editor.dom; forward = forward !== false; if (forward) { testIndex++; } else { testIndex--; } dom.removeClass(findSpansByIndex(editor, currentIndexState.get()), 'mce-match-marker-selected'); var spans = findSpansByIndex(editor, testIndex); if (spans.length) { dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected'); editor.selection.scrollIntoView(spans[0]); return testIndex; } return -1; }; var removeNode = function (dom, node) { var parent = node.parentNode; dom.remove(node); if (dom.isEmpty(parent)) { dom.remove(parent); } }; var find = function (editor, currentIndexState, text, matchCase, wholeWord) { text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); text = text.replace(/\s/g, '[^\\S\\r\\n]'); text = wholeWord ? '\\b' + text + '\\b' : text; var count = markAllMatches(editor, currentIndexState, new RegExp(text, matchCase ? 'g' : 'gi')); if (count) { currentIndexState.set(-1); currentIndexState.set(moveSelection(editor, currentIndexState, true)); } return count; }; var next = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, true); if (index !== -1) { currentIndexState.set(index); } }; var prev = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, false); if (index !== -1) { currentIndexState.set(index); } }; var isMatchSpan = function (node) { var matchIndex = getElmIndex(node); return matchIndex !== null && matchIndex.length > 0; }; var replace = function (editor, currentIndexState, text, forward, all) { var i, nodes, node, matchIndex, currentMatchIndex, nextIndex = currentIndexState.get(), hasMore; forward = forward !== false; node = editor.getBody(); nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); matchIndex = currentMatchIndex = parseInt(nodeIndex, 10); if (all || matchIndex === currentIndexState.get()) { if (text.length) { nodes[i].firstChild.nodeValue = text; unwrap(nodes[i]); } else { removeNode(editor.dom, nodes[i]); } while (nodes[++i]) { matchIndex = parseInt(getElmIndex(nodes[i]), 10); if (matchIndex === currentMatchIndex) { removeNode(editor.dom, nodes[i]); } else { i--; break; } } if (forward) { nextIndex--; } } else if (currentMatchIndex > currentIndexState.get()) { nodes[i].setAttribute('data-mce-index', currentMatchIndex - 1); } } currentIndexState.set(nextIndex); if (forward) { hasMore = hasNext(editor, currentIndexState); next(editor, currentIndexState); } else { hasMore = hasPrev(editor, currentIndexState); prev(editor, currentIndexState); } return !all && hasMore; }; var done = function (editor, currentIndexState, keepEditorSelection) { var i, nodes, startContainer, endContainer; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex !== null && nodeIndex.length) { if (nodeIndex === currentIndexState.get().toString()) { if (!startContainer) { startContainer = nodes[i].firstChild; } endContainer = nodes[i].firstChild; } unwrap(nodes[i]); } } if (startContainer && endContainer) { var rng = editor.dom.createRng(); rng.setStart(startContainer, 0); rng.setEnd(endContainer, endContainer.data.length); if (keepEditorSelection !== false) { editor.selection.setRng(rng); } return rng; } }; var hasNext = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() + 1).length > 0; }; var hasPrev = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() - 1).length > 0; }; var Actions = { done: done, find: find, next: next, prev: prev, replace: replace, hasNext: hasNext, hasPrev: hasPrev }; var get = function (editor, currentIndexState) { var done = function (keepEditorSelection) { return Actions.done(editor, currentIndexState, keepEditorSelection); }; var find = function (text, matchCase, wholeWord) { return Actions.find(editor, currentIndexState, text, matchCase, wholeWord); }; var next = function () { return Actions.next(editor, currentIndexState); }; var prev = function () { return Actions.prev(editor, currentIndexState); }; var replace = function (text, forward, all) { return Actions.replace(editor, currentIndexState, text, forward, all); }; return { done: done, find: find, next: next, prev: prev, replace: replace }; }; var Api = { get: get }; var open = function (editor, currentIndexState) { var last = {}, selectedText; editor.undoManager.add(); selectedText = global$1.trim(editor.selection.getContent({ format: 'text' })); function updateButtonStates() { win.statusbar.find('#next').disabled(Actions.hasNext(editor, currentIndexState) === false); win.statusbar.find('#prev').disabled(Actions.hasPrev(editor, currentIndexState) === false); } function notFoundAlert() { editor.windowManager.alert('Could not find the specified string.', function () { win.find('#find')[0].focus(); }); } var win = editor.windowManager.open({ layout: 'flex', pack: 'center', align: 'center', onClose: function () { editor.focus(); Actions.done(editor, currentIndexState); editor.undoManager.add(); }, onSubmit: function (e) { var count, caseState, text, wholeWord; e.preventDefault(); caseState = win.find('#case').checked(); wholeWord = win.find('#words').checked(); text = win.find('#find').value(); if (!text.length) { Actions.done(editor, currentIndexState, false); win.statusbar.items().slice(1).disabled(true); return; } if (last.text === text && last.caseState === caseState && last.wholeWord === wholeWord) { if (!Actions.hasNext(editor, currentIndexState)) { notFoundAlert(); return; } Actions.next(editor, currentIndexState); updateButtonStates(); return; } count = Actions.find(editor, currentIndexState, text, caseState, wholeWord); if (!count) { notFoundAlert(); } win.statusbar.items().slice(1).disabled(count === 0); updateButtonStates(); last = { text: text, caseState: caseState, wholeWord: wholeWord }; }, buttons: [ { text: 'Find', subtype: 'primary', onclick: function () { win.submit(); } }, { text: 'Replace', disabled: true, onclick: function () { if (!Actions.replace(editor, currentIndexState, win.find('#replace').value())) { win.statusbar.items().slice(1).disabled(true); currentIndexState.set(-1); last = {}; } } }, { text: 'Replace all', disabled: true, onclick: function () { Actions.replace(editor, currentIndexState, win.find('#replace').value(), true, true); win.statusbar.items().slice(1).disabled(true); last = {}; } }, { type: 'spacer', flex: 1 }, { text: 'Prev', name: 'prev', disabled: true, onclick: function () { Actions.prev(editor, currentIndexState); updateButtonStates(); } }, { text: 'Next', name: 'next', disabled: true, onclick: function () { Actions.next(editor, currentIndexState); updateButtonStates(); } } ], title: 'Find and replace', items: { type: 'form', padding: 20, labelGap: 30, spacing: 10, items: [ { type: 'textbox', name: 'find', size: 40, label: 'Find', value: selectedText }, { type: 'textbox', name: 'replace', size: 40, label: 'Replace with' }, { type: 'checkbox', name: 'case', text: 'Match case', label: ' ' }, { type: 'checkbox', name: 'words', text: 'Whole words', label: ' ' } ] } }); }; var Dialog = { open: open }; var register = function (editor, currentIndexState) { editor.addCommand('SearchReplace', function () { Dialog.open(editor, currentIndexState); }); }; var Commands = { register: register }; var showDialog = function (editor, currentIndexState) { return function () { Dialog.open(editor, currentIndexState); }; }; var register$1 = function (editor, currentIndexState) { editor.addMenuItem('searchreplace', { text: 'Find and replace', shortcut: 'Meta+F', onclick: showDialog(editor, currentIndexState), separator: 'before', context: 'edit' }); editor.addButton('searchreplace', { tooltip: 'Find and replace', onclick: showDialog(editor, currentIndexState) }); editor.shortcuts.add('Meta+F', '', showDialog(editor, currentIndexState)); }; var Buttons = { register: register$1 }; global.add('searchreplace', function (editor) { var currentIndexState = Cell(-1); Commands.register(editor, currentIndexState); Buttons.register(editor, currentIndexState); return Api.get(editor, currentIndexState); }); function Plugin () { } return Plugin; }()); })();