Mostbet Mobil Tətbiq: Azərbaycandan Olan Oyunçular Üçün Icmal 2023″

İdman Mərcləri Və Onlayn Kazino 500 Bonus Qazanın Giriş

Mostbet real puya 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.

Rəsmi Mostbet Casino saytında siz pulsuz və ya real puya oynaya bilərsiniz. Pulsuz oyunlara keçmək üçün demo rejimini aktivləşdirməlisiniz. İkincisi, daha çox avtomobilə çıxış açır. Burada həmçinin mobil proqramı əməliyyat sistemi olan istənilən cihaza yükləyə bilərsiniz. Saytda hər zövqə uyğun 1000-dən çox müxtəlif oyun versiyası varifr?n. Sayt çoxdilliliyi və bir çox milli valyutaları dəstəkləyir. Hesaba vəsait yatırmağın mümkün yolları arasında standard bank kartları və wasserstoffion (negativ) (fachsprachlich) pul kisələrindən istifadə etməklə yanaşı, Bitcoin kriptovalyutası və ADVCASH, Payeer, Skinpay və s. Mostbet kazino oyununu oynamaq uzun müddətdir istifadəçilər arasında populyarlığını itirməyən maraqlı prosesdir. Əgər oyunçu öz bacarığına arxayın deyilsə, o, pulsuz oynaya bilər” “və pul xərcləməz.

Mostbet Güzgüləri Azərbaycanda

Bitcoin, Litecoin, Dogecoin və başqalarını istifadə edə bilərsiniz. Qeydiyyatdan keçmiş bütün istifadəçilər istənilən canlı matçın canlı yayımını pulsuz izləyə bilər. Mostbet Azərbaycan üçün bu icmalı bacardığımız qədər ətraflı və doğru etməyə çalışmışıq ki, bütün əsas məqamlardan xəbərdar olasınız. 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 https://mostbet-900.com.

Bundan başqa, azərbaycanlı qumarbazlar provayderə görə və ahora oyun növünə help olan xüsusi altkateqoriya kimi bir çox variantdan istifadə edərək oyunları süzgəcdən keçirə bilərlər. Bunların hər birində qumarbazlara axtardıqları dəqiq oyunu tapmağa imkan verən bir neçə alt kateqoriya var. Azərbaycanlı oyunçular müxtəlif RTP və dəyişkənlik diapazonu ilə gələn 2500-dən çox müxtəlif temalı slotlardan birini seçə bilərlər. Oyunlar 130-dan çox proqram tərtibatçısı tərəfindən təmin edilir və mövcud xüsusiyyətlərə, mövzulara və ya xüsusi provayderə görə süzülə bilər. Bu onlayn kazinoda qeydiyyatdan keçmiş qumarbazlar ən populyar oyunlar arasında Aviator, JetX, Mines və Plinko da daxil olmaqla 300-dən çox crash oyunu seçə bilərlər. Bu oyunlar əsas lobbi ekranında və ya soldakı şaquli siyahıda Fast Games kateqoriyasında yerləşən ayrıca kateqoriyasında yerləşdirilir.

Mostbet Tətbiqində Mərc Seçimlər

İkincisi, İnternetdə istifadəçi giriş məlumatlarını oğurlamağa çalışan MostBet-in (phishing) saxta güzgüləri də var. Maraqlıdır ki, MostBet-in rəsmi saytında blokdan yan keçməyə həsr olunmuş bütöv bir bölmə də var. Dəstək nümayəndələri hər hansı bir texniki məsələni həll edir, Lazım olduqda istifadəçilərə məsləhət verirlər.

Oynamağa elə bu gün başlayın və böyük məbləğdə uduş əldə etməyə hazır olun! 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ə holdem poker ilə başlaya bilərsiniz – hər kəs özünə uyğun olanı tapacaq. Mövcud ödəniş variantları coğrafi ərazinizdən asılı olaraq dəyişə bilər https://mostbet-900.com/qeydiyyat/.

Mostbet Azərbaycanda Bonuslar

Bukmeker kontoru eksklüziv bonuslara, çoxlu sayda mərclərə, şəffaf əməliyyatlara, çoxsaylı ödəniş üsullarına” “və daily dəstəyinə zəmanət verir. MostBet istənilən rahat cihazdan mərc etməyə və oynamağa olanak verən bütün əsas əməliyyat sistemlərini əhatə edir. Bukmeker şirkətinin rəsmi saytı ən yüksək xidməti göstərmək üçün” “daim inkişaf edir. Bukmeker kontorunun uzun illər təcrübəsi var, ona görə də xidmətin keyfiyyətinə heç” “bir şübhə yoxdur. Proqramın iOS cihazınızda quraşdırılması prosesini başa çatdırmaq üçün yuxarıda təsvir edilən eyni addımı (2-4-cü addım) edin.

Yeniləmələr ilə Mostbet-in ən boy versiyasına çıxış əldə edirsiniz, bu isə bütün baqları həll edir, tətbiqi sürətləndirir, eləcə də en yeni bonuslar və funksiyalar əlavə edir. Artıq Mostbet-də hesabınız varsa, giriş etmək üçün ondan istifadə edin. Əgər hər hansı səbəbdən Mosbet tətbiqini telefonunuzdan silmisinizsə, narahat olmayın, çünki onu bütün əvvəlki məlumatlarınızla birlikdə bərpa etmək mümkündür.”

Mostbet Onlayn Oyunlar

Hər halda Mostbet tətbiqində kazino oyunlarını oynamaq Azərbaycanın harasında olmağınızdan asılı olmayaraq pul qazanmağı asanlaşdırır. Zövqünüzə uyğun gələn online poker masasına qoşula bilərsiniz, belə ki, hər bir oyun müəyyən bir diler tərəfindən idarə olunur, eləcə də müəyyən least və maksimum mərc məbləğləri mövcuddur. Şirkətin Kürasao lisenziyasının olması o deməkdir ki, bütün Mostbet məhsullarının, o cümlədən Android və iOS tətbiqləri Azərbaycanda daxil olmaqla xidmətin göstərildiyi ölkələrdə qanunidir.

Bu yazıda biz Mostbet onlayn kazinosunun bəzi müsbət cəhətlərinə baxacağıq. Mostbet onlayn kazinosu günün twenty-four saatı fəaliyyət göstərir ki, bu weil onları günün istənilən vaxtında əlçatan edir. Bu o deməkdir ki, sevimli oyunları sizə uyğun olan vaxtda, iş saatlarına məhdudiyyət qoymadan oynaya bilərsiniz. Mostbet onlayn kazinoları çoxlu sayda oyun təklif edir, o cümlədən slot machine game, rulet, blackjack, holdem poker və daha çox. Həmişə üstünlüklərinizə və maraqlarınıza uyğun bir şey tapacaqsınız. Mostbet Casino yeni və müntəzəm oyunçular üçün müxtəlif bonuslar və promosyonlar təklif edir.

Hesabı Tətbiq Vasitəsilə Yaratmalıyam?”

“Bu baxışda biz Mosbet Az ın güclü və zəif tərəflərini ətraflı təhlil edəcəyik. Əsas menyunun üstündə saytın Mosbet idarə edilməsi düymələri var – əmsal formatının seçimi, səhifənin dil versiyası, proqramlar bölməsi və blokdan keçmək üçün təlimatlar ilə xatırlatma. Mosbet saytda bir promosyon kodu daxil etməli və hər bir qeydiyyat seçimi üçün added bonus seçməlisiniz. 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.

Mostbet güzgü saytları əsas veb saytla eyni məzmuna malik olan, lakin alternativ domen adından istifadə edən veb-saytlardır. Onlar rəsmi web saytı işləmədiyi və ya məhdudlaşdırıldığı halda istifadəçilərin Mostbet daxil ola bilməsi üçün hazırlanmışdır. Buna baxmayaraq, etibarlı güzgü saytından istifadə etdiyinizə əmin olmaq çox vacibdir. Bunu yerinə yetirmək üçün veb saytın domen adının nüfuzlu olduğundan əmin olun.

Mostbet Az -da Pul Çıxarma Limitləri Hansılardır?

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 real dilerlərə qarşı oynaya və onlarla real vaxt rejimində əlaqə saxlaya bilərsiniz. Hadisələr və ahora bölmələr arasında keçid yavaş İnternetlə olsa da, saniyə sürətlə davam edir. İdman bahislərindən və ahora slot maşınlarından yalnız müsbət emosiyalar əldə edin.

Əmanətin məbləği nə qədər böyükdürsə, bir u qədər çox sikkələr verilir və müəyyən bir məzənnəyə uyğun olaraq dəyişdirilə bilər. Sikkələr təkcə mərclərdən deyil, həm də gündəlik tapşırıqları yerinə yetirməklə əldə edilir. Azərbaycandan olan Mostbet qeydiyyatdan keçmiş istifadəçilər bu sayta daxil olduqda və idman, mərc bazarları və kazino lobbisi ilə tanış olduqda çoxsaylı üstünlüklərdən yararlanacaqlar. Saytda qeydiyyatdan keçməklə genuine pul mərc və ya qumar oyunları ilə məşğul olmaq üçün ziyarətçilərin ən azı 18 yaşı olmalıdır. Mostbet mərc” “seanslarınızın müddəti bitərsə və ya qeydiyyatdan sonra təsadüfən sistemdən çıxsanız, yenidən daxil olmaqla hesabınıza daxil olmalısınız. Azərbaycanda Mostbet idman mərc oyunlarına başlamaq kifayət qədər asan və sadədir.

Mostbet Tətbiqini Istifadə Etmək Azərbaycanda Qanunidir?

Ən xoşagəlməz şey isə gecikmədir ki, bu anda sərfəli mərci məhv edə bilər, çünki serverdən cavab almağa nə qədər yaxşı vaxt yoxdur. MostBet-də belə problemlər yoxdur, canlı stabil işləyir, nasazlıq yoxdur. Ancaq rəsmdəki hadisələrin sayı təcrübəliləri daha yaxşı heyran edir. MostBet nəhənglərlə birlikdə ən populyar olmayan çempionatları belə tutmağa çalışır. Mostbet – də eSports yalnız bir şou üçün bir bölmə deyil, çox xoş bir rəsm ilə ayrı bir xəttdir.

Ancaq rahatlıq üçün SPA versiyası digər bukmeker şirkətlərinin, məsələn, 1xbet tətbiqlərindən az deyil. Düzgün işləyir, hətta zəif prosessorları olan cihazlara da yükləyir, 12 ildən çox əvvəl buraxılmış və 1 GB yaddaş tutumu ilə. 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. Bundan əlavə, şirkət əla müştəri xidməti və sürətli ödənişlər təklif edir.

Ümumi Icmalı Mostbet

Azərbaycanda Android smartfonunuz vasitəsilə oynamaq üçün bu addımları yerinə yetirin. Yolda olarkən apple iphone və ya apple 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. Android istifadəçiləri mobil sayta Mozilla, Opera, Ms və ya Google Chrome vasitəsilə daxil ola, iOS istifadəçiləri isə Safari-dən istifadə edə bilərlər. Mostbet Azərbaycan saytında ödənişlərlə məşğul olmaq bütün qeydiyyatdan keçmiş istifadəçilər üçün asan və rahatdır.

Statistika sizdə əvvəlki idman və e-idman matçları ilə bağlı anlayış formalaşdıracaq. Beləcə bəzi əmsalların və” “bazarların cari matçda qalib gəlmək ehtimalını təhlil edə biləcəksiniz və ən gəlirli proqnozları verə biləcəksiniz. Maraqlandığınız oyunu adı və ya provayderinə görə sürətlə tapmaq və onu sevimlilərinizə əlavə etmək üçün axtarış çubuğu və filtrlərdən istifadə edə bilərsiniz. 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 Mobil Proqramları

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. Novomatic müasir onlayn qumar bazarında ən çox axtarılan tərtibatçılardan biridir. Hal-hazırda, yüksək keyfiyyətli slotların hazırlanmasında ixtisaslaşan üç böyük şirkətdən ibarət qrupdur. Depozitə görə bonus şirkətdə qeydiyyatdan keçmiş, depozit etmiş və ilk mərcini etmiş bütün müştərilər üçün əlçatandır. Azərbaycanda Mostbet kazinosunda siz əlavə xüsusi xidmətlər üçün eksklüziv VERY IMPORTANT PERSONEL klublara qoşula bilərsiniz.

Əsas səhifənin sol tərəfində bütün mövcud Mostbet idman növlərinin şaquli siyahısı var, sağda isə siz mərc kuponuna və bəzi məşhur kazino və canlı kazino oyunlarına baxa bilərsiniz. Mərkəzi hissə bir neçə idman növü üzrə ən populyar tədbirlər üçün nəzərdə tutulub, betagt hissə isə daxili bağlantılar və sahibi və lisenziyası haqqında məlumat təqdim 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.

Qeydiyyat Və Mostbet-ə

Platformada qeydiyyatdan keçərkən sizin üçün daha cəlbedici olan bonus hansıdırsa,” “onu seçə biləcəksiniz. Bu bonus salamlama bonusuna oxşardır, çünki bu da qeydiyyat üçün təqdim olunur. Ancaq əsas fərq bundan ibarətdir ki, oyunçular onu əldə etmək üçün birinci pul qoymağını həyata keçirməli deyil. Sadəcə Mostbet-ə qoşulduğunuz üçün şirkət sizə Aviator oyununda 1 AZN dəyərində 5 pulsuz oyun haqqı hədiyyə edir. Siz həmçinin sadiqlik proqramına qoşulmaqla müəyyən nailiyyətlərə görə bonus xallar, Mostbet qəpikləri, pulsuz mərclər, pulsuz fırlatmalar və digər mükafatlar qazana bilərsiniz. Mostbet idman mərcləri futbol, basketbol, kriket, voleybol və 30-dan çox digər populyar idman növündə yüzlərlərlə yüksək əmsalı və müxtəlif bazarları olan matçları özündə ehtiva edir.

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 Shop və ya iTunes mağazasına yönləndiriləcəksiniz (cihazınızın OS-dən asılı olaraq). 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.

Mostbet-də Vəsaitlərin Doldurulması Və Çıxarılması Bukmeker Kontorunda

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. Siz həmçinin bölmələr arasında rahat keçid edə bilər, eləcə də vurma bonusları, pul çıxarmalar, canlı yayım izləmək kimi digər funksiyalardan istifadə edə bilərsiniz. Əgər cihazınız bu siyahıda yoxdursa, narahat olmayın, çünki Mostbet tətbiqi demək olar ki, bütün Android cihazlarında işləyir, yəni o sizin cihazınızda gecikmə və problem olmadan işləyəcək. Azərbaycandan olan iOS cihazlarının istifadəçiləri də funksiyalarla zəngin Mostbet tətbiqini əldə edə bilərlər. Mostbet endirmə iPhone və iPad cihazlarının bütün versiyalarında əlçatandır. Tətbiq mükəmməl şəkildə optimallaşdırılıb, yəni istifadəçilər onun rahat və gecikməsiz işləyəcəyinə əmin ola bilər.

Oyunlar unikal əyləncə vəd edir və həm real pulla, həm də pulsuz oynaya bilər, əgər siz başlanğıcsınızsa və oyunu öyrənmək istəyirsiniz. Virtuallar lobbidə bir neçə alt kateqoriyaya yerləşdirilib, bunlar aşağıdakılardır. Mostbet Kazino-da canlı diler oyunları böyük müxtəliflik və real vaxtda real iştirakçılara qarşı oynamaq imkanı təklif edir. 500-dən çox canlı kazino oyunu var ki, onlar birbaşa ana səhifənin əsas menyusundan əldə edilə bilən ayrıca tabda yerləşdirilir. Canlı oyunlar Evolution, Microgaming, Atmosfera və Festón Gaming kimi hörmətli oyunlar da daxil olmaqla 25-dən çox oyun tərtibatçıları tərəfindən təmin edilir.

Mostbet Sürətli Oyunlar

Sevimli canlı masanızı tapmaq üçün canlı Mostbet lobbisində aşağıdakı alt kateqoriyalardakı mövcud oyunları asanlıqla nəzərdən keçirə bilərsiniz. Lobbidə Kart Oyunları kateqoriyasında mövcud poker alternativlərindən başqa. Mostbet həmçinin bu əlavə maraqlı kazino oyununun bütün həvəskar pərəstişkarları üçün ayrıca Poker tabını təqdim edir. Onların hər birində mərclərin diapazonu, orta qazanc, minimum/maksimum alış və növü kimi təfərrüatlar təklif” “edən poker alternativlərinin siyahısı var. Siz həmçinin mövcud filtrlərə uyğun olaraq bu detalları özünüz də tənzimləyə bilərsiniz.

Bəli, lobbidə slotlar, kart oyunları, canlı oyunlar, quickly games, poker, cekpotlar və virtuallar kimi xüsusi kateqoriyalarda qruplaşdırılmış 3500-dən çox onlayn kazino oyunları mövcuddur. Mostbet Online Casino oyunçulara dünyanın istənilən yerindən birbaşa evlərinin rahatlığından və ya mobil cihazlarından qumardan həzz almaq üçün unikal imkan təklif edən platformadır. Bir çox üstünlüklər gətirən və eyni zamanda həzz və fayda verə bilən əyləncədir.

☎ Mostbet-az91 Müştəri Dəstəyi Ilə Necə Əlaqə Saxlaya Bilərəm?

Tərəfdaşlar tərəfdaşlıq proqramına qoşulmazdan əvvəl Mostbet Tərəfdaş sekmesinde hesab üçün qeydiyyatdan keçməlidirlər. Filiallara hesab yaratdıqdan sonra xüsusi istinad URL-i veriləcək və nəticədə onlar öz saytlarında, sosial mediada və ya digər vasitələrlə istinad linkini reklam edə bilərlər. Bəli, Azərbaycandan olan oyunçular minimum 3 AZN əmanət üçün 125%-dən 550 AZN-ə qədər mükafatı olan idman xoş gəlmisiniz bonusunu tələb edə bilərlər. Aviator həm desktop saytında, həm də Android və” “iOS mobil tətbiq nümayişi və real pul oyunu üçün mövcuddur. Mostbet Azərbaycan oyunçuları üçün bir neçə pul çıxarma limiti qoyub – siz gündəlik olaraq 8950 AZN, həftəlik AZN, ayda AZN çıxara bilərsiniz.

Yaxşı ehtimallar – balompié üçün 2 ilə 5%, digər hadisələr üçün 8% -ə qədər. Hətta qumar himayədarları da onlayn kazino bölməsini qiymətləndirəcəklər. Mostbet 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.

Mostbet Azərbaycanda Saytı

Mostbet AZ 91 dəyişən bonus proqramının yaradılması kimi məqamlara lazımi diqqət yetirir. Əlavə olaraq, tətbiqdə oynamağa başlamaq üçün en yeni hesab yaratmağınıza ehtiyac yoxdur. İstənilən yerdə tətbiqdən istifadə etməklə oynaya bilərsiniz, çünki bunun üçün sizə internet və tətbiqin quraşdırıldığı smartfon və ahora planşet lazımdır. Əlavə olaraq, sizə təsdiqlənmə lazım olduqda Mostbet-in onlay dəstək xidməti ilə əlaqə saxlaya bilərsiniz. Mostbet mobil tətbiqində veb-saytdakı ilə eyni alətlər və seçimlər varifr?n.

Siz yerli elektrum pul kisələri, kredit və debet kartları və bir neçə kriptovalyuta daxil olmaqla, depozit və pul çıxarmaq üçün bir neçə variant tapa bilərsiniz. Aşağıdakı cədvəl Mostbet depozitləri və ödənişləri haqqında ətraflı məlumat təqdim edir. Aşağıdakı cədvəldə sadalanan pul çıxarma limitləri bir gündə çıxara biləcəyiniz məbləğə istinad edir. Həftəlik və aylıq məbləğlər üçün istifadəçilər Bukmeker kontorunun şərtləri ilə tanış olmalıdırlar. Mostbet də müştəri dəstəyi xidməti bu sahədə çalışqan və peşəkar mərc oyunları üzrə peşəkarlardan ibarətdir.

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