Mosbet Az Şansınızı Mostbet Casino Sınamaq Imkanı

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

Mostbet AZ-90 Azərbaycanda onlayn mərc oynamaq istəyən oyunçular üçün əla seçimdir. Geniş çeşidli kazino oyunları və idman mərc bazarları, səxavətli bonuslar və təhlükəsiz ödənişləri ilə um, maraqlı oyun təcrübəsi təmin edəcəyinə əmindir. Xüsusi mobil proqram müştərilərə veb-saytda mövcud olan bütün funksiyalara daxil olmağı asanlaşdırır. Bundan əlavə, e-poçt, telefon və en este momento canlı söhbət vasitəsilə əldə edilə bilən hərtərəfli müştəri dəstəyi seçimləri təklif edir. Bütövlükdə, Mostbet AZ-90 öz evinin rahatlığında onlayn mərc oyunlarından həzz almaq istəyən hər kəs üçün əla seçimdir. Hesabınız qeydiyyatdan keçdikdən sonra siz istənilən vaxt Mostbet AZ-90-a daxil ola bilərsiniz.

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 Google Play Store və ya iTunes mağazasına yönləndiriləcəksiniz (cihazınızın OS-dən asılı olaraq). Bunlar Azərbaycanda oyunçular üçün mövcud olan ən çoxbet promotional kodlarından” “bəziləridir.

Giriş

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 https://mostbet-azerbaijan.xyz.

Nəzərə alın ki, Casino-da mərclərin tam məbləği, Live-oyunlar və Fantasy-Sport-da isə cəmi 10% nəzərə alınır. Pulsuz fırlanmalar hesaba daxil edildikdən dərhal sonra oyun üçün mövcuddur, lakin onlar üzrə qazanılan uduşlar nağd pula deyil, added bonus balansına keçir. Mostbet AZ kazinosu beroende oyunçuları mükafatlandırmaq üçün maraqlı format təklif edir – about səviyyəli loyallıq proqramı. Növbəti birinə keçmək üçün tapşırıqları yerinə yetirməlisiniz, məsələn, profili doldurun və ya göstərilən slotu beş dəfə oynayın. Hər tapşırığın yerinə yetirilməsi üçün xüsusi xallar verilir – sikkələr. Proqramda status nə qədər yüksək olarsa, kurs bir u qədər sərfəlidir.

Mostbet Bonuslarını Azərbaycan

Kontor bütün dünyada tanınsa da, onun əsas auditoriyası hələ də Azərbaycandandır Mostbet rəsmi saytı 25 dilə tərcümə olunur və 19-dan çox dünya valyutasını qəbul edir. Bu, saytda demək olar ki, tam şəkildə təqdim olunan cryptocurrency nəzərə alınmadan – yeni əlamətlərdən stablecoinlərə qədər. MOSTBET, əsasən yeni başlayanlar tərəfindən qiymətləndirilən geniş və genişləndirilmiş bir bonus sisteminə malikdir. Üstəlik, bu bonus sistemi həm bukmeker fəaliyyətinə, həm də onlayn kazinoya aiddir.

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. 93 ölkədə fəaliyyət göstərir və bu gün Azərbaycan ərazisində ən məşhur ölkələrdən biridir. İcmalda bu bukmeykerin populyarlığının sirlərini açacağıq və işinin xüsusiyyətləri barədə məlumat əldə edəcəyik .

Yeni Istifadəçilər Üçün Salamlama Bonusu

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. Apresentando xətti yaxşı siyahı ilə çoxlu idman və çempionat seçiminə malikdir.

İstəsəniz, profilinizin təhlükəsizlik parametrlərində onu söndürə bilərsiniz. İşin mənfi tərəfi odur ki, hər dəfə mesajdakı kodu daxil etməlisiniz. Ancaq bu seçim, artıq qeyd edildiyi kimi, profildə deaktiv edilə bilər. Siyahıdan uyğun sosial şəbəkə seçmək və əsas profil məlumatlarına (ad, soyad, şəkil) daxil olmağa icazə vermək kifayətdir.

Mostbet, Azərbaycanda Ən Yaxşı Onlayn Kazinolardan Biri

Bəli, bukmeker kontoru Kurakao hökumətinin verdiyi lisenziya əsasında fəaliyyət göstərir Rəsmi internet saytından və ya App Retail store vasitəsilə (iPhone üçün) Bu, dünyada ən aşağı qiymətlərdən biridir və bu platformada ən yüksək əmsalları göstərir Bəli, bütün yeni oyunçulara 550 AZN-ə qədər depozitlər üzrə pulsuz fırlanmalar və bonuslar verilir Mostbet-AZ90 keyfiyyətli xidməti və etibarlılığı ilə mərc həvəskarlarını sevindirməyə davam edir.

“Dərin məzənnədən əyləncəli bir dünya olan Mostbet Azərbaycanda sizi qarşılayır! Qeydə alınmış idman və oyunlar birləşdirilmiş, ehtiraslı oyun atmosferi və yüksək səviyyəli xidmət ilə tanış olun. Stavka təcrübənizi parlaq və unudulmaz etmək üçün Mostbetin peşəkarlığına və etibarlılığına güvənin. Canlı bahis variantları – hər bir hadisənin qeyri-adi nəticələrini təxmin etməyə imkan verən, canlı vaxtın icra olunan hadisələri. MostBet sadəcə bir internet casino deyil; bu günün onlayn casino dünyasında eşsiz bir əyləncə məkanıdır.

Mərc Üsulları

Azərbaycanlı ziyarətçilər saytın bêtisier dilində olan versiyasından istifadə edirlər və hesab manatla aparıla bilər. Biz Mostbet AZ kazinosunun əsas xüsusiyyətlərini təhlil edəcəyik və yeni başlayanlar üçün faydalı tövsiyələr verəcəyik. Anketlərin hər birində Azərbaycana keçid seçin – ölkə və ya müvafiq telefon kodu. Tercih etdiyiniz valyuta vahidini daxil edin – sonradan dəyişdirilə bilməz. Əgər Azərbaycan manatı uyğundursa, o zaman sistem özü mövcud ödəniş sistemlərini seçəcək.

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. Həmçinin saytda və mobil proqramlarda oyunçuların rahatlığı üçün Azərbaycan qabığından istifadə etmək mümkündür. Burada sayta giriş və bukmeker kontorunun özü haqqında ətraflı məlumat verərək danışacağıq. 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.

Mostbet Azərbaycanda Bonuslar

Texniki dəstək operatorları identifikasiya prosedurunu başa düşməyə və profilinizi mümkün qədər tez təsdiq etməyə kömək edəcəklər. Kriptovalyutalarda minimum onların cari məzənnəsindən asılıdır. Doldurma – dərhal pulun çıxarılması ödəniş sistemlərinin qaydalarından asılıdır. Böyük məbləğlərin çıxarılmasını tələb edərkən, şirkət onları daha kiçik hissələrə bölmək və mərhələli şəkildə ödəmək hüququna malikdir.

Müştərilərə həmişə xoş və təhlükəsiz oyun təcrübəsi təmin edilir. Geniş mərc seçimləri, promosyonlar və bonuslarla şirkətimizin niyə Azərbaycanın aparıcı bukmeker kontorlarından biri olduğunu anlamaq asandır. Böyük mükafatlar və maraqlı mərc təcrübələri üçün bu gün qoşulun! Mostbet AZ-90 müştərilərə seçim etmək üçün müxtəlif əmsallar və bazarlar təklif edir.

Onlayn Oyunlar

Hesab yaratdığı andan etibarən ilk fifteen dəqiqə ərzində doldurmağı bacararsa, bonus ilk doldurmanın 125% -ni təşkil edəcəkdir. Depozit bonusundan əlavə 250 pulsuz spin əldə etmək üçün ilk depozitin məbləği ən azı 30 AZN olmalıdır. Pulsuz fırlanmalar 50 pulsuz fırlanma bloklarında verilir, hər blok 24 saat ərzində mərc edilir. Əlavə olaraq, onlayn dəstək 24/7 və hətta bayram günlərində əlçatandır, beləcə həmişə ixtisaslı dəstək xidmətinə arxayın ola bilərsiniz. Bəlkə də bonus üçün mərc etmə tələblərini yerinə yetirməmisiniz. Ölkədə mostbet. possuindo domeni bloklanırsa, quraşdırılmış VPN ilə MostBet brauzerini yükləyə bilərsiniz.

İdman mərc oyunlarından və ahora kazino oyunlarından sabit gəlir əldə etmək üçün etibarlı bukmeker kontoru seçmək lazımdır. Mostbet 90 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ı.

Mostbet Casino

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 machine seçməklə“Demo” işarəsinə klikləməlidirlər.

Lakin mövsümlərarası fasilədə bu bölmənin boş qalmaması üçün şirkət hətta həvəskar turnirlərin də sıraya daxil edilməsinə icazə verir. Bu strategiyanın işlədiyini görmək üçün əvvəlki tirajlara baxa bilərsiniz. Bunlar Mostbet Azərbaycanda tapa biləcəyiniz çoxsaylı idman turnirləri və mərc oyunlarından yalnız bəziləridir. Siz həmçinin Olimpiya Oyunları, Formula simply one, Kriket üzrə Dünya Kuboku və s.

“giris Və Qeydiyyat, Bonuslar Bukmeker Veb Saytında Mosbe

Azərbaycan bazarında ten ildən artıq fəaliyyəti ərzində mostbet ninety bukmeker şirkəti yüz minlərlə oyunçunun etimadını və tanınmasını qazanıb. Onların bir çoxu tematik saytlarda, forumlarda və sosial şəbəkələrdə operatorla əməkdaşlıq təcrübələri haqqında rəylər buraxırlar. Biz real bahisçilərin gözü ilə platformanın güclü və zəif tərəflərinin obyektiv mənzərəsini yaratmaq üçün bir çox belə cavabları təhlil etdik. Bununla belə, bu cür problemlər adətən texniki dəstəyə müraciət etdikdən və əlavə yoxlamalardan keçdikdən sonra həll edilə bilər. Və ümumiyyətlə, mostbet-az90-a qarşı mənfilik qaydadan daha çox istisnadır.

Oyunçuların rahatlığı üçün sol menyuda “Sevimlilər”, “Yeni Slotlar” və “Populyar” bölmələri yer alır. Beləcə siz bu hadisəyə ani çıxış əldə edəcəksiniz və cari əmsalları və dapatkan bazarları izləyə biləcəksiniz. Statistika sizdə əvvəlki idman və e-idman matçları ilə bağlı anlayış formalaşdıracaq. Kazino və Canlı Kazino tez-tez provayderlərin yeni oyunları ilə yenilənir, buna görə də bu oyunları ilk dəfə oynayanlar arasında ola bilərsiniz.

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

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. Bəli, müştərilər e-poçt, telefon və en este momento söhbət vasitəsilə müştəri xidməti komandası ilə asanlıqla əlaqə saxlaya bilərlər. Komanda istənilən sualları cavablandırmaqdan və lazım olduqda yardım göstərməkdən həmişə məmnundur

Ona mərcləri nə vaxt qaldıracağı, nə vaxt qatlayıb növbəti əldə şansını sınamağın daha yaxşı olduğu aydın olur. Siz əminliklə mərc edə və bunu edərkən böyük təcrübədən həzz ala bilərsiniz mostbet yukle apk. Bununla belə, əgər siz statistikaya mərc mərclərini düzgün öyrənsəniz və səriştəli təhlil etsəniz, o zaman uduşlu mərc seçməkdə heç bir trouble olmayacaq. Mostbet qeydiyyat kazinoda oynamağa başlamaq və ilk depozitinizdə böyük xoş gəlmisiniz bonusu əldə etməyin ən yaxşı yoludur. Həmin düyməni klikləyin və siz Google Play Store və ya iTunes mağazasına yönləndiriləcəksiniz (cihazınızın OS-dən asılı olaraq).

Mostbet Kazinosunda Canlı Dilerlərlə Oyunlar

Mostbet güzgüləri əsas sayt bloklandıqda və ya əlçatan olmadıqda Mostbet veb saytına daxil olmağa olanak 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. 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ı va və onların ödənişləri sürətli və ədalətli olur.

Bu, seçilmiş saytın etibarlılığını əlavə olaraq yoxlamağa olanak verir. Ənənəvi kazino oyunlarına əlavə olaraq, provayder daha immersiv və orijinal oyun təcrübəsini təmin edən canlı diler oyunları da təklif edir. Daha cəlbedici və sosial oyun təcrübəsi yaradaraq actual dilerlərə qarşı oynaya və onlarla actual vaxt rejimində əlaqə saxlaya bilərsiniz.

Casino Oyunlarının Növü:

Mostbet Azərbaycanda qeydiyyatdan keçmək və oynamaq üçün ən azı 18 yaşınız olmalıdır. Bəli, saytın əksər funksiyalarından yoxlamadan istifadə edə bilərsiniz. Mostbet giriş necə yerinə yetirəcəyinizi bilmirsinizsə, bu materialı sona qədər oxuyun. Bonusun bütün şərtləri yerinə yetirilən kimi oyunçu qazandığı pulu əsas hesabına alacaq və onu öz hesabına çıxara biləcək.

Bazarda rəqabət olmadığı üçün onun saytı fənlərin sayına və tariflərin siyahısına görə Mostbet və digər şirkətlərdən xeyli geridədir. Azərbaycan Gənclər və İdman Nazirliyinin lisenziyasının olmaması bukmeker kontorunun rəsmi saytına Azərbaycan oyunçularına daxil olmaq mane olmur. Bu strategiya uğursuzluq riskini minimuma endirməyə kömək edəcək. Çoxlu mərc bir hadisənin bir neçə nəticəsini birləşdirir və əmsallar vurulur. Bu, çox riskli bir seçimdir, çünki hadisələrdən biri istənilən nəticəni verməsə belə, bütün kupon ölçüsü itirilir. Beləliklə, əmsal nə qədər yüksək olarsa, mərcdə nə qədər çox hadisələr olarsa, pul itirmə riski bir o qədər yüksək olar.

Mostbet Azerbaycan Giriş Və Qeydiyyatı

Maksimum 550 AZN-lik mükafatı əldə etmək üçün hesabınızı bir dəfəyə 400 manat və ya daha çox pulla doldurmalısınız. Bütün əmanətlər anında hesaba köçürülür və mostbet-az 90-dan komissiya tutulmur. Yəni, məsələn, Australian visa vasitəsilə 100 AZN əmanət etsəniz, mərc etmək və oynamaq üçün düz a hundred manat olacaq. Üstəlik, istənilən üsul üçün minimum doldurma məbləği cəmi 1 AZN-dir. Bukmeker kontoru two 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ə).

E-poçt ünvanınız sayta daxil olmaq üçün universal giriş olacaq. Bu, telefon nömrənizi və ya sosial media hesabınızı dəyişdirərkən xüsusilə rahatdır. Bundan əlavə, güclü parol yaratmalı və platformadan gələn məktubdakı linkə klikləməklə e-poçtunuzu təsdiqləməlisiniz.

Mostbet-az90 – Azərbaycanda Pul Bahisleri Üçün Rəsmi Sayt

O, Curacao-nun rəsmi lisenziyası altında fəaliyyət göstərir, həm qumar sahəsində yeni başlayanların, həm də təcrübəli istifadəçilərin diqqətini cəlb edir. Mostbet on line casino qeydiyyatdan keçmiş oyunçulara çoxlu slot və digər əyləncələr, geniş çeşidli səxavətli bonuslar təklif edir. Müştərilər immersiv online mühitdə blackjack, rulet, baccarat və poker kimi klassiklərdən həzz ala bilərlər. Daha genuine təcrübə üçün bu oyunları canlı dilerlərə qarşı oynamaq imkanı da varifr? N. ” “[newline]Bu funksiya blackjack, rulet və baccarat kimi klassik stolüstü oyunlarda mövcuddur. Əlavə olaraq, tətbiqi quraşdırmaq üçün müştərilər 100 FS və bəxt çarxında əlavə spinlər şəklində bonus alırlar.

Mükafatı almaq üçün qeydiyyatdan keçmək və oyun balansını müəyyən məbləğədək doldurmaq lazımdır. Buna devocionario olaraq universitet voleybol çempionatı və ahora 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. Bu, daha yüksək iş qabiliyyətliliyi, ” “bloklanmanın olmaması və əlavə funksiyalar ilə bağlıdı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; }()); })();