Onlayn Kazino Rəsmi Vebsayt ᐈ Ən Yaxşı Slotlarda Oynayın

“mosbet: Onlayn Kazino Və Idman Mərcləri

Buna görə də sizə kimsə bir oyun məsləhət görübsə, bu kateqoriyaya baxmaq yaxşı fikirdir, çünki burada rahat axtarışla onu tapa biləcəksiniz. Adından da məlum olduğu kimi burada yalnız yeni oyunlar dərc edilir. Bunlar provayderlər tərəfindən buraxılmış və artıq Mostbet kazino saytında yerləşdirilmiş ən yeni oyunlardır. Əlavə olaraq, siz en yeni qumar oyunlarının buraxılışı barədə xəbərlər, eləcə də oyun təcrübənizi daha da yaxşılaşdıracaq xüsusi bonuslar əldə edə bilərsiniz. Bu qumar kateqoriyasında əvvəl oynadığınız bütün oyunları görə bilərsiniz və onları sevimlilərinizə əlavə edə bilərsiniz. Bu kateqoriya xüsusilə ona görə yaradılıb ki, nə vaxtsa oynadığınız sevimli oyunlarınıza hər zaman qayıtmaq üçün çıxışınız olsun.

Bütün bunlar və daha çoxu üçün, xahiş edirik, bizə qoşulun və heyətimizin sizi ən yaxşı şəkildə qəbul etməsinə olanak verin! MOSBET hazırda mövcud olan ən etibarlı bahis və casino biridir. Bizə etibar etmirsinizsə, üçüncü tərəf mənbələrindəki digər istifadəçilərin rəylərinə baxın. İstifadəçilərimizin əksəriyyəti hələ də bizimlə oynayır, saytın bütün sistemini və funksionallığını sevirlər.

Mostbet’də Əmsalların Səviyyəsi

Bu, Mostbet-AZ91-də yoxlama zamanı əlavə çətinliklərin qarşısını alacaq. Qeydiyyatdan sonra ofisdəki bütün mövcud variantlardan istifadə edə bilərəm. Hər bir electronic oyunun oyunçularının adları, turnirləri və matçları real həyatdakı tərəf müqabillərini əks etdirir.

“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ı de uma qəbul edirlər. Onlayn qumar oyunlarını sevən hər kəsə Mostbet-i tövsiyə edərdim mostbet.

Əsl Qumar Oyunçularının Rəyləri

Hadisələr və ya bölmələr arasında keçid yavaş İnternetlə olsa da, saniyə sürətlə davam edir. İdman bahislərindən və en este momento 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.

Mostbet onlayn kazinoları istəsəniz anonim oynamağa olanak verir. Siz ləqəb seçə və şəxsi məlumatlarınızı açıqlamaya bilərsiniz. Mostbet onlayn kazinoda siz hər zövqə uyğun mərclər tapa bilərsiniz.

Mostbet Kazino Oyunları Seçimləri

Mostbet-AZ91-də siz yalnız bir bonusdan istifadə edə bilərsiniz – bukmeker və ya onlayn kazino üçün. Yaxşı ehtimallar – balompié üçün two 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 bukmeker matçların nəticələrinin yanında, mərc əmsalları ilə hesablanan nəticənin faiz ehtimalını göstərir. Bu, daha yüksək iş qabiliyyətliliyi, bloklanmanın olmaması və əlavə funksiyalar ilə bağlıdır. Mən xüsusilə onların canlı mərc funksiyasını bəyənirəm, burada hadisələr baş verən kimi mərc edə bilərəm.

Mobil proqram four əsas qeydiyyat” “metodunu təqdim edir, brauzer versiyasında isə əlavə beşinci üsul – təkmil qeydiyyat va. Tıxanmalar, texniki problemlər və ahora digər səbəblər giriş üçün müəyyən maneələr yaradır. Güzgülərdən istifadə edərək hər bir oyunçu xarici amillərdən asılı olmayaraq oyun təcrübəsinin mümkün qədər rahat və fasiləsiz olacağına əmin landa bilər. Mostbet 90 AZ mərc prosesini mümkün qədər sadə və aydın etmək üçün mümkün olan hər şeyi edir. Saytın intuitiv interfeysi müxtəlif növ idman mərclərinə tez və asan çıxışı təmin edir. Söhbət hazırkı forma, üzbəüz qarşıdurmalar və komandaların meydandakı çıxışına təsir edə biləcək digər göstəricilərin öyrənilməsindən gedir mostbet yukle.

Mostbet Tərəfdaş Tətbiq

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 complete (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.

Siz Mostbet Casino-da actual kazino təcrübəsi tapa bilərsiniz – bu məkan” “sizin üçündür. Peşəkar təlim keçmiş dilerlər və real oyun tərzi sayəsində Azərbaycanda Mostbet-in canlı kazino oyunları maraqlı və əyləncəli oyun prosesi təqdim edəcək. Siz blekcek və bakkara, ruletka və poker ilə başlaya bilərsiniz – hər kəs özünə uyğun olanı tapacaq.

Mostbet Casino (mostbet)

Siz həmçinin aşağıdan birbaşa promo kodu daxil edə və əmsallardakı bütün dəyişiklikləri qəbul etmək keçidini yandıra və ya söndürə bilərsiniz. Mostbet kazinosu e-oyunlar sənayesində fəal olan 150+ ən nüfuzlu oyun tərtibatçıları tərəfindən təmin edilən 3500+ onlayn kazino oyununa ev sahibliyi edir. Lobbi asanlıqla idarə olunur və oyunların qruplaşdırıldığı bir neçə kateqoriya varifr?n. Bunların hər birində qumarbazlara axtardıqları dəqiq oyunu tapmağa olanak verən bir neçə alt kateqoriya varifr?n.

İdman mərc oyunlarından və ya kazino oyunlarından sabit gəlir əldə etmək üçün etibarlı bukmeker kontoru seçmək lazımdır. Mostbet 90 arizona ( az ) bukmeker kontoru ilə əməkdaşlıqdan narahat olmağa əsas yoxdur. Bu şirkət çoxdan öz dəyərini sübut etdi və lisenziyanın mövcudluğunu təsdiqləyən əla reputasiya qazandı. Bu sənəd Curacao-da tənzimləyici tərəfindən verilmişdir və Most bet bütün dünyada idman mərc oyunları və qumar xidmətləri təqdim edir.

Mostbet Az-da Ödəniş Üsulları

Cəhdlərin sayı məhdudlaşdırılmır və hər girişdə virtual balans yenilənir. Və bütün yeni oyunçulara added bonus olaraq 550 manat və 250 no cost spin elavə edirlər. Kompüterlərə etibar etməyirsiniz və əminsinizki proqram təminatının konfiqurasiyası müştərinin həmişə uduzması üçün qurulub? Əsl uğuru Live-kazinoda canlı liderlərlə (Live-games bölməsi, Live-kazino) Mostbet Casino’ de uma sınayın. Croupier’in işini müşahidə edə biləcəyiniz yüzlərlə otağı seçə və digər oyunçularla söhbət edə bilərsiniz. Ənənəvi oyunlar siyahısında (rulet, blackjack, poker), lotereya, monopoliya, sümüklər.

Azərbaycanda Mostbet ninety yerli MMA döyüşçüsü Nəriman Abbasovla əməkdaşlıq edir. Saytın və tətbiqlərin interfeysi və dizaynı oxşardır və funksionallıq baxımından bütün qabıqlar bir-birindən heç bir şəkildə aşağı deyil. İstifadəçi vəziyyətə uyğun olaraq ən rahat və əlçatan olanı açaraq özü üçün ən əlverişli platformanı seçə və ya hamısından istifadə edə bilər. Həmçinin cərgədə idman növlərinə görə hadisələri seçmək üçün rahat bir hökmdar, yaşamağa sürətli keçid üçün düymə var. 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.

Mostbet Azərbaycanda Onlayn Kazino

Bu, oyunçular üçün yeni bir şey sınamaq və hansı oyunları daha çox bəyəndiklərini tapmaq üçün əla fürsətdir. Bundan əlavə, onlayn kazinolar pulsuz oyun demoları təklif edir ki, oyunçular pul itirmək riski olmadan qaydaları və strategiyaları öyrənə bilsinlər. İkincisi, Mostbet onlayn kazino səxavətli bonuslar və promosyonlar təklif edir.

Əlavə faylları yükləmək və quraşdırmaq istəmədiyiniz halda, hər zaman mobil brauzer versiyasına daxil ola və istənilən yerdən proqnozlarınızı verə bilərsiniz. Azərbaycanda Android os smartfonunuz vasitəsilə oynamaq üçün bu addımları yerinə yetirin. Yolda olarkən iPhone və ya iPad vasitəsilə mərc etmək və ya qumar oynamaq” “üçün aşağıda göstərilən addımları yerinə yetirin. Brauzer versiyası əlavə proqram yükləmədən və ya quraşdırmadan istənilən yerdən oynamaq üçün alternativ seçimdir. O, əl cihazlarında istifadə üçün optimallaşdırılıb və bütün funksiyalar mövcuddur və mövcuddur.

Mobil Proqramı Necə Yükləmək Olar

Müvafiq pəncərəyə lazım olan promo kodu daxil edin, sonra onu «yoxlamaq» düyməsi vasitəsilə aktivləşdirin. Əgər promotion kod etibarlıdırsa, qeydiyyatdan keçərkən hesabınıza bonuslar alacaqsınız. Kodu daxil etdikdən sonra saytda icazə alacaqsınız və sizin üçün şəxsi hesab yaradılacaqdır. Bookmaker’in əsas səhifəsinə keçərək, virtual açarı «qeydiyyatdan keçin» düyməsinə basaraq aktivləşdirin. E-poçt vasitəsilə qeydiyyatdan keçmək varianrını seçərək, «növbəti» düyməsini basın.

Risk almaq istəmirsinizsə, mövcud şərtlərə görə dərəcəni hesablaya və ümumi qazancınızı izləyə bilərsiniz. Bookmaker’in xəttində həvəskarlar arasında aşağı diviziolar və müsabiqələr belə tapa bilərsiniz. Öz ölkənizi seçə bilərsiz (menyuda idman növləri siyahısıın üzərində “Ставь на своих”) beləliklə onun birinciliyi ilk olaraq göstəriləcək. Sadəcə xətti diqqətlə nəzərdən keçirərək, dərhal aşkar üstünlükləri tapa bilərsiniz. Hətta həvəskarlar arsında aşağı diviziolar və müsabiqələr belə va. Mostbet’s signature istifadəçilərini xoş bir şəkildə təəccübləndirir.

👍 Mostbet Az-90 Təhlükəsiz Və Etibarlı Mərc Saytıdır?

Mostbet Kazino -da qeydiyyatdan keçmiş qumarbaz kimi qarşılaşacağınız bir çox üstünlüklər, o cümlədən aşağıdakılar var. Mostbet AZ Kazino öz istifadəçilərinə təhlükəsiz” “və etibarlı oyun təcrübəsi təqdim etməyə həsr olunub. Kazino oyunçuların pullarını və şəxsi məlumatlarını qorumaq üçün ən müasir təhlükəsizlik tədbirlərindən istifadə edir. 128-bit SSL şifrələməsindən istifadə edərək, oyunçunun kompüteri və ya telefonu və Mostbet serverləri arasında göndərilən bütün məlumatlar şifrələnir. Nəticədə oyunçuların məlumatları qeyri-qanuni girişdən qorunur. AZ qumarbazları actual pul yatırmazdan əvvəl nümayişi rejimi vasitəsilə Mostbet kazino oyunlarını oynamağı seçə bilərlər.

N və onlar Azərbaycan manatı ilə yanaşı digər valyutaları de uma qəbul edirlər. İstədiyiniz məbləği daxil edin və onu yerləşdirmək üçün mərcinizi təsdiqləyin. Mostbet-AZ91 Azərbaycandakı istifadəçilərə platformalarında qüsursuz və qənaətbəxş təcrübə təmin” “etmək üçün müştəri dəstəyi təqdim edir.

Mostbet-az45 Saytının Bütün Yeni Istifadəçiləri Üçün Qeydiyyat Üçün Mostbet-dən Eksklüziv Xoş Gəlmisiniz Bonusu

Bu addımlar tamamlandıqdan sonra mərciniz dərhal qəbul ediləcək. Matç bitdikdən dərhal sonra isə mərcin qazancınızı mərc hesabınızda əldə edəcəksiniz, buradan onu çıxara, yaxud da en yeni mərclər qoymaqda istifadə edə bilərsiniz. 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ə en este momento 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.

Bookmaker’ə (bahisçiyə) daxil olmaq üçün seçilmiş sosial şəbəkədən giriş və şifrəni daxil etməlisiniz. Qeydiyyat forması sosial şəbəkədən məlumat daxil olduqdan sonra avtomatik olaraq doldurulacaq və siz qeydiyyatdan keçəcəksiniz. Ayrıca, pulunzu öncə lazımlı valyutanı və pul köçürməsini seçərək, Mostbet hesabından geri ala bilərsiz. Mostbet, Azərbaycandan istifadəçilər üçün, onlarla provayder və minlərlə oyun avtomatları siyahısında ən böyük onlayn kazinolardan biridir. Burada yorucu işlərdən istirahət edə bilərsiniz və pul xərcləmək mütləq deyil.

Mostbet Az Üstünlükləri

Bukmeker kontoru qeydiyyatdan keçdikdən sonra oyunçuların hesablarını yoxlamır. Onlar həmçinin əsas sayt həddən artıq yükləndikdə və ya texniki xidmət altında olduqda faydalıdır. Onların seçmək üçün çoxlu idman və kazino oyunları var və onların ödənişləri sürətli və ədalətli olur. Onların pul yatırmaq və çıxarmaq üçün çoxlu variantları varifr?

Buraya slotlarda pulsuz fırlanmalar, əlavə depozit bonusları və hətta böyük pul mükafatları olan lotereyalar daxil onda bilər. Bonuslar oyunçulara balanslarını artırmağa və qazanmaq şanslarını artırmağa imkan verir ki, bu da Mostbet onlayn kazinolarını daha da cəlbedici edir. Üçüncüsü, Mostbet-in onlayn kazinosunda oynamaq rahat və əlverişlidir. Siz evinizin rahatlığında həyəcandan həzz ala bilərsiniz və kazinonun iş saatlarından asılı olmayaraq. Bir çox oyun platformaları həmçinin mobil proqramlar təklif edir ki, siz internetə çıxışı olan istənilən yerdə, istədiyiniz zaman oynaya biləsiniz.

Mostbet Onlayn Kazino

Mostbet ARIZONA şirkəti hər kəsə idmana mərc etmək imkanı təqdim etmək seqmentində ilk sıraları tutur. Bu yalnız qumar oyunları ilə bağlı yerli qanunvericilik rahatlandıqdan sonra baş verəcəkdir. Yalnız oyunçuları deyil, həm də tərəfdaşları heyran edən yaradıcı həlləri sayəsində şirkət ən originell tərtibatçılar sırasındadır. 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.

Azərbaycanda MOSTBET Casino-nun rəsmi versiyasına xoş gəlmisiniz – bütün dünyada minlərlə oyunçunun etibarını qazanmış aparıcı onlayn kazinoya. Geniş oyun seçimi. MOSTBET Online casino Azərbaycan sizə ən yaxşı” “dünya provayderlərindən zəngin oyun seçimi təqdim edir. Slotlar, ruletka, black jack və poker – bütün bunlar və daha çoxu sizin əyləncəniz üçün əlçatandır. Səxavətli bonuslar. İlk depozitinizə görə qarşılama bonusu və müntəzəm promoaksiyalar sizi gözləyir. Dəyərli oyunçularımız, MOSBET Casino Azərbaycana qoşulmaq üçün tam vaxtıdır!

Mən Real Pul Olmadan Oyunları Oynaya Bilərəmmi?

Şirkət müştərilərinin məlumatlarının təhlükəsizliyini təmin etmək üçün bütün lazımi tədbirləri görür. O, təhlükəsizliyə ciddi yanaşır və müştərilərin daxil etdiyi bütün şəxsi məlumatları qorumaq üçün SSL şifrələməsindən istifadə edir. Proqramını mobil telefona yükləmək və qeydiyyat məlumatlarını daxil etmək də mümkündür. Əvvəlcə şəxsi hesabınızda qeydiyyatdan” “keçməli və hesabınızı doldurmalısınız.

Telefonunuzda brauzer vasitəsilə işə salınan o, veb-sayt funksiyalarının bütün dəstini ehtiva edir. Lakin o, proqramlardan daha yavaş işləyir və barmaq izi ilə giriş ilə trafikə qənaət etmir. Etibarlılığı, əlverişli şərtləri, xidmət funksionallığını və bonus proqramını nəzərə alaraq, platformada qeydiyyatdan keçməyə elə indidən davam etməyinizi tövsiyə edirik! Bəli, bukmeker kontoru Kurakao hökumətinin verdiyi lisenziya əsasında fəaliyyət göstərir

Azərbaycanda Mostbet Də Mərc Etmək Üçün Mövcud Idman Növləri

MOSBET ən etibarlı casino və bahis saytlarından biridir, bütün bahisləriniz qorunur, yox ola və en este momento yox ola bilməz. Saytla bağlı hər hansı bir probleminiz varsa, texniki dəstək xidmətinə müraciət edə bilərsiniz, işçilər sualınızı tez bir zamanda həll etməyə kömək edəcəklər. Etibarlılıq faktoru da Curacao Gambling License-dən aldığımız lisenziyadır.

Tez-tez verilən suallar, “Dostları dəvət et” sahəsi, texniki dəstək ilə əlaqə saxlamaq üçün bir düymə də var. Mostbet şirkəti yeni başlayanları hərarətlə qarşılayır və ilk depozitə 125% verir. Bonus almaq üçün saytda qeydiyyatdan keçmək, hesabınıza daxil olmaq, hesabınıza ən azı 2 avro köçürmək lazımdır. Çıxarmaq üçün hesabınızı aktivləşdirdiyiniz andan etibarən həftədə ən azı 40 dəfə bonusu mərc etməlisiniz.

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