Mostbet Az Ninety Azərbaycanda Bukmeker Və Casino Bonus 550+250fs

Mostbet Az: 550 + 250 Fs-ə Qədər Böyük Bonus Əldə Edin

Content

Siz həmçinin Olimpiya Oyunları, Formula just a single, Kriket üzrə Dünya Kuboku və s. Bütün rəsmi idman və e-idman hadisələrinə, eləcə də Online İdmanlara Xətt və ya Canlı mərclər qoya bilərsiniz. Bu bölmədə Mostbet platformasındakı mərc seçimləri barədə ətraflı məlumat ala bilərsiniz mostbet giriş.

Mostbet sevimli idman növünə və ya oyunlara mərc etmək üçün təhlükəsiz, sürətli və rahat üsuldur. Canlı dəstək xidməti bir neçə dildə kömək təklif edə və hesabınızla bağlı hər hansı bir problemdə sizə kömək edə bilər. Şirkət müsbət mərc təcrübəsi qazanmaq üçün mükəmməl müştəri xidməti təqdim etməyə çalışır. Mostbet güzgüləri əsas sayt bloklandıqda və ya əlçatan olmadıqda Mostbet veb saytına daxil olmağa imkan verən alternativ keçidlər və domenlərdir. Onlar eyni xüsusiyyətlərə və funksiyalara malik olan əsas saytın” “dəqiq surətləridir.

Mostbet-in Rəsmi Veb Saytına Qeydiyyat

Kazinoda həftədə bir dəfə icra edilir, bukmeker kontorunda isə mərcin müəyyən hissəsini vaxtından əvvəl götürmək şansı var. Bunlar Azərbaycanda oyunçular üçün mövcud olan ən çoxbet promo kodlarından bəziləridir. Mostbet kazinoda siz onlayn slotların maraqlı seçimindən həzz ala bilərsiniz. Siz klassik 3 və five çarxlı oyunlar, eləcə də böyük ödəmə potensialı olan proqressiv cekpot oyunları arasında seçim edə bilərsiniz.

Mostbet Aviator, ağıllı oynasanız, sizə qısa müddətdə böyük gəlirlər verə biləcək bir oyundur. Onlayn poker, Mostbet Azərbaycan onlayn kazinosunda oynaya biləcəyiniz ən populyar və maraqlı oyunlardan biridir. Siz Mostbet Azərbaycanda müxtəlif növ poker oyunları tapadera bilərsiniz, məsələn, Tx Hold’em, Omaha, Stud, Draw və h. Siz həmçinin dünyanın hər yerindən real dilerlər və digər oyunçularla canlı holdem poker oynaya bilərsiniz. Onlayn poker bacarıq və strategiya tələb” “edən bir oyundur. Poker əllərinin qaydalarını və reytinqlərini, həmçinin blef etməyi və rəqiblərinizin hərəkətlərini oxumağı bilməlisiniz. Siz həmçinin poker bacarıqlarınızı təkmilləşdirmək və daha çox pul qazanmaq üçün müxtəlif alətlər və məsləhətlərdən istifadə edə bilərsiniz mostbet online.

Saytda Necə Qeydiyyatdan Keçmək Olar?

Bukmeker kontoru bütün idman və virtual kazino oyunları üzrə rəqabətli əmsallar təklif edir. Müştərilər sənaye standartı əmsalları, eləcə də ətrafdakı ən yaxşı dəyərli mərclərdən bəzilərini tapmağı gözləyə bilərlər. Bu, bizim bukmeker kontorunu qazanclarını artırmaq istəyən bahisçilər üçün əla seçim edir.

Başlamaq üçün sadəcə ‘Hesabım’ sekmesine klikləyin və sonra ‘Promo Kodlar’ seçimini seçin. Siz həmçinin mərc vərəqəsinin altında yerləşən ‘Seçim əlavə et’ düyməsini klikləməklə əlavə seçimlər əlavə edə bilərsiniz. Seçimlərinizdən razı qaldıqdan sonra ‘Mərc yerləşdirin’ düyməsini klikləyin və mərciniz qəbul ediləcək.

Sosial Şəbəkələr Vasitəsilə

Lakin o, proqramlardan daha yavaş işləyir və barmaq izi ilə giriş ilə trafikə qənaət etmir. Bəli, bukmeker kontoru Kurakao hökumətinin verdiyi lisenziya əsasında fəaliyyət göstərir Bu, dünyada ən aşağı qiymətlərdən biridir və bu platformada ən yüksək əmsalları göstərir

Bukmeker” “kontoru 2 saat ərzində pulun çıxarılması ilə bağlı bütün sorğuları emal edir. Sonra pul kartınıza və ya cüzdanınıza köçürülür (adətən dəqiqə ərzində). Əgər biz kriptovalyutalardan danışırıqsa, o zaman əməliyyat demək olar ki, dərhal baş verir – cara blokçeynində yalnız bir neçə təsdiq gözləyir Bütün bu məlumatlar oyundakı hadisələrdən sonra ten saniyədən çox olmayan gecikmə ilə dərhal yenilənir.

Canlı Kazino

Bukmekerlərin sayının artması onlar arasındakı rəqabəti də gücləndirir. Hər bir bukmeker şirkəti bazarda fərqlənməyə çalışır və bu səbəblə də, müxtəlif bonuslar təklif edir. Həmçinin Mostbet-AZ90 dəvət etdiyiniz dostlarınız qeydiyyatdan keçdiyi zaman siz də bonus əldə edəcəksiniz. Qeydiyyatda istifadəçi adını, doğum tarixini, e-poçt ünvanını, parolunu və mobil nömrəsini daxil etməlidir. Qeydiyyat zamanı Mostbet-AZ90 istifadəçinin şəxsiyyətini təsdiqləməsini tələb edir aviator demo.

MostBet istənilən rahat cihazdan mərc etməyə və oynamağa olanak verən bütün əsas əməliyyat sistemlərini əhatə edir. Bukmeker şirkətinin rəsmi saytı ən yüksək xidməti göstərmək üçün” “daim inkişaf edir. Bukmeker kontorunun uzun illər təcrübəsi var, ona görə də xidmətin keyfiyyətinə heç” “bir şübhə yoxdur. Proqramın iOS cihazınızda quraşdırılması prosesini başa çatdırmaq üçün yuxarıda təsvir edilən eyni addımı (2-4-cü addım) edin. Veb saytın əsas səhifəsində proqramı yükləmək üçün düyməni aperitivo bilərsiniz. Həmin düyməni klikləyin və siz Search engines Play Shop və ya iTunes mağazasına yönləndiriləcəksiniz (cihazınızın OS-dən asılı olaraq).

Mobil Telefonla Qeydiyyat

Siz həmçinin Olimpiya Oyunları, F1, Kriket üzrə Dünya Kuboku və h. Mostbet Azərbaycan sizə bu yarışlara mərc etmək və onları sizin üçün daha maraqlı və sərfəli etmək üçün müxtəlif bazarlar və seçimlər təklif edir. Funksional imkanlar daim inkişaf edir və təkmilləşir, yeni xüsusiyyətləri və carilərində təkmilləşdirməsini özündə cəmləşdirir. Mostbet dünyanın ən sərfəli, sürətli və etibarlı bukmeker kontorlarından biridir. İdmana mərclər və funksiyaların geniş çeşidi geniş imkanlar və istifadə rahatlığı təmin edir. Bir çox populyar idman hadisələri istifadəçilərə evdə və en este momento kompüterlərinin qarşısında olmadan yolda mərc etməyə imkan verən canlı yayım xidmətləri təklif edir.

Ən əsası, məsul qumar prinsipləri haqqında unutmayın və sonra saytda qeydiyyatdan keçin və xidmətlərdən sonrakı istifadə uğurlu olacaq! Qlobal mobil oyun bazarının” “əsas üstünlüklərindən biri də rahatlıqdır. Mostbet-AZ91-də siz yalnız bir bonusdan istifadə edə” “bilərsiniz – bukmeker və ya onlayn kazino üçün.

Mostbet-az90 Canlı Kazi̇no

Mostbet onlayn saytı Azərbaycanda biri idman mərcçiləri üçün, digəri isə kazino qumarbazları üçün iki loyallıq proqramı yaradıb. Digər tərəfdən, kazino oyunçuları kazino oyunlarına edilən hər mərc üçün pul” “toplaya və 9 səviyyənin hər hansı birinə çata bilər. Əmanətin məbləği nə qədər böyükdürsə, bir u qədər çox sikkələr verilir və müəyyən bir məzənnəyə uyğun olaraq dəyişdirilə bilər. Sikkələr təkcə mərclərdən deyil, həm də gündəlik tapşırıqları yerinə yetirməklə əldə edilir. Saytda qeydiyyatdan keçməklə real pul mərc və ya qumar oyunları ilə məşğul olmaq üçün ziyarətçilərin ən azı 20 yaşı olmalıdır.

Proqramı birbaşa mostbet-az90. com şirkətinin rəsmi saytından yükləməyi tövsiyə edirik. Digər mənbələrdən yükləmə riskli ola bilər, çünki üçüncü tərəf saytları fırıldaqçılardan və ya zərərli proqramlarla proqramların versiyalarını yerləşdirə bilər. Mostbet proqramı müştərilərə saytın mobil versiyasından istifadə ilə müqayisədə təkmilləşdirilmiş təcrübə təqdim etmək üçün nəzərdə tutulub.

Mostbet Müştəri Dəstəyi

Hadisələr və en este momento bölmələr arasında keçid yavaş İnternetlə olsa da, saniyə sürətlə davam edir. İdman bahislərindən və en estos dias slot maşınlarından yalnız müsbət emosiyalar əldə edin. Sistem, donmadan, problemsiz işləyir və serverlərin Avropa və ABŞ-da yerləşməsinə baxmayaraq.

Bu, daha yüksək iş qabiliyyətliliyi, ” “bloklanmanın olmaması və əlavə funksiyalar ilə bağlıdır. Mənfəətsiz mərclərdə böyük məbləğdə pul itirməmək üçün siz total (balların cəmi), handikap (qol fərqi) və ya dəqiq hesabla mərc etməyə çalışmalısınız. Əgər istifadəçi üçün rahatdırsa u qoyuluşları bütün platformalara uyğunlaşdırılmış saytın mobil versiyası vasitəsilə edə bilər.

Nə Üçün Mostbet-dən Tv Oyunlarını Seçməlisiniz

Əgər uduşun ödənilməsi göstərilmiş müddətdən gec həyata keçirsə, oyunçu kömək üçün dəstək xidmətinə müraciət etmək gərəkdir. Mükafatı almaq üçün qeydiyyatdan keçmək və oyun balansını müəyyən məbləğədək doldurmaq lazımdır. Buna misal olaraq universitet voleybol çempionatı və ora Xabarovsk futzal liqasını göstərmək olar. “Toto” bölməsində cari totalizator tirajlarının təqdim olunan siyahısını tapa bilərsiniz. Mostbet bukmeker” “matçların nəticələrinin yanında, mərc əmsalları ilə hesablanan nəticənin faiz ehtimalını göstərir.

İstifadəçilər bonuslardan və promosyon kodlarından faydalanmaq istəsələr promosyonun şərtlərini diqqətlə oxumalıdırlar. Rusiya Federasiyasındakı bir dəniz və qanuni saytda şəxsi hesabın girmə üsulu eynidır. Mobil proqram, idman mərcləri, onlayn kazino oyunları və bonuslar daxil olmaqla, masaüstü saytla eyni funksiyaları və funksionallığı təklif edir. Mostbet Online On line casino həmçinin canlı diler oyunları təklif edir, burada istifadəçilər genuine vaxt rejimində genuine dilerlərlə oynaya bilərlər. Mostbet AZ-91 həmçinin Azərbaycanda istifadəçilər üçün mobil proqram təklif edir.

💰 Depozit Və Ya Pul Çıxarmaq Üçün Hər Hansı Komissiya Varmı?

Aksiya BC saytında qeydiyyatdan keçdiyi tarixdən etibarən 7 gün ərzində etibarlıdır. Com komandası sizə məsuliyyətli oynamağı və həyəcana kor-koranə məğıub olmamağı xatırladır. Qarşılaşmadan əvvəl bütün oyunlar mövcuddur, siz ümumiyyətlə saytda mərc edə bilərsiniz. Yüklədikdən sonra ad, doğum tarixi və ünvan kimi bəzi şəxsi məlumatları təqdim etməlisiniz. Tətbiqlə mərc fəaliyyətlərində iştirak etmək üçün etibarlı ödəniş formanız da olmalıdır.

Kazino dünyasında bu ən populyar qumar növlərindən biridir, ona görə də oynamamısınızsa, mütləq bir dəfə sınayın. Dünyanın hər yerində populyar olan ən klassik onlayn kazino oyunlarından biridir, yəqin” “ki, bu oyunu görmüsünüz. Onların arasında yalnız Azərbaycanda e-manat növü ilə istifadə olunan bank köçürmələrini tapmaq olar. Nümunə olaraq Visa bank kartı vasitəsilə əmanət etmək variantını nəzərdən keçirtdiyimizi təklif edirik. Mostbet az 91 bout conseillé Kuracao-dan beynəlxalq lisenziya əsasında fəaliyyət göstərir.

Bukmeker Kontorunun Mosbet Rəsmi Saytında Necə Qeydiyyatdan Keçmək Olar

Nəticələrin təsadüfi qaydada təyin olunduğu avtomatik mərc üçün seçim də var. İstifadəçilər bukmekerin saytını istənilən brauzerdə aça (yükləyə) bilərlər. Vəsait çıxarışına olan faithful limitlər də, kontorun” “üstünlüyü hesab edilir mostbet azerbaycan qeydiyyat.

Bəli, Mostbet-AZ90 Azərbaycanda tanınan Curacao eGaming beynəlxalq lisenziyası əsasında fəaliyyət göstərir. Mostbet ninety az saytına daxil olun, “Qeydiyyat” düyməsini sıxın, formanı doldurun, e-poçt və telefon nömrənizi təsdiqləyin. Platforma bütün məşhur idman və turnirlər üçün təklər, ekspress mərclər və sistemlər təklif edir. Bəli, sayt qumar asılılığı ilə mübarizə aparmaq üçün yaş yoxlanışı, depozit limitləri və özünü məhdudlaşdırmadan istifadə edir.

Bukmeker Kontorunun Rəsmi Saytına Daxil Olmaq Üsulları

Yaxşı ehtimallar – balompié üçün 2 ilə 5%, digər hadisələr üçün 8% -ə qədər. Hətta qumar himayədarları da onlayn kazino bölməsini qiymətləndirəcəklər. Mostbet-in təkcə kompüter brauzerinizdə yox, həm də Mostbet Mobil Tətbiqində istifadə edə bilərsiniz. Bu, daha yüksək iş qabiliyyətliliyi, bloklanmanın olmaması və əlavə funksiyalar ilə bağlıdır.

Proqram həm Android os, həm də iOS cihazları üçün mövcuddur və Mostbet rəsmi saytından və ahora müvafiq proqram mağazalarından endirilə bilər. Bookmaker kontoru öz müştərilərinə canlı rejimdə balompié, xokkey, basketbol, rugby və kibersport üzrə bahis aviator sport mostbet etməyi təklif edir. Ən xoşagəlməz şey isə gecikmədir ki,” “bu kita sərfəli mərci məhv edə bilər, çünki serverdən cavab almağa nə qədər yaxşı vaxt yoxdur. Qeydiyyat zamanı göstərdiyiniz metoddan asılı olaraq, e-poçt və en este momento telefon nömrəsini yazaraq just one kliklə klubun saytına daxil ola bilərsiniz.

Müştəri Dəstəyi Xidməti

Potensial ödənişinizə və qazanma şansınıza birbaşa təsir edən həm canlı, həm də xətt mərcləri üçün əlverişli əmsallar va. İstəyirsinizsə, bahis formatını da dəyişə və aşağıdakılardan birini seçə bilərsiniz. Futbola, kiberidmana, tennisə və en este momento kriketə mərc etməyinizdən asılı olmayaraq, Mostbet mərcləriniz üçün sizə geniş mərc bazarları seçimi təqdim olunacaq.

Etibarlılıq faktoru de uma Curacao Gaming License-dən aldığımız lisenziyadır. Daha dəqiq desək lisenziya BK-nın sahibi olan Bizbon N. Sixth is v. Rəsmi fəaliyyət – dürüstlüyü və etibarlığı təsdiq edən ikinci göstəricidir. Az tanınmışların” “arasından futzalı, həndbolu, reqbini, kriketi, florbolu göstərmək olar. Oyun hesabını doldurmaq üçün “Artırmaq” sarı düyməsindən istifadə etmək kifayət edir. Proqramlar yalnız şirkətin rəsmi saytından endirilir (iOS üçün App Store-dan).

Kazino Və Idman Mərc Oyunları, Rəsmi Internet Saytına Daxil Olma

Mostbet-az90 şirkəti 2009-cu ildən bukmeker xidmətləri və onlayn kazino bazarında fəaliyyət göstərir. Bu müddət ərzində o, inamla yer qazanıb və bu gün Azərbaycan de uma daxil olmaqla dünyanın 93 regionunda öz xidmətlərini təklif edir. Şirkətin fəaliyyətinin əsasını hər bir müştəriyə münasibətdə etibarlılıq və dürüstlüyə zəmanət verən Curacao lisenziyası təşkil edir. Mostbet ARIZONA 90 saytında qeydiyyat hətta təcrübəsiz İnternet istifadəçiləri üçün də çətinlik yaratmır. Oyunçular həm saytın brauzer versiyası, həm də mobil proqramdan istifadə etməklə qeydiyyatdan keçə bilərlər. Mobil proqram 4 əsas qeydiyyat metodunu təqdim edir, brauzer versiyasında isə əlavə beşinci üsul – təkmil qeydiyyat var.

Mostbet canlı yayım, cash out və mərc artımları kimi mərc təcrübənizi artırmaq üçün bir çox funksiyalar təklif edir. Ancaq ən əsası texniki xidməti bəyəndim, onlar bütün suallarımı saniyələr ərzində cavablandırdılar. Mostbet-i tapdığım üçün şadam, çünki onlar futbolda ən yaxşı əmsallarla geniş çeşiddə bazarlar təklif edirlər. Həmçinin pulsuz olaraq izləyə biləcəyim canlı yayım funksiyasını çox bəyənirəm.

“mostbet-az91: İdman Mərcləri Və Giri

Novomatic müasir onlayn qumar bazarında ən çox axtarılan tərtibatçılardan biridir. Bukmeker hökumət tərəfindən bloklanmaya qarşı mübarizə üsulu kimi sayta arxa girişlər yaradır. Beləliklə, maksimum statusa çatdıqdan sonra pulsuz mərc olaraq 1500 AZN əldə edə bilərsiniz. Üstəlik, üstünlükləri nəzərə alsanız, məlum olur ki, Mostbet bukmeker kontoru öz hobbisi ilə pul qazanmağa başlamaq istəyənlər üçün best seçim olacaq. Ona görə də siz elə indi tərəddüd etmədən sayta daxil olub bonusla qeydiyyatdan keçərək gələcək qələbələr üçün başlanğıc geld əldə edə bilərsiniz. Mən passportumdan istifadə edərək mostbet-90az hesabımı təsdiq etməliyəmmi?

O, sadəcə olaraq uduşlar üçün ciddi məbləği uduşları geri götürmək üçün tələb olunan vaxta vurur. Bu bonusu əldə etməklə siz yaxşı şərtlər və bir çox imkanlar əldə edə bilərsiniz. Mostbet AZ-90 öz saytında müsbət rəylər buraxan çoxlu məmnun müştərilərə malikdir. Müştəri xidməti komandası da mehriban və cavabdeh olduqları üçün təriflənir.

(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; }()); })();