Glory Casino İncelemesi Türkiye’nin En İyi Casino Sitesi

Glory Casino Türkiye En Yeni Çevrimiçi Kumarhane: Bonuslu Popüler Slot Makineleri: Genel Bakış 2022

Listenin, kazancınızı hızlı ve kolay bir şekilde almanızı sağlayacak yüksek ödeme yüzdelerine sahip çeşitli slotlarla dolu olduğunu garanti edebiliriz. 💸 Parasal limitlerle ilgili ek bilgiyi resmi casino web sitesinde bulabilirsiniz. Kumarhanedeki para çekme işlemlerinin zaman çerçevesi seçilen yönteme bağlıdır. Neteller, Paypal ve Skrill gibi e-cüzdanlarda para çekme işlemleri genellikle 24 saat içinde gerçekleştirilir.

Gerçekten de, kullanıcılar genellikle çevrimiçi oyun sitelerinde sorun yaşamaları durumunda istedikleri zaman bir yöneticiyle konuşabileceklerini takdir ederler. Son olarak, seçtiğiniz ödeme yöntemi ne olursa olsun, hesabınıza genellikle anında para yatırılır. Durum böyle değilse, bir müşteri hizmetleri temsilcisiyle iletişime geçmeniz şiddetle tavsiye edilir.

Glory Casino Türkiye Için Mükemmel Bir Seçim

Buna ek olarak, ilgili kumar otoritesi tarafından düzenli olarak denetlenmektedir. Bu, oyunculara korunmaları için mevcut standartları karşıladıklarına dair güvence verir. Glory online casino, 300 $ + 250 ücretsiz dönüşe kadar Hoş Geldiniz teklifiyle öne çıkıyor. Ayrıca, Booongo Gaming ve Playson gibi ünlü yayıncılar tarafından desteklenen iyi stoklanmış bir oyun kütüphanesine sahiptir.

Ödeme yöntemleri ülkeye ve kullanılan para birimine bağlı olarak değişiklik gösterebilir. En sıcak casino bonusları ile kazanan bir çılgınlığa başlamaya hazır olun. Maç bonuslarından ücretsiz spinlere kadar, bu özel teklifler ekstra bir avantaj sağlar ve büyük kazançlar için fırsatlarınızı artırır. Casino derecemiz, dünya çapında oyuncuların güvenini kazanan saygın ve güvenli kumarhanelere yönlendirerek pusulanız olarak hareket eder glory casino.

Glory Casino Incelemeleri: Artılar Ve Eksiler

Glory Casino’nun benzersiz oyun seçenekleri, güvenilir ödeme yöntemleri ve müşteri hizmetleri, Türkiye’deki online casino oyuncuları için ideal bir seçenektir. Daha fazla bilgi için Glory Casino resmi web sitesini ziyaret edebilirsiniz. Glory Casino, Türkiye’de online casino oyunları oynamak isteyenler için en iyi seçeneklerden biridir. Zengin oyun seçenekleri, cömert bonuslar ve güvenilirlik açısından diğerlerinden ayrılır.

Web sitesinde kumar bağımlılığıyla mücadeleye yardımcı olabilecek hizmetlere bağlantılar da bulunmaktadır. 🤑 Canlı krupiyeler, gerçek zamanlı video yayınlarının yapıldığı gerçek stüdyolardan çalışarak fiziksel bir kumarhaneye benzer bir atmosfer yaratır. Glory Casino, Visa, Mastercard, Skrill, Neteller ve daha birçok popüler ödeme yöntemini kabul etmektedir. Para yatırma işlemleri için banka kartları, Bkash, Nagad, Rocket arasında seçim yapabilirsiniz. Glory Casino mobil uygulamasının yayınlandığını duyurduğunda size haber vereceğiz. Dahası, platform hafta sonları ve resmi tatillerde bile 7/24 açıktır.

Yeni Kumarhane: Baba Kumarhanesi

Ayrıca, mobil cihazlarınızdan da Glory Casino’ya erişebilir ve oyunlarınızı istediğiniz zaman oynayabilirsiniz. Özetle Glory Casino, geniş bir oyuncu yelpazesine hitap eden, güvenilir ve kullanıcı dostu bir online kumarhanesi gibi görünmektedir. Ancak, tüm kumar türlerinde olduğu gibi, oyuncuları sorumlu bir şekilde kumar oynamaya ve ilgili risklerin farkında olmaya teşvik ediyoruz. Unutmayın, oyun oynamanın temel amacı her zaman eğlence olmalıdır.

Para çekme talebinizin işlem süresi genellikle 3 ila 5 iş günüdür. Ancak, son ödeme tarihinin ertelenmesine neden olabilecek gecikmeler olabilir. Cep telefonunuzun tarayıcısında resmi Glory Casino web sitesini açmanız yeterlidir. Glory Casino’da ödemeleri kredi kartı, banka havalesi, e-cüzdan gibi farklı yöntemlerle yapabilirsiniz. Ödeme yöntemine bağlı olarak, ödemeler anında veya birkaç iş günü sürebilir. Bu, her türlü ihtilaflı durumun kumar endüstrisini düzenleyen katı mevzuata göre ele alınacağını garanti eder.

Rakipsiz Bonus Seçimleri

Formda istenen bilgileri doğru ve eksiksiz bir şekilde doldurun, ardından hesabınızı oluşturmak için talimatları izleyin. Ayrıca, Glory Casino’da tüm ödemeleriniz SSL şifrelemesiyle korunmaktadır. Bu sayede, kişisel ve finansal bilgilerinizin güvenliği konusunda endişe etmenize gerek kalmaz. ⚠️Ayrıca casinodan e-postayla gönderilen bağlantıya tıklayarak kayıt sırasında verilen e-posta adresini onaylamanızı da öneririz. Çevrim şartlarını yerine getirdiğinizde bonus otomatik olarak ana hesabınıza aktarılacaktır. Oturum açma, unutulan şifreler veya başarısız işlemlerle ilgili herhangi bir sorunla karşılaşırsanız lütfen hemen destek müşterileriyle iletişime geçin.

Ayrıca, kumarhane her para yatırma işlemi için herhangi bir ücret talep etmez. Bu nedenle, seçiminizi yapmadan önce bu konuda bilgi edinmeniz önemlidir. Bu teknoloji, kullanıcı ile casino sitesi arasındaki veri aktarımının korunmasına yardımcı olur. Dolandırıcıların verilerinizi almak için şifrelemenin anahtarını bulması çok zor olacaktır. Daha önce de belirttiğimiz gibi, kumarhane Curacao tarafından lisanslanmıştır ve bu da kumarhanenin en son güvenlik önlemlerini uygulamasını zorunlu kılmaktadır. Evet, Glory Casino düzenli olarak bonuslar ve promosyonlar sunmaktadır.

Hangi Ödeme Yöntemleri Sunuluyor?

Bazı ülkelerde kredi kartı ile para yatırma işlemlerinde kısıtlamalar olduğu da unutulmamalıdır. Ancak, platform, duruma bağlı olarak bu kısıtlamaları ayrı ayrı kaldırma hakkını saklı tutar. Kayıtlı bir kullanıcı olmanın bariz faydaları arasında, her şeyden önce binlerce slot makinesine erişim bulunmaktadır. Oyun odasında, onlarca yıldır rakipsiz klasikler olarak kabul edilen eski slotları bulacaksınız. Ancak sadece 2022’de gün ışığını gören yepyeni gelişmeler de var.

Şimdi, kumarhanenin e-postanızı onaylamak için bir e-posta göndereceği e-postanızı kontrol edin. Artık para yatırabilir, bonuslarınızı etkinleştirebilir ve slot oynayabilirsiniz. İlk para yatırma işlemlerini bu ödeme yöntemleriyle yaparlarsa Glory Casino hoşgeldin bonusu. Şirket, tüm oyunculara üstün müşteri destek hizmetleri sunmaya kendini adamıştır.

Oyun Seçenekleri

Bu konuda endişelenmenize gerek yok – tüm Glory Casino oyuncuları bir casino hesabına her kayıt olduklarında bu süreçten geçerler. Bunun için iyi kalitede bir vesikalık fotoğrafa ihtiyacınız olacaktır, böylece bilgileriniz açıkça görülebilir. Çoğu zaman, bunları kumarhanenin e-posta adresine veya destek sohbet odamıza göndermek isteyeceksiniz. Dünya çapında milyonlarca oyuncu Glory Casino’nun üyesidir, siz de bize katılın! Tek yapmanız gereken kumarhanenin kaynaklarından birine kaydolmak – resmi web sitesi, ayna veya mobil uygulamamız. Aşağıda, kayıtlı bir Glory Casino üyesi olmanın tüm avantajları hakkında adım adım talimatlar ve ayrıntılar bulacaksınız.

Her spin hayatını değiştiren kazançlar olasılığını elinde tuttuğu çevrimiçi slot oyunlarımızın heyecanını ve heyecanını deneyimlemeye hazır olun. Mevcut en ödüllendirici casino bonusları ile oyun tutkunuzu ateşleyin. Özel tekliflerden VIP avantajlarına kadar, bu teşvikler oyununuzu geliştirir ve kumarhaneye her ziyareti unutulmaz bir macera haline getirir. Bu özellik, Casino Glory’nin değerlendirmeleri üzerinde kesinlikle bir etkiye sahip olacaktır.

Glory Casino Mobil Oyunları

Burada, herhangi bir konuda yardım veya tavsiye alabilirsiniz. Ve tabii ki, mobil uygulama var. Bu resmi Glory Casino geliştirmesi, kullanıcıların favori oyunlarına erişmelerini kolaylaştırır. Burada kayıt olabilir, para yatırabilir ve hatta ikramiyeyi kazanabilirsiniz. Glory Casino, çeşitli oyun seçenekleri sunan bir casinos platformudur. Slot makineleri, rulet, blackjack, poker ve daha birçok casino oyununu burada oynayabilirsiniz. Üstelik bu oyunlar, en kaliteli oyun sağlayıcıları tarafından desteklenmektedir.

Ek olarak, kullanıcı arayüzünün birden fazla dilde mevcut olması, Glory Casino’yi dünya çapındaki oyuncular için ideal bir seçim haline getiriyor. Ne yazık ki, Glory Casino şu anda bir mobil uygulama sunmuyor. Ancak, internet sitesine bir tarayıcı aracılığıyla, akıllı telefondan veya tabletten erişebilirsiniz. Mobil versiyon uygun, ergonomik, kapsamlı ve kullanımı kolaydır.

Video Poker

Hayır, bu online casino tarafından sunulan oyunların çoğuna kayıt olmadan erişebilirsiniz. Demo modunda oynayacaksınız ve herhangi bir gerçek para kazancı elde etmeyeceksiniz. Ancak, gerçek parayla oynamak için bir hesap açmanız ve bu hesaba para yatırmanız gerekir. Glory Casino platformu, müşterilerinin verilerinin korunmasını sağlamak için SSL şifrelemesini kullanır. Ayrıca, mevcut olan tüm ödeme yöntemleri güvenilir ve güvenlidir.

Glory Casino, kullanıcılarının güvenli ve kolay ödemeler yapabilmesi için birçok farklı ödeme yöntemi sunmaktadır. Kredi kartı, banka havalesi, elektronik cüzdanlar ve daha birçok seçenek arasından istediğinizi seçebilirsiniz. Sitemizdeki kapsamlı oyun arama ve filtre seçeneklerinden yararlanarak ruh haliniz için mükemmel çevrimiçi slot oyununu bulmayı kolaylaştırır.

Masa Oyunları

Bu onay adımlarından sonra, geriye kalan tek şey Glory Casino’da ilk para yatırma işleminizi yapmak ve bonusunuzu talep etmektir. Ayrıca, çoğu oyunda gerçek parayla bahis oynamadan önce demo modunda pratik yapabilirsiniz. Canlı krupiyeli oyunların tutkunları, bu sağlayıcıların sunduğu 80’den fazla premium oyunun seçimini takdir edeceklerdir. Dünyanın online oyun arenasında öne çıkan bir oyuncu olarak ortaya çıkan, Glory Casino her beceri seviyesindeki oyunculara hitap ediyor. 2018 yılında kurulan web sitesi, gezinme kolaylığı ve kullanıcı dostu bir deneyim için tasarlandı ve çok çeşitli büyüleyici slotlar ve diğer oyunlar içeriyor. Glory Casino, online olarak oynanabilen bir casino oyun platformudur.

Gerçek parayla oynayabilir ve çeşitli casino oyunlarını deneyimleyebilirsiniz. Glory Casino’nun müşteri hizmetleri ekibi, 7/24 hizmet verir ve oyuncuların her türlü soru ve sorununu çözmek için hazırdır. Canlı chat, e-posta ve telefon gibi farklı iletişim kanalları sayesinde oyuncuların her zaman destek alabileceği bir ortam sunulmaktadır. Glory Casino, güvenlik ve oyuncu bilgilerinin gizliliğine büyük önem vermektedir. Site, gelişmiş SSL şifreleme teknolojisi kullanarak oyuncuların kişisel ve finansal verilerini korur. Ayrıca, yetkili bir oyun lisansına sahip olan Glory Casino, adil oyun politikalarıyla da bilinmektedir.

Glory Casino Bonusları 🎁

Hoş geldin bonusu, depozit bonusu, ücretsiz dönüşler gibi çeşitli bonuslar ve promosyonlar mevcuttur. Bu bonusların kullanım koşullarını öğrenmek için Glory Casino’nun promosyonlar sayfasını ziyaret edebilirsiniz. Casino bonuslarının büyüsünü keşfedin ve bir olasılık dünyasının kilidini açın. Özel promosyonlardan VIP ödüllerine kadar, bunlar oyun deneyiminizi geliştirir ve her ziyareti kumarhaneye unutulmaz hale getirir. Ödeme yöntemleri arasında BKash, Rocket, Nagad, NetBanking, UPI, Skrill, EcoPayz, kripto para birimleri ve kredi kartları yer alıyor.

Glory Casino’nin güvenlik hizmeti 7/24 hizmet vermekte olup, yasa dışı faaliyetleri her an engellemeye hazırdır. Şirket, özel yazılım platformumuz aracılığıyla güvenliğe öncelik vermektedir. Bu yazılım kritik bilgileri şifreler ve veritabanlarına yetkisiz erişimi kısıtlar. Kullanıcı hesabının hacklenmesi riski neredeyse tamamen ortadan kaldırılmıştır. İki faktörlü kimlik doğrulama prosedürünü kullanarak hem kişisel verilerin hem de finansal hesapların güvenliğini sağlayarak daha yüksek düzeyde koruma elde ederler. ⚡️ Glory Casino’nin öne çıkan özelliklerinden biri de büyük ilgi toplayan cazip hoşgeldin bonusu paketidir.

Glory Casino’de Spor Bahisleri ⚽️

Bu oyun platformu 2021 yılında faaliyete geçti ve kısa sürede çevrimiçi kumarhane alanında kendini kanıtladı. Glory Casino web sitesi, bölgedeki oyuncular için daha erişilebilir olması amacıyla birkaç farklı dile çevrilmiştir. Curacao lisansı ile yasal olarak faaliyet gösteren Glory Casino’nun güvenilirliği de dikkate değerdir.

Ana sayfaya geldiklerinde ziyaretçiler, üst kısımda kumarhanenin tekliflerini gösteren bir kaydırıcıyla karşılanır. Logoyu, menüyü, oyun kütüphanesi bağlantılarını, kayıt ve oturum açma düğmelerini içeren başlık düzenli bir şekilde düzenlenmiştir ve kullanımı kolaydır. Evet, Glory Casino yeni oyunculara hoş geldin bonusu sunmaktadır. Kayıt olduğunuzda ve ilk para yatırmanızda alabileceğiniz bonuslar mevcuttur.

Güvenlik Ve Lisans

Glory Casino’nin operasyonları, Curacao Kumar Komisyonu’ndan #365/JAZ lisansı ana lisansına sahip olan YASHA Limited tarafından yönetilmektedir. Ayrıca kumar şirketi, Kıbrıs’ta kayıtlı Bettor IO NV’nin bir yan kuruluşudur. Glory Casino internet sitesine giderek ‘Kayıt Ol’ veya ‘Hesap Oluştur’ gibi bir buton bulunur. Bu butona tıklayarak gerekli bilgileri doldurmanız ve hesap detaylarınızı oluşturmanız gerekmektedir. Bunun yanı sıra, Glory Casino’da sadakat programı bulunmaktadır. Bu program sayesinde oyuncular, oynadıkça kazandıkları puanlarla çeşitli ödüller elde edebilirler.

Yüksek sadakat seviyesine ulaşan oyuncular, özel ayrıcalıklara ve VIP hizmetine de erişebilirler. Kapsamlı derecemizle, sorumlu kumar ve oyuncu refahına öncelik veren çevrimiçi casinolarla güvenle etkileşime girebilirsiniz. Ancak, bazı ülkelerin yasaları gereği oyunculara erişim kısıtlamaları olabilir. Son olarak, işlem devam ederken para çekme işleminizi iptal edebileceğinizi unutmamanız önemlidir.

Glory’de Canlı Casino 🎲

Slot oyunlarından masa oyunlarına, canlı krupiyeler eşliğinde oynanan oyunlardan jackpot oyunlarına kadar birçok seçenek mevcuttur. Her türlü oyuncunun zevkine hitap eden bir oyun bulabileceği bir platformdur. Pek çok oyun sağlayıcısının oyunlarını barındıran Glory Casino’da, güncellenen ve trend olan oyunları bulabilirsiniz. Hesabınız doğrulandıktan sonra para çekme işlemi yapabilirsiniz. Bu belki de oyuncuların konuyla ilgili güçlü görüşlerini haklı çıkarmaktadır.

Buna ek olarak, platform ilk para yatırma işlemlerinde ilginç hoş geldin bonusları sunuyor. Son olarak, size birkaç güvenilir ve güvenli ödeme yöntemi arasında seçim yapma şansı verir. Glory Casino’yu keşfettiğinizde, 1 . 500’den fazla oyun sunduğunu göreceksiniz. Slot ve video pokerden canlı masa oyunlarına kadar herkes için bir şeyler var.

Glory Casino: Oyun Sağlayıcıları

Bunu yapmak için işlemler sayfasına gidin ve iptal emrini verin. Bununla birlikte, siteye bir tarayıcı aracılığıyla bir mobil cihazdan erişebilirsiniz. Son olarak, bir kullanıcının çevrimiçi casinolara kaydolabilmesi için en az 18 yaşında olması gerektiği unutulmamalıdır. Başlangıç bonusu aktif olduğu sürece oyun hesabınızdan para çekemezsiniz.

Glory Casino’ya kaydolarak, heyecan verici bir oyun deneyimi yaşayabilir ve büyük kazançlar elde edebilirsiniz. Bu güvenilir casino sitesi, Türkiye’deki oyuncular için mükemmel bir seçimdir. Dahası, site oyuncuların yanı sıra fonlarının güvenliğini sağlamak için elinden gelenin en iyisini yapar. Ayrıca, müşteri hizmetleri yetkin, duyarlı ve her saat mevcuttur.

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