7 Perfect Real Money Online Different Roulette Games Sites 2024″

Türkiyenin En Iyi Canlı Casino Sitelerinin Adresi 2024’nin ️ Güvenilir Canlı Casinolar

Bir önceki bölümde iyi ve popüler canlı casino sitelerinin çeşitli lisanslara sahip olduklarından bahsetmiştik. Basitçe anlatmak gerekirse; canli on line casino lisansı, bir canlı casino sitesinin güvenli olup olmadığını belirten en önemli unsurlardan biridir. En çok tercih edilen empieza güvenilir olan canlı casino sitelerinin hepsinin bu sertifikalara sahip olduğunu söyleyebiliriz. Ülkemizde canlı casino oyunları ile alakalı olarak uygulanan bazı yasal prosedürler vardır. Sitelere Türkiye’de yasal olarak lisans veren bir şirket olmadığı için, hiçbir site yasal statüye geçemiyor.

01 Bazı on the internet casinolar Türkçe’yi desteklerken bazıları desteklemez empieza İngilizce okuyabiliyorsanız, Türkçe’yi desteklemeyen casinoları oynayabilirsiniz. E-posta adresinizi empieza telefon numaranızı girdikten sonra, üyeliğinizi tamamlayabilirsiniz. 02 Kredi kartınız varsa, herhangi bir kumarhaneye para yatırabilirsiniz, ancak yoksa, ödeme hizmetinden para yatıracaksınız, bu nedenle ödeme hizmetlerinden bir kumarhane seçin. Pek çok çevrimiçi kumarhane türü vardır ve oynamaya yeniyseniz, neye göre seçim yapacağınızı bilemeyebilirsiniz.

Café Casino

Casino ve canlı casino heyecanını more effective oyuncular için artık bu oyunlar pampre telefonu ve capsule ile oynanabilir durumda. Mobil cihazların empieza internetin yaygınlaşması ile ilk olarak bilgisayara karşı oynanan on line casino oyunları mobil olarak oynanmaya başlamıştı. Şuan her slot oyunu cep telefonu ve tablet için yazılmasa da yeni çıkan ve popüler casino slotları mobil olarak oynanabiliyor. Teknoloji ve internet bağlantılarındaki hızın artması ile Canlı Casino oyunları artık mobil olarak ankle rehab ebook cep telefonu sprained ankle treatment de tablet ile oynanabiliyor. Evolution stüdyolarında oynatılan bu canlı oyunları mobil olarak sunan canlı on line casino siteleri olarak Casino Metropol, Canlı Conservative ve Bets10 ön plana çıkıyor. Bu sitelerde aynı zamanda Türkçe olarak hizmet veren masalarda bulunduğu” “için sorunsuz oyun zevki yaşayabilirsiniz mostbet indir apk.

Bunun yanı sıra canlı casino oyunlarında discount bonusları ve rakeback bonusları ile birlikte kaybettiğiniz paraların belirli bir kısmını geri alabilirsiniz. Yukarıda bulunan para çekme ve yatırma yöntemlerine ek olarak birçok farklı para çekme ve yatırma yöntemi de bulunuyor. Seçtiğiniz canlı casino sitesinin “Ödeme Yöntemleri” bölümüne gelerek sitenin sahip olduğunu ödeme yöntemlerini öğrenebilirsiniz. Türkiye’deki canlı casino siteleri, pra yatırma ve çekme konusunda kullanıcılarına birçok seçenek sunuyor. Hemen aşağıda, bahsettiğimiz afin de yatırma ve çekme araçlarından en popülerlerini öğrenebilirsiniz. Bir canlı casino sitesi kullanmadan önce bilmeniz gereken bütün her şeyi anlattığımıza göre, artık Türkiye’de bulunan sobre iyi canlı on line casino siteleri öğrenmenin zamanı geldi.

🎰 Novajackpot: Live Dealer Casino With Ideal Payout Rate

Bütün bu bahsettiğimiz özelliklerden yazımızın ilerleyen kısımlarında bahsedeceğiz ve bu yazının sonunda, siz de sobre iyi canlı casino sitelerinin hangileri olduğunu öğrenebileceksiniz. Mobil Canlı Casino kulağa sadece oyun oynamak olarak gelebilir ama pampre telefonu ve tabletler ile oyun oynamaktan çok daha fazlasını gerçekleştirebilirsiniz. Hatta artık cep telefonunuz ile müşteri hizmetlerine bağlanarak ister chat ister mail ile temas kurabilirsiniz. Eğlencesine oyun modununda bulunduğu mobil canlı casino sitelerinde sanal para ile de oyunlar oynayabilirsiniz. Mobil cihazlar, taşınabilir oldukları için empieza bilgisayarın günümüzde yerini aldıkları için hayatımızın büyük bir bölümünü onlar ile geçiriyoruz.

Sistemin güncel ve sıkıntısız çalışmasını sağlayan bu yazılımları sağlayan birçok şirket bulunmaktadır. Aşağıda,” “sobre popüler bahis yazılımı sağlayıcıları hakkında bilgi bulabilirsiniz. Az miktarda askeri paranız varsa, bonusları karşılaştırın ve bir kumarhane seçin.

Türkiye’deki En İyi Canlı Online Casino Siteleri Listesi 2021

Bu nedenle üyesi olduğunuz canlı casino siteleri belirli aralıklarla BTK tarafından yapılan engellemelere maruz kalabiliyor. Ancak bu tarz sorunlar site içerisinde hızlı bir şekilde çözülür ve aktif hizmetler devam eder. Yasaklama geldikten sonra siteler tarafından farklı bir giriş adresi belirlenir.

Devlet, sitede oyun oynanmasını tam olarak engellemediği için sadece siteyi kapatıp, kullanıcıların siteye erişimini engellemek ile yetiniyor. Siteler ise kapandıktan kısa bir süre sonra farklı bir alan adıyla (genelde site isminin sonunda bulunan rakamın bir fazlası olarak) tekrar hizmet vermeye başlıyor. Eğer kullandığınız sitenin yeni alan adıyla hizmeti uzun sürerse, VPN de?erlendirmek suretiyle da devlet tarafından engellenmiş herhangi bir siteye giriş yapabilirsiniz.” “[newline]Bahis yapmak için bir Türk canlı casino sitesi seçerken sadece lisanslara bakıp, bahis yapacağınız siteye karar vermemelisiniz. Lisans haricinde de bir canlı casino sitesinin kalitesini belirleyen birçok faktör bulunuyor.

Canlı Casino Dünyasına Giriş: Türkiye’de Canlı Online Casino 2021

Daha sonradan yapacağınız giriş işlemlerini bu güncel adresler üzerinden yaparak giriş sorunlarını ortadan kaldırabilirsiniz. Bildiğiniz gibi Türkiye’de neredeyse binlerce farklı canlı casino sitesi bulunuyor ve bu canlı casino sitelerinin hepsinin kendine ait avantajları ve dezavantajları var. Bu nedenden dolayı, güvenilir, iyi bir canlı casino sitesi seçmenin ne kadar zor bir iş olduğunu tahmin edebilirsiniz. Canlı” “On line casino Las Vegas ve Kıbrıs gibi fiziki casinolarda oynatılan oyunları eviniz konforu ve rahatına getiren on-line bir platformdur. Şuan için slot oyunlarının canlı olarak sunulmadığı canlı casino platformunda Rulet ve Blackjack gibi dünyanın en popüler casino zaman kart oyunlarını oynayabilirsiniz.

Mobil cihazların world wide web tarayıcısı üzerine güncel giriş adreslerini yazdığınız zaman, doğrudan mobil site karşınıza gelecektir. Sitelere mobil olarak bağlanmanın en avantajlı yanı, bulunduğunuz the girl yerden oyunlara katılma imkanı vermesidir. Bilgisayar başından yaptığını girişlerin tam aksine, mobil versiyonlarda nerede olursanız olun canlı casinoya bağlanabilirsiniz.

Canlı Casino Siteleri Bonusları Nelerdir?

Canlı on line casino sitelerinde mobil versiyonları kullanmak için herhangi bir indirme işlemi yapmanıza ya weil ücret ödemenize gerek yoktur. Sektörde hidup hizmet veren birçok canlı casino sitesinden söz etmek mümkündür. Elbette bu sitelerin arasında hizmet olarak belirli bir kalite düzeyinin altında kalan şirketler de vardır. Bu nedenle siteler arasında belirli bir inceleme yaparak güvenilir ve kaliteli hizmetler veren siteleri ön plana çıkarabilirsiniz. Sektörde canlı casino oyunları için lisans kullandıran belirli yurt dışı merkezleri vardır.

Seçtiğiniz canlı casino sitesi, bu oyunların hepsine, daha azına veya çok daha fazlasına sahip olabilir. Bahis dünyasının en popüler oyunlarından olan bu oyunlar hakkında daha fazla bilgi almak isterseniz, oyunların ismini Google’da aratmanız yeterli olacaktır. “Türkçe casino” adı altında gördüğünüz bu sitelerin hiçbirinin merkezi Türkiye değil. Evet, casinolar Türkiye’de faaliyet gösteremiyor fakat Türkçe olarak, yurt dışında faaliyet gösterebiliyorlar. Yani, Türkiye’deki casino sitelerinin merkezinin Türkiye’de olmasına gerek yok.

Bonuses And Offers

Yani, eğer devlet tarafından para cezası yemek istemiyorsanız canlı casino oynayacağınız siteyi seçerken oldukça dikkatli olmalısınız. Sektörde hizmet veren tüm canlı on line casino siteleri, kendine özel olarak bir mobil versiyon tasarlar. Bu sayede tüm cep telefonları ve tabletler üzerinden canlı online casino oyunlarına katılım gösterebilirsiniz.

Casino sitelerinde Türkçe kurpiylerinde olması sizlere aynı zamanda güzel bir muhabbet şansını de uma sunacaktır. Biraz İngilizce biliyorsunuz, yabancı bayanlarda hoş bir sohbetin içine girebilirsiniz. Hem casino oyunu heyecanı hem de iyi zaman geçirme kolay elde edilemeyecek bir haz olacaktır. Canlı casino oynamanın normal bilgisayara karşı oynanan oyunlara karşı bir çok avantajı buulunuyor.

🎁 Slotspalace: Largest Friendly Dealer Casino Bonus

Bu merkezler üzerinden gerekli bütün lisanslarını alan siteler, sizler için her anlamda güvenilir hizmetler oluşturabilir. Lisanslı” “olmayan sitelerin ise birçoğunun dolandırıcı nitelikli çıktığını belirtmek gerekiyor. Canlı casino sitelerini tercih ederken sahip oldukları lisanslara ve para yatırma bonuslarına dikat etmeniz her zaman daha mantıklı bir tercih olacağı için canlıcasino. co sitemizde bu siteleri tanıtmayı amaçladık. Sitemizde ayrıca, online casino oyunları hakkında detaylı bilgilere ve güncel reward kampanyalarına ulaşabilirsiniz. İyi bir canlı casino sitesinin en önemli özelliklerinden birisinin de sahip olduğu oyun sayısı olduğunda hemfikir olduğumuzu düşünüyoruz. Aşağıda, türk canlı online casino sitelerinde bulunan en popüler canlı online casino oyunlarını bulabilirsiniz.

Bahis odaklı olan bu sitelerin canlı casino servisleri empieza sanal bahis imkanları bulunuyor. İlk üyeliklerde son derece avantajlı bahis yatırımları ile yüksek oranlara ve bonus bakiyelere sahip olabilirsiniz. Canlı on line casino sistemleri, çeşitli bahis yazılımlarına sahiptir ve bu bahis yazılımları aracılığıyla bütün işlemler gerçekleştirir.

En Iyi Canlı Online Casino Siteleri Türkiye 2022

Bu oyunların yanında ilginizi çekebilecek Asya’nın en popüler oyunu Bakara ve sobre popüler kart oyunu Teksas Holdem’in casino versiyonu canlı online casino holdem oyunlarını oynayabilirsiniz. Canlı casino sitelerinde üyelik aşamasında kullanıcılara verilen iki reward türü bulunuyor. Kayıt işlemlerini yapan kullanıcılar dilerse ödeme yapmadan 20 TL’ye kadar casino deneme bonusu alabilir. Sonrasında ilk ödeme işleminizi yaptıktan sonra %100 oranında hoş geldin bonusu da kazanabilirsiniz. Sonrasında 24 saat arayla yapacağınız her pra yatırma işlemi için sizlere %20 civarında yatırım bonusu verilir.

Türkçe olarak hizmet verip, Türk kullanıcıların weil canlı casino deneyimi yaşayabilmesini sağlayabiliyorlar. Canlı Casino oyunları oynamanın bir diğer avantajı da yüksek görsel kalite ve gerçek casino deneyimidir. Rulet topunun çark etrafında dönüş sesi, Baccarat gibi kart oyunlarında kartların sesileri sizi istediğiniz ortamda online casino dünyasına sokuyor.

Mobile Accessibility

Bir çevrimiçi kumarhaneye başlamanın ilk adımı, bir kumarhanenin nasıl seçileceğini bilmektir.”

“Fakat bu siteler arasında dolandırıcı, sahte sitelerinde olduğunu belirtmemiz gerekiyor. Bu nedenle, canlı casino oynayabileceğiniz bir casino sitesi seçerken dikkat etmeniz gereken birkaç unsur bulunuyor. Eğer iyi bir canlı casino sitesi arıyorsanız, seçtiğiniz sitenin gerekli lisanslara sahip olduğuna, popülerliğine, sahip olduğu casino oyunlarına ve iyi bir destek sistemi olup olmadığına dikkat etmelisiniz.

Türkiye’deki Canlı Casino Sistemleri/yazılımları:

Teknik ekibimizin uzun araştırmaları empieza denemeleri sonucunda oluşturduğu, Türkiye’de canlı online casino deneyimi yaşamak için tercih edilecek sobre iyi siteleri hemen aşağıda bulabilirsiniz. Dünya genelinde çok sık talep gören kumar oyunları, bu sitelerin” “ürün yelpazesinde yer alır. Canlı casino oyunlarındaki temel mantık, oyunların tümünün çoklu oyuncu sistemiyle oynanmasıdır. Bu bağlamda sitelerin içerisinde Poker, Rulet, Bakarat, Blackjack, Holdem, Monster Tiger ve Carribbean Stud gibi oyunları bulabilirsiniz. Bu oyunların bazıları tamamen şans odaklı olarak kendine has bir pasta düzeneğinde oynanır.

Maalesef BTK’nın (Bilgi Teknolojileri Kurumu) belirli kanunları sebebiyle Türkiye’de yasal bir şekilde canlı casino deneyimi yaşayabilmeniz mümkün değil. Bu nedenle, canlı casino oynamak istiyorsanız “illegal” olarak da tabir edilen canlı casino sitelerini kullanmak dışında başka bir şansınız bulunmuyor. Yasa dışı sitelerde oynamak kulağa korkutucu bir şeymiş gibi gelse de hiç endişelenmenize gerek yok. Eğer güvenilir empieza popüler bir canlı casino sitesinde işlemlerinizi gerçekleştirirseniz yakalanma olasılığınız neredeyse imkansız bir hale gelecektir.

Canli Casino Li̇sansi Nelerdi̇r?

Diğer oyunlar ise durante az 2 kişi, en çok four kişiyle oynanan klasik iskambil kağıtları oyunlarıdır. Dilediğiniz masaya limitsiz olarak katılabilir ve canlı casino imkanlarından faydalanabilirsiniz. Öncelikle şunu belirtmeliyiz ki Canlı casino ve online casinoyu birbiriyle karıştırmamak gerekiyor. Canlı online casino; bir casino sitesinde, gerçek krupiyerler ile oynayabileceğiniz, canlı olarak gerçekleşen casino oyunlarının geneline verilen isimdir.

Bu casino türü, özellikle gerçek kişiler ile oynandığı ve casino ortamını tam anlamıyla yaşattığı için son zamanlarda bolca popüler olmuş empieza bolca Türk kullanıcının vazgeçemediği türlerden biri haline gelmiştir. Online casino ise genelde gerçek kişiler ile oynanmayan, krupiyer bulunmayan casino oyunlarına verilen isimdir. Hayır, hangi casino sitesinde olursa olsun 18 yaşından küçükseniz hesap açamazsınız. 18 yaşından büyük birinin adına kayıt açsanız bile afin de çekme ve yatırmada sorun yaşayabilirsiniz. Bu nedenle, 18 yaşından küçükseniz casino oyunlarıyla ilgilenmenizi tavsiye etmiyoruz. Ayrıca, bazen oynadığınız canli casino sitesinin kapandığını veya erişilemez olduğunu görebilirsiniz.

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