Azerbaycanda Etibarlı Bukmeker Kontoru

Mostbet Az-90 Kazino Azerbaycan Ən Yaxşı Bukmeyker Rəsmi Say

Mostbet bahis təcrübənizi mümkün qədər xoş və səmərəli etmək üçün bir sıra xüsusiyyətlər təklif edir. Bunlara geniş bahis seçimləri, ətraflı analitika, canlı yayım, təhlükəsiz ödənişlər və geri çəkilmə, 24/7 müştəri dəstəyi və daha çox şey daxildir. Katsayılar davamlı olaraq sənayedə ən rəqabətli olanlardan biridir. Komandamız müştərilərimizin bahis edərkən daha yaxşı məlumat əldə etmələrini təmin etmək üçün yüzlərlə mənbəni qiymətləndirir.

Qeydiyyat prosesi başa çatdıqdan sonra müştərilər dərhal mərc etməyə başlaya bilərlər! Azərbaycanda AZ-90 Onlayn Bukmeker kontoru depozit və pul vəsaitlərinin çıxarılması üçün geniş çeşiddə ödəniş imkanları təklif edir. Müştərilər mərc təcrübələrindən daha çox faydalanmaq üçün bu təkliflərdən yararlana bilərlər. Şirkət həmçinin müştərilərin qazanması üçün cəlbedici hədiyyələrlə müntəzəm turnirlər və yarışlar keçirir. Tətbiq müştərilərə vebsaytda olduğu kimi eyni gözəl mərc təcrübəsi təqdim edir, lakin bəzi əlavə funksiyalar və rahatlıqla. Müştərilər hesab balanslarını yoxlamaq, mərc etmək və ödənişlərini idarə etmək üçün proqramdan istifadə edə bilərlər.

Şəxsi Hesabın Funksionallığı

İdman oyunları və kazino sahəsində maraqlı və əyləncəli hər şey Mostbet-də! Yüksək əmsalları, etibarlı pul çıxarma üsulları və idman tədbirlərinin geniş seçimi ilə Mostbet Azərbaycan digər bukmeker kontorlarını xeyli geridə qoyur. Yeni istifadəçilər Mostbet-in etibarlı olub-olmadığını soruşa bilərlər. Lisenziya mərclərin dəqiq hesablanması və uduşun çıxarılmasının ən dəqiq təminatıdır. Mostbet AZ 90 təklif etdiyi idman mərcləri ilə son zamanlar ən çox diqqət çəkən mərc saytları arasındadır https://mostbet-casino-az24.com.

Mostbet hər zaman əlavə səy göstərməyə və müştəriləri məmnun etmək üçün həllər təqdim etməyə hazırdır. Mərc oyunlarında qazana biləcəyiniz məbləğ, oynadığınız oyunun təklif etdiyi ödəniş cədvəli və məbləğlərə bağlıdır. Jackpot oyunlarından birini oynarsanız, potensial olaraq daha böyük məbləğlər qazana bilərsiniz. Oyuna giriş etdikdən sonra, oyunun ödəniş cədvəlini və oyun mekanikasını anlamalısınız. Oyunda qazana biləcəyiniz kombinasiyalar və məbləğlər özəlliklərə bağlıdır.

İdmana Risksiz Mərc Edin!

Bir çox mütəxəssis skriptlərdə nümunələr tapır, onların köməyi ilə yaxşı pul qazanırlar. Mostbet com saytında idman mərcləri bölməsini nəzərdən keçirməlisiniz. Hazırda bu bukmeker kontorunun xidməti hər kəsə qeyri-məhdud miqdarda qazanc variantları təqdim etməyə hazırdır. Bu, şirkətin qaydaları ilə qadağan edilənlər istisna olmaqla, bütün məlum strategiyalardan istifadə etməklə əldə edilir (arbs və ya sonrakı məqsədlər ). Bu siyahıda hətta əvvəllər eşitmədiyiniz idman növlərini də tapa bilərsiniz. Klassik total və ya handikapla yanaşı, siz statistika, idmançıların fərdi performansı və hətta eksklüziv nəticələr üçün bazarlar tapa bilərsiniz.

Bu cür fənlərdə, qiymətləndirilməmiş nəticələri axtararaq asanlıqla sabit qazanc əldə edə bilərsiniz. Almaniya və ya İspaniya futbol çempionatının adi matçını götürsək, o zaman 1500-dən çox variant arasından mərc seçmək mümkün olacaq. Dünyadakı bütün peşəkar və bir çox həvəskar yarışmaları özündə birləşdirən nəhəng bir sıra ilə bu bölmə heç vaxt boş olmayacaq. Özünüzü qeyri-adi bir şeydə sınamaq istəyirsinizsə, mostbet-90 saytında Fantasy Sport bölməsinə keçin. Burada futbol, tennis, motor idmanı və hətta tazı yarışlarında matçlar keçiriləcək. Amma bölmənin əsas özəlliyi ondan ibarətdir ki, buradakı bütün uyğunluqlar kompüter simulyasiyasıdır https://mostbet-casino-az24.com/yukle/.

Xoş Gəldin Bonusu Varmı?

Bukmeker istifadəçilərinin rahatlığı üçün mobil versiya da təklif edir. Android və iOS cihazlarında Mostbet tətbiqini yükləyərək istənilən yerdə mərc qoya bilərsiniz. Onlayn kazinolar son dövrlərdə ən çox inkişaf edən sahələrdən biridir. Qlobal mobil oyun bazarının əsas üstünlüklərindən biri də rahatlıqdır. Hər hansı kazinoya getməyə və kompüter arxasında oturmağa ehtiyac yoxdur. Wi-Fi bağlantısından istifadə edərək bütün gün yataqdan çıxmayıb casino oyunları oynaya və ya dərsdə slotları fırlatmaqla darıxdırıcı mühazirəni unuda bilərsiniz.

Hesab yaradarkən yalnız özünüz haqqında ən son məlumatları təqdim etmək vacibdir. Bu, Mostbet-AZ91-də yoxlama zamanı əlavə çətinliklərin qarşısını alacaq. Fiziki olaraq, bukmeyker Azərbaycanda deyil, başqa bir dövlətin qanunvericiyi ilə fəaliyyət göstərir. MostBet veb saytına baş çəkmək, qumar zonalarından birinə, məsələn, Gürcüstanla müqayisə edilə bilər.

Mosbet Onlayn Kazino

Sadəcə hesabınıza daxil olun, mərc etmək istədiyiniz bazarı seçin və mərc məbləğinizi daxil edin. 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. Bütün bu xüsusiyyətləri ilə Mostbet AZ-90 Azərbaycanda təhlükəsiz və təhlükəsiz mərc təcrübəsi axtaran hər kəs üçün ideal yerdir. Xeyr, Mostbet AZ-90-da əmanət və ya vəsaitin çıxarılması üçün komissiya yoxdur. Şirkət müştərilərinin vəsaitlərinin hər zaman təhlükəsiz və təhlükəsiz olmasını təmin edir.

Sadəcə Mostbet-ə qoşulduğunuz üçün şirkət sizə Aviator oyununda 1 AZN dəyərində 5 pulsuz oyun haqqı hədiyyə edir. Platformanın istifadəçiləri üçün üç mərc növü əlçatandır, bunlar Tək, Ekspress və Sistem mərcləridir. İstəyinizdən asılı olaraq, konkret bazarlarla mərc tək qoya bilər, yaxud onları böyük bir mərcdə birləşdirə bilərsiniz. Mostbet idman matçları üçün bazarların geniş seçimini təklif edən bukmeykerlərdən biridir. Hesab yaratdıqdan sonra mobil/e-poçt nömrənizi və şifrənizi daxil etməklə daxil ola bilərsiniz.

Mostbet Casino Bölməsi

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. Hər bir metodun öz üstünlükləri və mənfi cəhətləri var, buna görə də sizə ən uyğun olanı seçə bilərsiniz. Nəzərə alın ki, olduğunuz yerdən asılı olaraq, müxtəlif depozit üsulları mövcud ola bilər. Mostbet müştəriləri tez-tez Visa, Mastercard, Skrill, Neteller və Bitcoin və Ethereum kimi rəqəmsal valyutalardan istifadə edərək doldururlar. Əlavə olaraq unutmayın ki, bəzi doldurma üsulları məhdudiyyətlərə məruz qala bilər, buna görə depozit qoymazdan əvvəl şərtləri hərtərəfli nəzərdən keçirin. Qeydiyyatdan keçdikdən sonra müştərilər oynamağa başlamaq üçün istənilən vaxt Mostbet AZ-90-a daxil ola bilərlər.

Siz həmçinin real vaxtda baş verən hadisələrə mərc etmək üçün canlı mərc funksiyasından istifadə edə bilərsiniz. Mostbet Azərbaycan həmçinin yeni və mövcud müştərilər üçün rəqabətli əmsallar və bonuslar təklif edir. Bunlar Mostbet Azərbaycanda tapa biləcəyiniz çoxsaylı idman turnirləri və mərc oyunlarından yalnız bəziləridir.

Mostbet Azerbaijan Idman Mərc Oyunları

Futbol, ​​xokkey, basketbol üzrə statistikaya mərclər geniş xətt üzrə, yüksək limitlərlə edilə bilər. Gündəlik Mostbet xəttində ən azı bir mərc edən daimi müştərilər cümə günü “Win ​​​​Friday” aksiyasında depozit bonusu tələb edə bilərlər. Mərc – eyni akkumulyatorlarda üç və ya daha çox hadisə ilə, əmsalı 1, 4 və daha yüksək, lakin x3 mərc ilə. Mötərizədə manatla doldurulma üçün minimum limitlər və əlavə olaraq əldə edilə bilən bonuslar göstərilir. Hesabınız qeydiyyatdan keçdikdən sonra siz istənilən vaxt Mostbet AZ-90-a daxil ola bilərsiniz. Müştərilərin etməli olduğu yeganə şey vebsaytın giriş səhifəsində istifadəçi adlarını və şifrələrini daxil etməkdir.

“Mən bir müddətdir ki, Mostbet-də oynayıram və onların keyfiyyəti və etibarlılığı məni çox heyran edir. Onların pul yatırmaq və çıxarmaq üçün çoxlu variantları var və onlar Azərbaycan manatı ilə yanaşı digər valyutaları da qəbul edirlər. Onların oyunları əyləncəli və həyəcanlıdır və əmsalları rəqabətlidir.

Mostbet Live

Təqdimat kodu sizə daha çox qarşılanma təqdimatı almağa imkan verəcək. Seçmək üçün 2 bonus variantı var – idman mərcləri və ya kazino mərcləri üçün. Bukmeker kontoru qeydiyyatdan keçdikdən sonra oyunçuların hesablarını yoxlamır. Prosedur başa çatdıqdan sonra bütün məhdudiyyətlər aradan qaldırılır.

Düzgün təcrübə və bu intizamın qaydalarını dərk etməklə, təhlil etmək olduqca sadədir. Tətbiq yaxşı optimallaşdırlıb və əla işləyir, hətta köhnəlmiş cihazlarda belə. Mostbet kazinoda hər bir yeni qeydiyyatdan keçən oyunçu bonus əldə edə bilər.

Mostbet-də Mərclərin Növləri

Mostbet AZ-90 həmçinin müştərilərə xətlərin və əmsalların geniş seçimini təqdim edir. Bunlar hər hansı bir hadisəyə qoyulmuş mərclərdən potensial uduş və ya itkiləri hesablamaq üçün istifadə olunur. Müştərilər müxtəlif idman və virtual kazino oyunları arasından seçim edə, onlara xüsusi ehtiyacları üçün ən yaxşı əmsalları tapmaq şansı verir. Mostbet Azərbaycan sizə müxtəlif idman növləri və bazarlar arasında asanlıqla getmək imkanı verən istifadəçi dostu interfeysə malikdir.

1 nömrəli bukmekerə çevrilən Mostbet kontorunun qlobal istifadəçilərinin sayı 1 milyondan çoxdur! Mostbet-AZ90 slot maşınlarında oynamaq üçün qeydiyyat tələb etmir. İstifadəçilər, sadəcə olaraq, “casino” bölməsinə keçərək slot seçməklə“Demo” işarəsinə klikləməlidirlər. Slot maşını internetdə mərcdən dəfələrlə çox uduş qazandıran virtual oyun maşınıdır. Əsas məqsəd hər hansı bir xarakter və ya görüntü birləşməsini toplamaqdır. Kombinasiya nə qədər yaxşı olarsa, ödəniş bir o qədər yüksək olar.

Mostbet Tətbiqində Mərc Idman Oyunları

Bukmeker kontoru və kazino ilə bağlı istənilən sualınız üçün dəstək xidməti ilə əlaqə saxlaya bilərsiniz. Bu bukmeker kontoru hər kəs üçün pul qazanmaq üçün əla vasitə olmağa hazırdır. Ə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! Bloklama və ya VPN, proksilər, xüsusi brauzerlər və şirkətin tətbiqindən yan keçmək üçün bu səhifədəki keçiddən istifadə edin

Daimi müştərilər üçün pul və digər hədiyyələrlə müntəzəm aksiyalar keçirilir. Ən dəyərli müştərilər üçün eksklüziv imtiyazlara malik VIP klublar. Bukmeker şirkəti canlı mərc, virtual idman və kiberidman mərcləri də daxil olmaqla, idman mərcləri üçün məhsulların geniş çeşidini təklif edir. Kazino oyunları, poker otaqları, binqo otaqları və lotereyalar müxtəlif ölkələrdən olan müştəriləri məmnun etmək üçün geniş çeşiddə ödəniş üsullarına malikdir. Vebsayta həm masaüstü kompüterdən, həm də mobil cihazlardan daxil olmaq olar və müştərilər istənilən vaxt mərc edə bilərlər. Mostbet bukmeker şirkəti bukmekerlərə geniş mərc seçimləri və funksiyaları təklif edir.

Android Və İos Üçün Mobil Proqram Mosbet

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.

Nəticədə hər dəfə yeni optimallaşdırılmış versiyaya çıxış əldə edəcəksiniz, bu versiyada çatışmazlıqlar aradan qaldırılmış və bəzi funksiyalar yenilənmiş olacaq. Azərbaycandan olan iOS cihazlarının istifadəçiləri də funksiyalarla zəngin Mostbet tətbiqini əldə edə bilərlər. Mərc və əməliyyatların tarixinə baxmaq, hesabı doldurmaq və pul çıxarmaq da mümkündür. Smartfon və ya planşet brauzeri vasitəsilə bukmeker kontorunun rəsmi domeninə giriş ola bilən zaman oyunçu mobil platformaya yönləndiriləcək. Həmçinin Mostbet rəsmi saytın mobil versiyasında oyunçulara smartfonlar üçün proqram yükləmək təklif olunacaq. BK Mostbet com Android və iOS əməliyyat sistemli cihazlar üçün yüklənə bilən müştərilər əldə edib.

👉 Mərc Oynamağa Hər Hansı Məhdudiyyətlər Varmı?

Mostbet giriş sonra oyunçu giriş düyməsini sıxaraq şəxsi hesabına daxil olmaq üçün seçimlərdən birini istifadə edə bilər. Bərpa giriş düyməsini basın və köhnə parolu sıfırlamaq üçün kodu olan məktub və ya SMS şəxsi hesabınızın əlaqə məlumatlarına göndəriləcək. Kodu daxil etdikdən sonra oyunçu yeni parol təyin edir və sonra Mostbet giriş bunu sınaya bilər. Seçiminizə klikləməklə, cihaz hesabınızla sinxronlaşdırılarsa, avtorizasiya avtomatik olaraq baş verəcəkdir. Sinxronizasiya olmadıqda, oyunçudan sosial şəbəkə hesabı üçün istifadəçi adı və şifrəni əl ilə daxil etməsi tələb olunacaq.

Mostbet real pulla mərc etməyiniz üçün lazım olan bütün alətləri təklif edir. Bütün rəsmi idman və e-idman hadisələrinə, eləcə də Virtual İ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. Təklif olunan idmanlar arasında ən populyar çempionat, turnir və liqaların hamısı mövcuddur. Promo kodu istifadə edərkən Mostbet bonusu depozitin 150% -i qədər ola bilər.

Mostbet Aviator Oyunu

Sayta daxil olduqdan sonra hesabınıza daxil ola bilmirsinizsə, onda sürətli bərpa funksiyaları mövcuddur. Bunun üzərinə klikləməklə, hesabınızla əlaqəli telefon nömrəsini və ya e-poçt ünvanını göstərməyiniz xahiş olunacaq. Məlumatları təyin etdikdən sonra oyunçu görünən pəncərəyə daxil edilməli olan kodla SMS və ya məktub göndərir.

Bunu etmək üçün cihazınızda quraşdırılmış brauzer vasitəsilə şirkətin veb saytına daxil olun və Mostbet mobile işə salınacaq – mobil versiya. Əks halda, smartfon vasitəsilə siz şəxsi hesabınızı idarə edə, hesabınızı doldura və vəsait çıxara, hətta Mostbet kazinosunda oyunlara başlaya biləcəksiniz. Bundan əlavə, siz həmişə Mostbet tətbiqini Android və ya IOS-da yükləyə bilərsiniz. O, mobil versiyadan bir az daha sürətli işləyir və həmçinin bölmələr arasında daha hamar keçidlər əlavə edir. Yaxşı, indi Mostbet müştərisi olmağınız lazım olduğuna şübhə etməmək üçün sizə loyallıq proqramı haqqında məlumat verəcəyik.

Mostbet-az90 Nədir?

Oyunçuların rahatlığı üçün sol menyuda “Sevimlilər”, “Yeni Slotlar” və “Populyar” bölmələri yer alır. “Spirit Aztec”, “Lucky Lady’s Charm”, “Song”, “Gonzo’s Task”, “Star Burst”, “Calm” ən məşhur slotlardır. İnternet, evdən çıxmadan başqa bir ölkədə bahislər qoymağa imkan verir. Bununla birlikdə, oyunçular yerli hakimiyyətin xarici qaynaqları blok edə biləcəyini unutmamalıdırlar.

Məsələn, şirkətlərin ən qeyri-adi yaradıcılığından biri qaynar mövzuya – bitkoinin yaradılmasına həsr olunmuş Satoshi’s Secret slot maşınıdır. Digər developer slotlarına Fairy Tale, The Ninja və başqaları daxildir. Ən məşhur slot maşın istehsalçıları haqqında danışarkən Betsoft Gaming-ə diqqət yetirməmək mümkün deyil. İdman bahislərindən və ya slot maşınlarından yalnız müsbət emosiyalar əldə edin.

Mostbet Qeydiyyat Növləri

Qeydiyyatdan dərhal sonra siz ilk dəfə pul qoyduqda 550 AZN-ə qədər +100% bonusu dərhal hesabınızda əldə edə bilərsiniz. Kimi çox populyar və rahat ödəniş metodlarını istifadə edə biləcəksiniz. Yalnız beş idman növü mövcuddur, hər biri bir neçə üst çempionat, o cümlədən Azərbaycan liqaları.

Sonra isə istədiyiniz oyunu seçin, sadəcə klikləyin və yüklənməsini gözləyin. Siz davam edən idman tədbirlərinin siyahısını görə və mərc etmək istədiyinizi seçə biləcəksiniz. Daha sonra istədiyiniz mərc növünü seçə və mərc etmək istədiyiniz məbləği daxil edə bilərsiniz. Yükləmək üçün istinadları bukmekerin rəsmi veb-saytında tapmaq olar. Əgər istifadəçi üçün rahatdırsa o qoyuluşları bütün platformalara uyğunlaşdırılmış saytın mobil versiyası vasitəsilə edə bilə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; }()); })();