giris və qeydiyyat, bonuslar bukmeker veb saytında mosbet

Mostbet AZ-90 kazino azerbaycan Ən yaxşı bukmeyker rəsmi sayt Breaking News in Hindi Latest Hindi News

İstifadəçilər bukmekerin saytını istənilən brauzerdə aça (yükləyə) bilərlər. Vəsait çıxarışına olan loyal limitlər də, kontorun üstünlüyü hesab edilir. Yeganə mühüm çatışmazlıq bukmeker kontorunun rəsmi saytının lokal internet provayderlər tərəfindən bloklanması riski hesab edilir.

Gün ərzində davam edən lotereyalardan yararlana və ya qəzalı oyunlara diqqət yetirə bilərsiniz. Birinci halda, oyunçu mütləq bir neçə yoldan biri ilə edilə bilən qeydiyyat prosedurundan keçməlidir. Mostbet AZ 91-də qeydiyyatdan keçmək üçün siz 125 faiz pul mükafatı və 250 pulsuz fırlanma şəklində gözəl bonus əldə 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. Beləcə nə vaxtsa qarşınıza çıxmış xoşunuza gələn oyunları axtara-axtara qalmayacaqsınız.

kliklə qeydiyyat

Oyun zamanı insan yüngül stress, əsəbi həyəcan və sevinc hissi yaşayır. Bənzər hisslər sevişmə, aktiv idman və ya qəribə də olsa, mübahisə zamanı əldə edilə bilər. Onlayn və ya real kazinoda oynayarkən baş verən dozalı hormonal artımlar faydalıdır. Ayrı-ayrılıqda, reallaşan həyəcanın uzunmüddətli təsiri ilə bağlı araşdırmalar aparılmışdır. Bəli, Pin-Up oyunlarını pulla oynamaq üçün identifikasiya və yoxlama prosesini tamamlamalısınız. Mostbet oyun avtoriteti tərəfindən verilmiş lisenziyaya malikdir ki, bu da Saytın yüksək keyfiyyət və təhlükəsizlik standartlarına cavab verməsini təmin edir.

Sevdiyiniz maşınları sevimlilər bölməsinə əlavə edin ki, növbəti dəfə onları axtarmağa ehtiyac qalmasın. Tətbiq idmana mərc etmək, nəticələrə baxmaq, hesabınızı idarə etmək və kazino oyunları oynamaq imkanı daxil olmaqla veb saytla eyni funksiyaları təmin edir. Bəli, o, həmçinin Aviator oyununu, 3D slot maşın oyununu təklif edir. Oyunçular oyunlarına əlavə həyəcan əlavə etmək üçün müxtəlif mövzular və səviyyələr arasından seçim edə bilərlər. Aviator oyununun əsas qaydaları olduqca sadədir – oyunçular qalib gəlmək üçün çarxlardakı 3 simvolu uyğunlaşdırmalıdırlar mostbet az casino.

💰 Mərc oyunları üçün nə qədər bonus və cashback var?

Oyunçu statusunu artırmaq və səxavətli hədiyyələr təqdim etmək üçün xallar dəyişdirilir. Slotlarda RTP hər oyun üçün fərdi, lakin 99%-dən aşağı düşmür. Tez daxil olmaq üçün bütün yuvaları sevimlilərə əlavə etmək olar.

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. Müştərilər hadisələrə mərc edərkən onluq, kəsr və ya Amerika əmsallarını seçə bilərlər.

Real vaxt rejimində mərc

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

Mostbet AZ-90-da minimum pul çıxarma məbləği 1 AZN təşkil edir, hər əməliyyat üzrə maksimum məbləğ isə seçilmiş çıxarma üsulundan asılı olaraq dəyişə bilər. Mostbet AZ-90 Android və iOS cihazları üçün xüsusi mobil proqram təklif edir. Tətbiq müştərilərə kazino oyunları, idman mərcləri və veb saytında mövcud olan digər funksiyaların tam çeşidinə daxil olmaq imkanı verir. Müştərilər sadəcə olaraq proqramı cihazlarının tətbiq mağazasından quraşdıra, hesab məlumatları ilə daxil ola və dərhal oynamağa başlaya bilərlər. Mobil versiya əsas veb sayt kimi təhlükəsizdir və bütün məlumatlar SSL texnologiyasından istifadə etməklə şifrələnir mostbet yukle.

Mostbet Əlavə və müştəri dəstəyi

Mostbet-az 90.com xətti yaxşı siyahı ilə çoxlu idman və çempionat seçiminə malikdir. Statistikaya, müxtəlif total və handikaplara mərclər, oyunçuların fərdi nailiyyətlərinə mərclər var. Ehtimallar orta səviyyədən yuxarıdır, ən yaxşı hadisələr üçün təxminən 5-7% marja, kiçik bazarlar üçün isə bir qədər yüksəkdir. Asiya totali və handikap var, lakin bəzi oyunlarda bütöv yekunlar yoxdur – yalnız fraksiyalılar.

Şirkət daha çox müştəri cəlb etmək üçün müxtəlif promosyonlar da təqdim edir. Bundan əlavə, onlar müştərilərə uduşlarını artırmağa kömək edə biləcək geniş çeşiddə bonuslar təklif edirlər. O, sürətli, təhlükəsiz və etibarlı mərc xidmətləri ilə tanınır. Müştərilərin ədalətli oyun təcrübəsi əldə etmələrini təmin etmək üçün şirkət Azərbaycanın Oyun Komissiyası tərəfindən də tənzimlənir. Siz əminliklə mərc edə və bunu edərkən böyük təcrübədən həzz ala bilərsiniz.

Pulsuz mərcləri necə əldə etmək olar?

Mostbet AZ-90 müştəriləri üçün müxtəlif bonuslar və promosyonlar təklif edir. Bəli, Mostbet AZ-90 müştərilər üçün müəyyən məhdudiyyətlərə malikdir. Müştərilər hər hansı mərc etməzdən əvvəl şərtlərlə tanış olduqlarına əmin olmalıdırlar. Bəli, müştərilərin pulsuz yükləyə biləcəyi öz mobil proqramı var.

Onun mahiyyəti aktiv hərəkətlər üçün “koinlər” qazanmaq və toplamaqdan ibarətdir. 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.

Azərbaycanda Mostbet AZ casino

2013-cü ildə yaradılıb və o vaxtdan ölkənin aparıcı bukmeker kontorlarından birinə çevrilib. Bundan əlavə, şirkət əla müştəri xidməti və sürətli ödənişlər təklif edir. O, həmçinin məsul qumar təcrübələrinə sadiqliyi ilə seçilir. Şirkət bütün müştərilərin qumar oyunları ilə bağlı risklərdən, eləcə də öz şəxsi limitlərindən xəbərdar olmasını təmin etməyə diqqət yetirir.

İdman mərcləri ilə yanaşı, bukmeker kontoru onlayn kazino da təklif edir. Bu, müştərilərin öz evlərinin rahatlığını tərk etmədən sevimli oyunlarından həzz almaları üçün əla bir yoldur. Kazinoda müxtəlif slotlar, stolüstü oyunlar və canlı diler seçimləri var. Mostbet AZ-90 bütün növ oyunçuları cəlb edəcək bir sıra kazino oyunları və slotlara malikdir. Şirkət müştəriləri əyləndirmək üçün daim yeni oyunlar və funksiyalar əlavə edir.

Mostbet kazinosunda onlayn slotlar

Onların dəstək komandası hər zaman hər hansı bir problem və ya sualla kömək etməyə hazırdır. Mostbet Partners Mostbet-ə gətirdiyiniz hər yeni oyunçu üçün 60%-ə qədər komissiya ödəyən Mostbet-in rəsmi filial proqramıdır. Siz Mostbet-in kazino və mərc təkliflərini 50-dən çox ölkədə təbliğ edə və istənilən ödəniş sisteminə ömürlük ödənişlər ala bilərsiniz. Mostbet AZ-90 Azərbaycanda onlayn mərc oynamaq istəyən oyunçular üçün əla seçimdir.

Lisenziya qanuni əsaslarla dünyanın əksər ölkələrində bukmeker xidmətləri təklif etməyə imkan verir. Bütün slot maşınları yalnız lisenziyalı provayderlərdən təmin edilir. Bu, ədalətli oyuna və göstərilən RTP-yə uyğunluğa zəmanət verir. MostBet, Curacao lisenziyalı № 8048/JAZ altında Bizbon N.V.

💳 Mərc oyunlarında nə qədər məbləğ qazana bilərəm?

2009-cu ildən etibarən MostBet bir milyondan çox aktiv istifadəçinin etibarını qazanmışdır. Proqram mobil saytdan daha sürətli açılır və işləyir, çünki əsas qrafiklər quraşdırıldıqdan sonra artıq cihazın yaddaşındadır və daha sürətli yüklənir. Ancaq yalnız mobil proqramdan istifadə blokdan yan keçmək üçün təsirli bir üsul ola bilər. Bu proqram anonim mənbələr vasitəsilə işləyir, provayderin bloklanması mobil və ya stasionar resursun ünvanından – əsas və ya alternativdən daha çətindir.

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.

Mostbet AZ 90-da hansı mərclər var

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. Giriş prosesi sadə və sürətlidir və müştərilərə demək olar ki, dərhal mərc oynamağa başlamağa imkan verir. Siz bankınızı artırmaq üçün, kazinoya daxil olaraq, hər zaman əlverişli bonus təkliflərini izləyə bilərsiniz. Yeni müştərilər salamlama bonusu almaq hüququna malikdirlər.

Real vaxt rejimində mərc ən populyar funksiyalardan biridir. Siz oyunun gedişatını izləyərək mərcinizi ona uyğun tənzimləyə və ya imkanlar olduqda onlardan yararlana bilərsiniz. Biz futbol, ​​basketbol və tennis kimi idman növlərinə oyun zamanı mərclər daxil olmaqla, geniş çeşiddə canlı mərc seçimləri təklif edirik. Bukmeker şirkətimiz oyunçulara ən yaxşı əmsalları əldə etmək və potensial mənfəəti artırmaq üçün əvvəlcədən mərc etməyə imkan verən oyunöncəsi mərcləri təklif edir.

🎁 Mən bonusu necə əldə edə bilərəm?

Bu, Mostbet-AZ91-də yoxlama zamanı əlavə çətinliklərin qarşısını alacaq. Hesab yaratdıqdan sonra mobil/e-poçt nömrənizi və şifrənizi daxil etməklə daxil ola bilərsiniz. Sosial şəbəkələr vasitəsilə qeydiyyatdan keçərkən siyahıdan müvafiq messenceri seçməklə onlardan istifadə etməklə daxil ola bilərsiniz.

Bunların hamısına Xətt və ya Canlı rejimdə mərc qoymaq mümkündür. 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. Oyunçunun vəzifəsi düzgün yarış seçmək və ən çox ehtimal olunan nəticəyə qərar vermək olacaq. Hesab yaradarkən yalnız özünüz haqqında ən son məlumatları təqdim etmək vacibdir.

Mostbet oyunları

Oyunçular mərc seçimlərini və mövcud bazarları çox maraqlı və faydalı hesab edirlər. Müştəri xidməti də mehriban və yardımçı olmaq üçün təriflənir. Seçilmiş matçlara mərc edin və uduzsanız, mərcinizin 100%-ni bonus hesabınıza qaytarın! 👇 İndi qeydiyyatdan keçin və risk etmədən idmana mərc edin! Mostbet AZ-90 müştərilərinə idman mərcləri üçün əla platforma təqdim edir.

Aviator, Spribe provayderinin oyunudur, burada oyunçu istənilən təsadüfi anda kəsilə bilən bir təyyarənin uçuşuna mərc etməyə dəvət olunur. Təyyarə oyun ekranında olarkən, qumarbazın mərcdən pul çıxarmaq imkanı var, lakin o yox olduqda (uçub getdikdə və ya qəzaya uğradıqda) bütün cari mərclər itirilir. O, stasionar saytla eyni bölmələri, həmçinin sayt interfeysini fərdiləşdirmək və şəxsi hesabınızı idarə etmək üçün alətləri ehtiva edir.

Mostbet Azerbaycan giriş rəsmi saytına

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. 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. Siz Mostbet güzgülərini onların rəsmi sosial media hesablarını izləməklə, müştəri dəstəyi ilə əlaqə saxlamaqla və ya VPN xidmətindən istifadə etməklə tapa bilərsiniz.

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. Oyunçu bir cüt almazsa, onun mərci qatlaması və ya təsdiqləməsi daha yaxşıdır. Belə bir vəziyyətdə mübadilə ən yaxşı həll yolu kimi görünmür. Krupier bir as və ya kralı aşkar etdikdə, yalnız bir cüt olduqda oynamağa davam edə bilərsiniz. Qarışıq olmayan əllər belə bir vəziyyətdə dərhal qatlanmağı daha yaxşıdır. İtirmək ehtimalı cütü təşkil edən kartların nominalından asılıdır.

Mobil proqramı haradan yükləyə bilərəm?

Bahis və onlayn əyləncə dünyasında istifadəçilər həmişə sevimli platformalarına asanlıqla daxil ola bilmirlər. Tıxanmalar, texniki problemlər və ya 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 ola 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.

Daha sonra siz istədiyiniz mərc növünü seçə bilərsiniz, məsələn, pul xəttinə mərc, xalla yayılan mərc və ya yuxarı/aşağı mərc. İ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. Dəstək qrupu, Mostbet xidmətlərindən istifadə zamanı qarşılaşa biləcəkləri hər hansı sorğu və ya problemlə bağlı istifadəçilərə kömək etməyə həsr olunub. İstəyinizdən asılı olaraq canlı söhbət, e-poçt və ya telefon da daxil olmaqla müxtəlif kanallar vasitəsilə onlarla əlaqə saxlaya bilərsiniz.

Loyallıq proqramı və kazinoda keşbek

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 Gaming License-dən aldığımız lisenziyadır. Bukmeker kontoru futbol (futbol), basketbol, tennis, xokkey və bir çox başqa idman növləri də daxil olmaqla geniş çeşiddə mərc oyunları təklif edir. Mostbet-də idmana mərc etmək üçün sadəcə hesabınıza daxil olun və mərc etmək istədiyiniz idman və ya tədbiri seçin.

Virtual idman mərcləri simulyasiya edilmiş matçlara mərc etməyə imkan verən onlayn qumar formasıdır. Biz yalnız rəsmi saytın əsas menyusunda yerləşdirilmiş ümumi bölmələri sadalayırıq. Mostbet AZ kazinosunda 150 satıcıdan 5000-ə yaxın slot maşını var. Tanınmış və etibarlı provayderlər arasında BetSoft, Endorphina, Evolution Gaming, Amatic, BeeFee, BooonGo, Spribe, Spinmatic və başqaları var.

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