“Pin Up Casino ️ Azərbaycanın Rəsmi Saytı

Pin-up 306 Casino ᐉ Rəsmi Kazino Saytı Pinup Onlayn

Bunu etmək üçün əsas səhifədəki “Qeydiyyatdan keç” düyməsini basın və sonra görünən formada şəxsi məlumatları daxil edin. Onlayn Pin Upward casino online rubl,” “manat, dollar və avro ilə mərc etmək imkanı verir. Qeydiyyat zamanı valyutanı seçə bilərsiniz, bundan sonra onu dəyişdirmək mümkün deyil. Mobil proqramı yükləmək üçün rəsmi App Store və Play Market mağazalarını ziyarət edə və orada kazinonun adı ilə proqram tapadera bilərsiniz.

Pin Up Bet Azərbaycan’ın hoş geldiniz bonusu, yeni üyelerinin ilk yatırımlarını əla bir başlanğıc ilə mükafatlandırmaq imkanı verir. Bu detallar, Pin-Up Bet’in şirkət kimi necə qurulduğunu, ilk fəaliyyət günündən bu yana necə tərəqqi etdiyini və Azərbaycan qumar bazarındakı mövqeyini daha yaxşı anlamağımıza kömək edir. Şirkətin lisenziyası və qumar oyunlarına dair tələbləri, oyunçulara platformanın qanuni və etibarlı olduğunu hissettirir, bu da bahis zamanı rahat və emin olmalarını təmin edir. Pin-Up Bet saytının dizaynı, qaranlıq fonda rəngarəng düymələr, ikonlar və bannerlərlə bəzədilmiş, sadə və istifadəçi-dostu bir interfeys təklif edir. Pin-Up Bet Azərbaycan istifadəçiləri saytın intuitiv naviqasiyası sayəsində asanlıqla əsas səhifəyə daxil olaraq, bahis qoymaq üçün lazımi bütün funksiyaları tapa bilərlər. Əsas menyudan şirkətin ən vacib bölümləri olan təqdimatlar və xəbərlərə keçid edə bilərsiniz.

Pin Up Casino Arizona Saytında Qeydiyyat Və Şəxsi Kabinetə Giriş

Onu kliklədikdən sonra poçtdan artıq oyun hesabı yaradılan bukmeker kontorunun rəsmi portalına yönləndirilirsiniz. Pin Up bet casino xüsusiyyətlərindən biri avtorizasiyanın yalnız telefonla həyata keçirilməsidir. Hər dəfə sayta daxil olan zaman müştəri avtorizasiya üçün parol olan SMS kodu alır https://pin-up-azerbaycan24.com.

Məhz bunun sayəsində ziyarətçilər uduşları almaq və əmanəti artırmaq üçün əlavə imkanlar əldə etmək imkanı əldə edirlər. Pin Up on line casino az sayta daxil olan oyunçular bukmeker kontorunda qeydiyyatdan keçərək müxtəlif yarışların finallarına mərc edilə bilən pulsuz mərc mükafatı əldə edə bilərlər. Ən azı gecə-gündüz pul mərc edə bilərsiniz – burada siz real pul mükafatı qazana, həmçinin onu hər hansı bir şeyə xərcləyə bilərsiniz.

Pin Up 306 Casino Rəsmi Saytında Oynamaq Və Bahis Et

Sonra tam versiyaya yüksələ və pulla oynaya bilərsiniz. Uğurlu rewrite halında, mükafat məbləği balansa köçürüləcəkdir. Onu dərhal karta və ya başqa ödəniş aləti vasitəsilə çıxarmaq olar. Azərbaycanda qumar oyunları dövlətə görə dəyişir, çünki Azərbaycan ştatlarının qumarla bağlı fəaliyyətləri tənzimləyən öz qanunlarını tərtib etmək hüququ var.

Buna görə də oyunçular yalnız fərzlər edə və bloklanmanın yolunu axtara bilərlər. Ayrıca, mobil tətbiqetmənin bloklanmanın dəf edilməsi üsulu kimi istifadə edilə biləcəyini nəzərə almalıyıq. O, əks saytın alternativi kimi istifadə edilə bilər, çünki u, bloklanmır. Dərhal avtorizasiya olunduqdan sonra tətbiqetmədə hesabın aktual balansı və mövcud bonuslar göstərilir. Həmçinin internetdə Pin-Up 635, one hundred thirty five, 188 və digər əks saytları tapmaq mümkündür.

⚽ Rəsmi Sayt Pin-up Oyunu- Idman Mərcləri Və Bukmeker Kontoru

asandır və sadədir. Pin-up onlayn kazinosu səxavətli bonusları və hədiyyələri ilə tanınır və bunu müntəzəm olaraq platformadan istifadə edən və mərc qoyan

şirkəti xidmətlərindən istifadə etməyi təklif edir. Gördüyünüz kimi, idman mərcləri yerləşdirmək https://pin-up-azerbaycan24.com/yukle/

Suallar Üzrə Cavablar

Şəxsi kabinet vasitəsilə privilegiyalar proqramının statusunu izləmək və ödənişləri təşkil etmək ən asandır. Lakin, burada əməliyyatların tarixçəsi və əvvəllər hesablanmış bonuslar göstərilmir. Oyunlar rahatlıq üçün bir neçə kateqoriyaya ayrılmışdır. Ayrıca bölmələrdə jackpot avtomatları, crash və canlı oyunlar təqdim edilir. Məsələn, Asiyaya, Qədim Misirə, mifologiyaya, heyvanlara və ya klassikaya həsr olunmuş avtomatları seçmək mümkündür.

Oyunçular öz rəylərində yazırlar ki, Pin Up kazino saytında əmanətlər olmadan qarşılanma təmin edilmir. Pin Up online casino online tərəfindən təklif olunan bütün bonuslar öz oyunçu ofisində aktivləşdiriləcək. Onlayn kazinoda hədiyyə almazdan əvvəl, uduşların çıxarılması ilə bağlı problem olmaması üçün onu mərc etmək şərtləri ilə (müəyyən bir peyjerlə) tanış olmalısınız. Qonaqlar kazinonun mobil proqramından istifadə edərək Pin number Up casino oyun avtomatında əylənə bilərlər. Slot maşınlarını oflayn oynamaq üçün istifadəçilər Pin Up on line casino müştərisini Android və ya iPhone-da yükləməlidirlər. Və belə platformalar internetə qoşulmadan de uma rahatlıqla oyunu oynamağa imkan verir.

Pin Up Casinorəsmi Saytında

Platforma klubun e-poçt bülleteninə abunə olanlara belə bir promosyon koduverir. Virtual qumar dünyasını hər kəs üçün daha əlçatan etmək üçün Pin Up mobil casino hazırladıq.

Bu, doğrulama prosesini tamamlayır və yalnız bir neçə dəqiqə çəkəcəkdir. “Professional” QIWI pul kisəsinin qeydiyyatdan keçdiyi mobil nömrədən istifadə etmək yalnız qeydiyyatdan keçərkən vacibdir. Mobil operatorların xidmət nöqtələrində QIWI pul kisəsinin identifikasiyası xidməti ödənişlidir — 5 manatdan thirty AZN-ə qədər.

Pin Up 306 Bet Betting (i̇dman Və Digər Mərclər)

Bunu yalnız 18 yaşını tamamlayan oyunçular edə bilər. Hesab yaradıldıqdan sonra, bu, depozit qoymağa, müxtəlif promo təkliflərdə iştirak etməyə, qazancları çıxarmağa imkan verir. Qeydiyyatdan sonra qeydiyyat bonusu da əlçatan olur.

Ölkəmizdə qumar oyunlarının aparıcı virtual platforması Pin Up onlayn kazinodur. Pin-up, seçim etmək üçün iki rejimdə – demo və real pulla oynamaq təklif edir.

Şəxsi Məlumatların Təhlükəsizliyi Və Qorunması

Bölmələrin sadələşdirilmiş tərtibatı cib qurğularının sahiblərinə lazım olan məlumatları tez tapmağa imkan verir. Mobil kazinoda xüsusi effektlər və animasiya elementləri olmadığı üçün səhifələrin slotlarla yüklənməsi bir neçə saniyə çəkir. Bu yanaşma oyunçulara hətta aşağı sürətli İnternet bağlantısından istifadə edərkən mərc etməyə imkan verir. Proqramı cihaz parametrlərində quraşdırmadan əvvəl naməlum mənbələrdən yüklənmiş proqram təminatının quraşdırılmasına icazə verməlisiniz. Əks halda, proqram təminatının yüklənməsi xəta ilə başa çatacaq.

Bunu yalnız hesabı qeydiyyatdan keçmiş oyunçular edə bilər. Öz növbəsində, hesabdan pul çıxarmaq üçün əvvəlcə verifikasiyadan keçmək lazımdır. Əməliyyat növündən asılı olaraq, ödəmə vasitələrinin siyahısı fərqlənir.

Pin-up 306 Rəsmi Sayt Kazino ᐉ Pin Up Onlayn Oynamaq

Bundan əlavə, istədiyiniz uduş məbləğini göstərə bilərsiniz. Sonra sistem avtomatik olaraq dərəcəsi dəyəri hesaplarız. Belə geniş funksionalın sayəsində pin ap ən yaxşı onlayn bukmeker şirkəti hesab olunur. Məsələn, bir meyvə yuvasında, çarxlarda limon, portağal, albalı, qarpız təsvirləri olan nişanlar görünür. Misirdə qədim əlyazmalar, fironlar, qəbirlər, skarab böcəkləri, sfenkslər olan nişanlar var. Onlarla mərc oynamağa başlamalısınız, çünki top slotlarda yüksək RTP, maraqlı süjetlər və xüsusi funksiyalar var.

Siz avtorizasiya üçün telefon nömrəsi və TEXT MESSAGE istifadə edərək, “Pin Up” xidmətinə giriş və parol olmadan daxil ola bilərsiniz. Bundan əlavə qonaqlar VK, Facebook və ya Google hesabları vasitəsilə Pin-Up casino saytında hesabı aktivləşdirə biləcəklər. Bonusları aktivləşdirmək istəyirsinizsə, istifadə şərtlərini oxumalısınız.

Salamlama Və Depozitsiz Bonusların Geri Qazanılması Xüsusiyyətləri

Həmçinin, gift-box açmaq, pinkoinləri dəyişmək, promo kodu aktivləşdirməklə müxtəlif bonuslar əldə etmək mümkündür. Əsas məqam promo-təklifləri aktivləşdirməzdən əvvəl konkret bonusun şərtləri ilə tanış olmaqdır. Aksiyalar siyahısı daim yenilənir, buna görə də mövsümi və müvəqqəti promo-təkliflərin mövcudluğunu nəzərə almaq vacibdir.

Onlayn kazino” “müasir oyun sənayesinin ayrılmaz hissəsidir. Qazanclı və maraqlı oynamaq üçün yalnız yüksək keyfiyyətli oyun klublarını seçməlisiniz. Onlar təhlükəsiz, etibarlı və funksional olmalı, həmçinin müntəzəm uduşlara zəmanət verməlidirlər. Son zamanlar Azərbaycan qumar oyunları istiqamətində fəal inkişaf etməyə başlayıb və bu gün Pin-Up casino ölkədə ən populyar kazinolardan biri hesab olunur. Məşhur Pin-Up casino 2016-cı ildə yaradılıb və 2016-cı ildə Azərbaycanda fəaliyyətə başlayıb. Şirkətin işi milli orqanlar və beynəlxalq tənzimləyici Curacao tərəfindən lisenziyalaşdırılıb.

Müştərilərin Bukmeker Kontorunun Qeydiyyatı Və Yoxlanılması Pin Up

Qeydiyyatın tamamlanması üçün «Mən Qaydalar və Şərtlərlə razıyam» xəttində qalıq qoymaq vacibdir. Qeydiyyat mərhələsində həmçinin qeydiyyat üçün bonus növünü seçmək mümkündür. Bu, idman mərcləri və kazino üçün 2 variantda mövcuddur. Bunun üçün göstərilmiş telefon nömrəsini təsdiqləmək lazımdır, buna sms ilə unikal kod göndərilir və email’i əlaqələndirmək üçün gələn xoş gəldin məktubundakı keçidə keçmək gərəkdir.

Bu, 9 səviyyədən ibarət olan sadiqlik proqramı ilə əlaqəli bir oyun valyutasıdır. Mükafat xallarının sayı depozitin məbləği ilə müəyyən edilir. Yeni müştərilər hesabı doldurma, e-poçtu yoxlama və təsdiqləmə qarşılığında pinkoinlər alırlar. Toplanmış xallar ouonçunun səviyyəsini artırır və real pula dəyişdirilə bilər. Pin-Up AZ saytının ziyarətçiləri şəxsi hesablarına daxil olaraq gecə-gündüz idmana mərc edə və real vaxt rejimində matçların gedişini izləyə bilərlər.

Pin Up Casino 🎁 Online Az ( Azerbaijan ) ⏳ Пин Ап Казино ⏳ Pinup Rəsmi Saytı 💰 Flag Ap Bet ( Betting ) 306

Bunu da qeyd etmək lazımdır ki, Pin Up casino saytının müştərisi qeydiyyatdan dərhal sonra depozitsiz bonus hədiyyə olaraq alır. Dərhal depozit olmadan mükafat görünəcək bir bölmə olacaq. Depozitsiz məbləğ oyun üçün az miqdarda bir puldur. Onu Şəxsi Kabinetdə aktivləşdirmək mümkündür, amma unutmayın ki, belə mükafatı oynanmaq olmaz. Kazino sahibləri kodları təsadüfi olaraq üçüncü tərəf resurslarına paylayır və bir qayda olaraq, bu barədə daimi kazino müştərilərinə belə xəbərdarlıq etmirlər. Bütün mənfi fikirləri kənara atmaq vaxtıdır – bizim sizin üçün əla xəbərlərimiz var!

İdman mərc oyunlarında cashback – şirkət tərəfindən verilən bonuslar şəklində itirilmiş vəsaitlərin qaytarılmasıdır. PinUp casino saytında cashback bütün istifadəçilərə təqdim rdilir. Bununla yeni” “başlayanlar uduzduqları məbləği geri ala və geri qazanmağa çalışa biləcəklər, lakin bunun üçün siz bu added bonus təklifinin qaydalarını bilməlisiniz. Pin Up online casino saytında balansın hər doldurulması qarşılığında oyunçulara pincoinlər təqdim olunur.

Xülasə: Pin-up Bukmeker Kontorunun Üstünlükləri Və Mənfi Cəhətləri

Pin-Up bukmeker kontorunun bir çox müştərisi rəsmi veb saytın belə bir çatışmazlığını movie yayımların olmaması kimi qeyd edir. Sonuncular əksər canlı hadisələr üçün saxlanılan qrafik uyğunluq mərkəzi ilə əvəz olunur. Pin-Up-də müştəri profili yaratmaq üçün Azərbaycan kodu ilə mobil telefon nömrəsini daxil etməlisiniz. Növbəti addım müştərinin e-poçt ünvanını təyin etməkdir.

Pin Up Bet ilə bahis həyəcanını hər yerdə keçirmək istəyən oyunçular üçün təqdim olunan mobil tətbiq və saytın mobil versiyası həqiqətən qiymətli imkanlar təklif edir. Yüksək dərəcədə optimizasiya olunmuş mobil sayt, istifadəçilərə rahat naviqasiya və sürətli mərc qoyma imkanı verir. Hansı seçimi edərsəniz edin, Pin Upward Bet həmişə ən yaxşı onlayn bahis təcrübəsini sizə təqdim etmək üçün çalışır. Pin Up Bet mobil tətbiqini Android istifadəçiləri üçün” “yükləmək olduqca sadədir. İlk addım olaraq, rəsmi veb saytdan. apk faylını endirin. Sonra, cihazınızın təhlükəsizlik ayarlarına girib “Naməlum mənbələrdən yükləməyə” razılıq verin.

Azərbaycanlıların Pin Up Casino Bukmeker Kontoru Haqqında Rəyləri

Bu oyun klubunda rahat ödəniş xidmətlərindən istifadə etməklə real uduşlar əldə etməklə müxtəlif ölkələrdən gələn qonaqların marağına uyğun oynamaq mümkün olacaq. Klubun öz bukmeker kontoru varifr?n ki, bu de uma ziyarətçilərə idmana idman mərclərini yerləşdirməyi və yarışın nəticələrini düzgün təxmin etdikləri üçün pul mükafatları qazanmağı təklif edir. Onlayn casino Pin Up azerbaijan məşhur CarlettaNV şirkəti tərəfindən idarə olunur. Rəylərində qonaqlar yaxşı xidmət səviyyəsini, qumar oyunlarının yaxşı seçimini və uduşların sürətli ödənilməsini qeyd edirlər.

Sol tərəfdəki yan menyuda isə öncədən qeyd edilmiş və” “canlı bahislər üçün ayrıca bölmələr mövcuddur. Tədbirlər, idman növləri, regionlar və turnirlər üzrə kateqoriyalara bölünmüşdür. Səhifənin mərkəzində, gələcək matçlar və şirkətin cazibədar bonus təklifləri haqqında bannerlər gözə çarpır. Pin-Up Bet saytı bonuslar və promokodlarla oyunçulara daim dəyər qatır.

Android Və Ios Üçün Pin-up Mobil Tətbiqetməsini Yüklə

Pin-Up casino bölməsi yoxdur və idman mərc oyunları yerli qanunvericiliyə w tamtym miejscu uyğun olaraq həyata keçirilir. TsUPIS vasitəsilə işləmək müştərilərə uduşların sürətli və etibarlı şəkildə ödənilməsinə zəmanət verir. “William Hill” MMC “Bukmekerlər Assosiasiyası” SRO-nun üzvüdür — üzvlük şəhadətnaməsi № 8. Müştəri ödənişləri TsUPIS ASC QIWI-bank vasitəsilə həyata keçirilir. Mərclər Pin-Up online casino yeni işə başlamışdır və hələ də böyük sponsorluq müqavilələri və ya intresserad xeyriyyəçilik fəaliyyəti ilə fərqlənmir. Şirkətin populyarlaşdırılması üçün futbol üzrə Azərbaycan milli komandasının kapitanı onun rəsmi səfiri seçilib.

255 AZN məbləğində əmanəti artırmaq üçün oyunçuya kazino Pin Up casino-dən əlavə uduş təqdim olunacaq. Eyni zamanda Pin Upward casino qonaq udduğu” “pulu bank kartlarına və ya onlayn xidmət vasitəsilə məhdudiyyətsiz çıxara bilər. Hesabınızın Kassir bölməsində valyuta ödənişlərini edə 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; }()); })();