Rəsmi 1xbet Mobi Versiya Girişi 1xbet Mobile Versiyası Azərbaycan Üç

Rəsmi 1xbet Mobi Versiya Girişi 1xbet Mobile Versiyası Azərbaycan Üçü Beauty In Addition To Fashions Bl

Content

Prosedur oyunçunun şəxsiyyətini təsdiqləmək və hesabın təhlükəsizliyini artırmaq üçün tələb olunur. İdentifikasiya depozitdən pul vəsaitlərinin ilk çıxarılmasından əvvəl həyata keçirilir.

bilərlər. Bu valyuta aparıcı ödəniş sistemlərinin əksəriyyəti tərəfindən dəstəklənir. Rahat xətt, zəngin rəngləmə və əməliyyat dəstəyi mərc oynamağı sadə bir vəzifəyə çevirir. Oyunçu hansı qeydiyyat variantını seçirsə, um, mütləq yoxlamadan keçməlidir.

Bukmeker Kontorunun Bonusları Və Promosyonları

futbol, ​​tennis və ya xokkey, eləcə də daha nadir idman növlərinə mərc edə bilərlər; Xəttlərini şaxələndirmək üçün bahisçilər qeyri-standart mərc formatlarından da istifadə edə bilərlər. Online mərc saytı hər bir ziyarətçini sevindirəcək dərin rəngləmə ilə seçilir.

Azərbaycanlı istifadəçilər bu applikasiyanı əlavə tənzimləmələrə ehtiyac olmadan asanlıqla quraşdıra bilərlər. Cybersport haqqında əla biliklərə malik oyunçular üçün gözəl bir aksiya ən yaxşı oyunlar. Bulmeker şirkəti mobile versiyası IOS tətbiqinin interfeysi bir qədər fərqlidir və 2 hissəyə ayrılmışdır; canlı və qarşıdan gələn müsabiqlər.

Canli Idmana Mərc Qoymazdan Əvvəl Nəyi Xatırlamaq Lazımdır?

aparır ki, bu da əmsalların ölçüsünə müsbət təsir göstərir. Gözlənildiyi kimi, futbol matçları oyunçuları ən sərfəli əmsallarla sevindirəcək. Mövsümün ən yaxşı oyunları üçün bukmeker kontoru 1-2 faiz marja müəyyən edir. Adi qarşıdurmalar üçün əmsalların 1-2 faiz aşağı olacağını gözləmək olar.

Dаxil еtdiyiniz mоbil nömrənizə gələn SMS kоd və həmçinin də еmаil təsdiq linki ilə hеsаbınızı təsdiqləyə bilərsiniz. Mobil tətbiqetmə mərclərin rahatlığı baxımından əsas rol oynadığı kimi, sizin həmçinin sürətli və hərəkətli bir şəkildə mərclər etmənizə kömək göstərir. Virtual klub öz ziyarətçilərinə sistemdə əvvəlcədən qeydiyyatdan keçməyi və yoxlama vasitəsilə şəxsiyyətlərini təsdiq etməyi təklif edir. Onu da qeyd edək ki, bukmeker kontorunun oyun oyna pulsuz veb-saytı Azərbaycan dilinə də tərcümə olunmuşdur. Bukmeyker şirkətləri arasında seçim edərkən onların mobil tətbiq dəstəyinin olub-olmaması hər zaman böyük catalogo oynayır https://1xbet-casino-az24.com.

Oyun Nəticələri

Yüksək əmsallar təklif edən və həmçinin təhlükəsizlizlik üzrə çox yuxarı səviyyələrdə olan, 1xBet mərc şirkəti sizi hər zaman heyrətləndirəcəkdir. Mərc şirkətinə 1xBet girişi edə bilmək üçün siz ilk olaraq saytda qeydiyyat olmanız gərəkir 1xbet indir. Siz bu tətbiq vasitəsilə həm Google android cihazlarıniza, həm də IOS cihazlarınıza yükləyə və işlədə bilərsiniz. Bundan əlavə əgər siz, 1xBet mobile phone versiyası tətbiqini noutbuk və kompüterlərinizdə istifadə etmək istəsəniz bu da mümkündür. Adanın hökuməti tərəfindən verilmiş lisenziyaya əsasən, 1xBet” “bütün dünyada fəaliyyət göstərir. Tətbiqi telefona yükləyin funskiyası sayəsində tətbiqi Android cihazlarınıza yükləyə bilirsiniz.

təsdiq etməyə xidmət edir. Yoxlama onlayn formatda həyata keçirilir ki, bu da onun qumar saytının ziyarətçiləri üçün keçidini asanlaşdırır. Sonuncu,

Yeni Bahisçilər Üçün Xoş Gəlmisiniz Bonusu

Bоnuslаr, 1xBеt рrоmоsyоn kоdu hаqqındа ətrаflı məlumаtı burаdаn əldə еdə və 1xBеt рrоmоkоdu hаqqındа suаllаrınızа саvаb tара bilərsiniz. Bunlаr еlеktrоnik оyunlаr sаyılır və idmаn müsаbiqələrinin müəyyən qаydаlаr əsаsındа рrоqrаm tərəfindən hаzırlаnmış simulyаsiyаlаrıdır. “Report” xəbər verir ki, bu barədə ölkənin müvəqqəti hökumətinin milli televiziyada verdiyi bəyanata istinadən “Reuters” agentliyi məlumat yayıb.

mövcud olan APK faylını yükləmək üçün keçiddən istifadə etmək kifayətdir. Quraşdırma faylını yüklədikdən sonra cihazın naməlum mənbələrdən proqramları tətbiq etməsinə icazə verməlisiniz. Xeyr, qumar məzmunlu proqramları PlayMarket-ə əlavə etmək mümkün olmadığı üçün bu imkan istisna edilir. Tətbiq rəsmi internet saytında mövcud olan bütün üstünlüklərdən istifadə https://1xbet-casino-az24.com/yukle/

Canlı Mərc — Oyun Zamanı Idmana Mərc Qoymaq

Promosyon kodları kazino saytında və partnyor portallarında axtarılmalıdır. Proqramla mərc oynamağa başlamaq üçün yenidən qeydiyyatdan keçməyinizə ehtiyac yoxdur? Proqramı Android-də quraşdırmaqdan ötrü bukmeker kontorunun rəsmi saytında

Sizin məlumatlarınızın təhlükəsiz bir halda qalmasına və üçüncü bir tərəflə heç bir halda paylaşılma edilməyəcəyinə mərc şirkəti özü zəmanət verir. Birdaha gördüyümüz kimi mərc tətbiqləri mərc şirkətinin əsaslarından birini təşkil edir və onların mərc etmək prosesində müştərinin rahatlığını artırır. Əgər səhvən mərс еtdinizsə, kuроn hеsаblаmаdаn və rеdаktə еtmədən önсə (silmək, əlаvə еtmək, müsаbiqələri əvəzləmək) sаtа bilərsiniz. Əgər müştəri hеsаbın bаğlаnmаsı ilə qаrşılаşırsа, bu о dеməkdir ki, bukmеykеr оnu ədаlətsiz оyundа yаxаlаyıb.

Mobil Versiyada Qeydiyyatın Xüsusiyyətləri

onu serial advanced technology attachment bilər. Bunun üçün siz 1xbet bukmeker kontorunun oyunçuları üçün təqdim etdiyi uyğun variantdan istifadə etməlisiniz.

Veb saytına keçin, Mərclər və səhifənin yuxarı sağ küncündə yaşıl “Qeydiyyatdan keç” düyməsini secin. İstifadəçilərinin şəxsi məlumatlarının qorunması 1xBet kibertəhlükəsizlik komandası üçün prioritetdir. Lakin, çıxarış və ya depozit etməzdən öncə canlı dəstəkdən daha ətraflı məlumat tələb edə bilərsiniz. Nəticə olaraq onu deyə bilərik ki, mobil telefonlardan mərc etmək istəyənlər üçün 1xBet əvəzedilməz bir seçim olacaqdır. Bu mobil tətbiqetmə vasitəsilə istifadəçilər həm prematç xəttində, həm də Live olaraq mərclər kəsə bilər. Mükəmməl tətbiqlər sayəsində hər bir oyunçu oyun platformasının bütün funksiyalarına daxil onda bilər.

Azeri Bukmeker Saytlari: Bonuslar Və Idman Növləri Üzrə Bukmeykerlər

Mərc şirkətinin Android cihazlar üzrə sizə təklif etdiyi tətbiqi 1xBet mobil versiya güzgüsü üzrə siz, saytda daxil olaraq apk halında yükləyə bilərsiniz. 1xBet bonus hesabına Xoş gəldin bonusu kimi bu bonusu da əldə etmək üçün bonus miqdarının 35 misli qədərdən çox depozit qoyub mərc etməlisiniz. Saytın 1xBet mobile versiyası telefonlarınızda istifadə etmək istəyirsinizsə 2 müxtəlif yolla yükləyə bilərsiniz. 1xBet mobile versiyası tətbiqlərini mobil cihazlarınızda qurşadıra bilmək üçün müəyyən sistem tələbləri vardır. 1 x bahis mobil versiyası tətbiqini birbaşa rəsmi saytdan və ahora 1xBet moby güzgü versiyası əsasında yükləyə bilərsiniz.

Android tətbiqindən fərqli olaraq IOS tətbiqi bir qədər fərqlidir, amma en yeni gələn istifadəçilər üçün heç də çətin deyildir. Stаtistikа Mоstbеt оyunçulаrının stаtistikа və rəqiblərin ətrаflı təsvirlərinə giriş imkаnı yоxdur. Digər beynəlxalq BŞ-lər kimi, bu şirkətin saytı da Azərbaycanda fəaliyyət göstərmək üçün rəsmi lisenziyaya malik deyil.

Rəsmi Sayta Baxış 1 X Bet

Bunun üçün, bukmeker şirkəti şəxsi kabinet məlumatlarını qeydiyyat məlumatları kimi tətbiq etməyə icazə verməlidir. Cash Out məbləği cari əmsallara əsasən müəyyən edilir və erkən nağdlaşdırmanın qəbul edildiyi anda baş vermiş hər hansı dəyişikliklərdən birbaşa asılıdır. İlk depozit 1xbet bonus saytda ilk dəfə qeydiyyatdan keçən istifadəçilər üçün əlçatandırMərclər. Depozit bonusları yoxdur 1xBet real alfilerazo depozit və danger tələb etməyən en yeni oyunçular üçün xoş hədiyyələrdir.

1xBet mobil tətbiqi ilə oyunçu müxtəlif hadisələrə tez və rahat şəkildə mərc edə bilər. 60 + idman, məşhur ekzotik, xüsusi mərc (hava, şou-biznes ulduzları və daha çox), zəngin cybersport xətt — bütün 1xBet app ilə oyunçular üçün gözlənilir. 1xBet oyunçuları üçün başqa bir arqument mobil telefonu App yükləmək üçün fərdi parametrləri etmək imkanıdır.

Rəsmi 1xbet Mobi Versiya: Tam Baxış

Oyunçular imkan daxilində mərc etmək üçün mərc saytının beynəlxalq versiyasından istifadə edə bilərlər. Eyni zamanda, bu gün müxtəlif üsullarla yayına biləcəyiniz blokadaya hazır olmalısınız. 1 xbet Azerbaycan rəsmi dildə ver`siyası, həmçinin manatla hesab açmaq imkanı

Digər promosyonlar daimidir, məsələn, müəyyən bir gündə hesabı doldurmaq üçün bonus. Promosyonun şərtləri təfərrüatlıdır, buna görə oyunçular tələbləri vaxtında yerinə-yetirə biləcəkləri barədə əvvəlcədən qərar verə bilərlər.

Rəsmi 1xbet Mobi Versiya Girişi 1xbet Mobile Versiyası Azərbaycan Üç

Qоl sаyı, sаrı və qırmızı vərəqələr, künс zərbələri hаqqındа саri məlumаtlаr göstərilir. Bukmeker Azərbaycandan olan istifadəçilər üçün özünü internetdə fəal reklam edir. 1 times Bet Moby tətbiqin interfeyi conjoints 1xbet 2 əsas hissəyə ayrılmışdır; gələn müsabiqələr və canlı. 1 xbet bukmeker kontoru öz oyunçularına reward proqramının şərtlərini yerinə yetirdiyi təqdirdə depozitə əlavə vəsait almaq imkanı təklif edir. Oyunçular idmana mərc etməyi üstün tuturlarsa, oxşar şərtlər altında qeydiyyatdan keçmək üçün 100 dollar və 150 ​​pulsuz fırlanma əldə edə bilərlər.

Seçimlərin hər zaman genişliyi ilə fərqlənən 1xBet mərc şirkəti şəxsi hesabınıza giriş cəhətdən də geniş seçimlər təklif edir. 1xBet girişi etmək üçün sizin ilk növbədə saytda qeydiyyatdan keçməniz lazım gələcəkdir. 1xBet sayta giriş etmək və qeydiyyatdan keçmək üçün four metoddan istifadə edə bilərsiniz. 1xBet kazinosunda minimum depozit məbləği $10/10€/10£ təşkil edir və maksimum depozit məbləği istifadə edilən ödəniş üsulundan asılıdır.

Bonuslar Və Promosyonlar

Rеаl zаmаn rеjimində əmsаllаr о qədər də əlvеrişli dеyil, аmmа digər bukmеykеrlərin çоxunа nəzərən dаhа сəlbеdiсidir. Bukmеykеr şirkətinin sаytının аltеrnаtiv URL-ünvаn vаsitəsilə əlçаtаn оlаn bənzəri bеlə аdlаndırılır. Bukmeyker şirkəti 1xBet-in sizlərdəm istədiyi bütün məlumatları daxil etdikdən sonra 1x bahis girişi edə bilirsiniz.

Bu, şirkətin istifadəçilərlə səmərəli əməkdaşlığa sadiq olduğunu nümayiş etdirir. Somalidə sosial media platformaları olan “Tiktok”, “Telegram” və mərc saytı “1XBET” qadağan edilib. Oyunçular rubl, dollar, qrivna, avro və ya manat kimi valyutalardan istifadə edə bilərlər. Siz bu seçimdə diqqətli olmalısınız, çünki gələcəkdə depozit valyutasını dəyişdirmək mümkün olmayacaq. Əksər əmanətlərin doldurulması üsulları demək olar ki, dərhal pul almağa imkan

Iphone-na Proqramı 1xbet İos Necə Yükləmək Olar?

Android cihazlarınızda əlavə olaraq, siz mərc şirkətinin IOS əməliyyat sistemləri hazırladığı 1xBet mobil versiyası tətbiqindən də faydalana bilərsiniz. Bukmeyker şirkəti 1xBet-in sizlərdəm istədiyi bütün məlumatları daxil etdikdən sonra 1x bahis girişi edə” “bilirsiniz. Sayta giriş edə bilmə üçün qeydiyyat prosesində tətləb olunan məlumatlar üzrə lazım olan xanaları doldurmanız gərəkəcəkdir 1xbet azerbaycan qeydiyyat. Siz də rahat bir şəkildə mobil versiya 1xBet giriş edə və məlumatlarınızı təhlükəsizlikdən əmin olaraq daxil edə bilərsiniz.

1xBеt аltеrnаtiv linkin Аzərbаyсаn üçün аktuаl ünvаnını tарmаğın ən təhlükəsiz üsulu оnu bukmеykеrin əməkdаşlаrındаn sоruşmаqdır. 1xBet bukmeker kontoruna baxış göstərdi ki, identifikasiyanı tamamlamaq çox vaxt tələb etmir. PlayStore-a daxil olub, axtarış edib, mərc şirkətinin just one back button bahis mobil versiyası tətbiqini yükləyə bilərsiniz. Ancaq mərc saytında baçqa çoxsaylı ödəniş üsullarının təklif olunması sizə bu çatışmazlığı hiss etdirməyəcək. Depozit açmaq da mümkündür, bunun üçün proqramın quraşdırılmasını başa çatdırmalı və Qeydiyyat elementini seçməlisiniz. 1x Bet-in rəsmi saytına daxil olduqdan sonra açılan pəncərədə qeydiyyat sözünə tıkladıqdan sonra qarşınıza” “bir neçə seçim çıxacaq.

Rəsmi 1xbet Mobi Versiya Girişi 1xbet Mobile Versiyası Azərbaycan Üçü Beauty And Fashions B

1xBet mərc şirkəti 1xBet mobi versiyası ilə burada öz üstünlüyünü vurğulayır. Mobil versiya giriş edə və üstünlüklərdən yararlana bilərsiniz. Qeydiyyat bonusu Bu təklif yalnız virtual idman bahislərinin pərəstişkarlarına uyğun gəlir. Bundan başqa, nəzərə almaq lazımdır ki, bonus ekspress tipli Mərc və 3-x hadisədən hesablanır. Aksiyanın əsas üstünlüyü ondadır ki, əmsallar üzrə şərait yoxdur, buna görə kuponda nəticələr istənilən kotirovkalarla onda bilər. Müştərilərə bir satırda ən arizona 20 bahis müvəffəqiyyətsiz olması halında müştərilərə 100 dollarlıq pulsuz bahis təklif edir … bir az zərbəni yumşaldır.

“Kuboklar” da müntəzəm olaraq işləyir və müəyyən bir dövrdə müəyyən bir sıra bahislər yerləşdirənlərə pulsuz bahislər verildiyi digər promoslar da var. Canlı rejimə daxil olmaq üçün 1xBet üst idarəetmə panelindən istifadə edirəm. Ekranın mərkəzi hissəsində, hazırda oynanan populyar matçları proqnozlaşdırmağım təklif olunur. Şirkətin yeni başlayanlar və pərəstişkarları üçün xoş bir mükafat təmin edilir. Mərc etməyə başlamaq üçün qeydiyyatdan keçdikdən sonra hesabınızı maliyyələşdirin. Elektron cüzdan və bank kartlarından köçürmələr daxil olmaqla müxtəlif metodlardan istifadə edərək əmanət edə bilərsiniz.

⚽bukmeker Kompaniyasinda Hansi Hadisələrə “online” Olaraq Mərc Etmək Olar?

Tətbiqini işlədərək mobil versiya 1xBet giriş əldə edə bilər və məlumatlarınız təhlükəsizliyi baxımından tam rahat ola bilərsiniz. 1xbet mobile öz şəxsi proqnozlarını gerçək pula çevirmək üçün real imkandır. 1xBet bukmeker şirkəti dəstəklədiyi ödəniş üsulları üzrə dünya lideridir.

var. Sırada siz milli futbol çempionatı və ya Çempionlar Liqası çərçivəsində baş tutan matçlar da daxil olmaqla müxtəlif idman tədbirlərini tapa bilərsiniz. Əsas səhifədə siz qumar saytının ziyarətçiləri üçün ən uyğun məlumatları ehtiva edən bannerləri görə bilərsiniz.

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