“gerçek Parayla En Iyi Slot Makineleri Empieza Spor Bahisleri

Türkiye’de Pin Up Internet Casino: Anadolu Tutkusunun Oyunla Buluştuğu Yer!

Pin-Up On line casino yönetiminin 7/24 müşteri desteği sunmaması beni hayal kırıklığına uğrattı. Uluslararası bir oyuncu olarak, canlı sohbet desteğinin belirli saatlerde kullanılamamasını rahatsız edici buldum. Büyük hayran kitlesiyle kriket bahis hizmeti, birçok internet kullan?c?s? için oyunun önemli bir parçası haline geldi.

Pin Up casinonun mobil uygulamasını tamamen ücretsiz olarak indirebilirsiniz, bu nedenle kurulumunda herhangi bir sorun yoktur. Sadece kumar kulübünün sitesini ziyaret etmeniz ve orada mobil sürümlerin bulunduğu bir bölüm bulmanız gerekir. Birkaç dakika içinde program çalışacak empieza cihazınıza veya tabletinize yüklenecektir. Pin Up sitesinde sadece slot machine game makaralarını çevirmekle kalmaz, aynı zamanda spor bahisleri modunda de uma eğlenebilirsiniz.

Ücretsiz Demo Versiyon

Kullanıcılar profesyonel müşteri hizmetlerine ihtiyaç duyar çünkü sorular sıklıkla ortaya çıkar. Pin Upwards Casino’da İspanyolca, Portekiz ve İngilizce dillerinde destek hizmeti mevcut olup canlı sohbet 24 saat mevcuttur. Gerçek parayla çevrimiçi bir kumarhane hayal ediyorsanız, Pin Up Casino şüphesiz mümkün olan en faydal? seçenektir. Öncelikle sayfanın üst kısmındaki kırmızı “Kayıt” butonuna tıklayın. Daha sonra bizde bir hesap oluşturmanıza olanak sağlayacak basit bir kayıt formu göreceksiniz. Evet, Pin-up Casino Türk oyuncular için hoş geldin empieza haftalık yeniden yükleme bonusları da dahil olmak üzere çeşitli bonuslar ve promosyonlar sunmaktadır.

Aynadaki yazılım bölümüne giderseniz, oyun istemcisinin PC’niz için uygun sürümünü seçebilirsiniz. İndirme işlemi yalnızca birkaç dakika sürer empieza kurulum daha da hızlıdır. Kayıttan hemen sonra hesaplarını two. 000 ruble ya da daha ?ok miktarda yenileyen oyuncular, depozitonun %150’sini ve 250 bedava dönüş alır. Curacao lisansı altında faaliyet gösteren ve müşterilerine yalnızca yüksek kaliteli hizmet sunan uluslararası bir kumar sitesiyiz. Amacımız, kumarbazlara adil, heyecanlı ve kazançlı bir oyun sunmanın yanı sıra, sitedeki kullanıcıların rahatlığını ve kişisel verilerinin güvenliğini de sağlamaktır pin up.

“Online Casino Pin Up Türkiye – Resmi Sitenin Incelemesi, Ücretsiz Ve Paralı Oynayın

Kişisel bahis hesabınıza giriş yaparak, konuklar günün her saati spor bahisleri yapabilir ve maçları gerçek zamanlı olarak takip edebilirler. Pin Upward hakkında oyunculardan gelen geri bildirimler, doğru tahmin edilen spor sonuçları için kazanç elde etmek için mükemmel fırsatları doğrulamaktadır. Her online casinoda olduğu gibi Pin Up Casino’da da oldukça kapsamlı bir added bonus teklifi bulabilirsiniz. “Promosyonlar” adlı bölümümüzü ziyaret ederek bu konuyla ilgili daha fazla bilgi edinebilirsiniz.

Ayrıca 7/24 hizmet veren hızlı ve profesyonel müşteri desteğimizle gurur biliyoruz. Herhangi bir sorunuz veya sorununuz olsa bile, ekibimiz her zaman yardımcı olmaya hazırdır.. Aviatrix, Bitcoin, Tron ve USDT gibi kripto pra birimleriyle bahis oynamaya izin veren türünün tek örneği bir crash oyunudur.

Pin-up’tan Pra Çekme Işlemi Nasıl Yapılır?

Bir oyuncu uzun süredir Pin Upwards kulübündeyse, yönetim e-postaya yeni aynanın etki alanını içeren bir bildirim gönderecektir. Çoğunlukla, Pin Up Online casino uzun süredir belirli bir adreste faaliyet göstermektedir. Oyuncular, kumar hizmetiyle ilgili incelemelerinde ve yorumlarında, aynanın uzun süredir düzgün çalıştığını söylüyorlar. Bununla birlikte, aniden kumarhanenin çalışmadığını fark ederseniz” “veya herhangi bir nedenle eski bağlantıya erişmeyi bırakırsanız, yeni bir tane bulmalısınız. Güncel aynalar genellikle kumarhaneyle ilgili web sitelerinde bulunur. Ayrıca, yönetim bazen oyuncularına postayla yeni adresler gönderir.

Bundan sonra, slot makinelerini seçebilir ve hesabınızdan otomatik olarak para tahsis edilen bahisler oynayabilirsiniz. Pin-Up Casino’da slot makineleri, masa oyunları, canlı casino oyunları empieza spor bahisleri gibi çeşitli oyunlar bulunmaktadır. Gerçek parayla oynamaya başladığınızda emin olmak istediğiniz en önemli şey oyun sürecinin adil olmasıdır. Pin Up Casino, slot machine game makinelerinin en yüksek kalitesini ve güvenilirliğini garanti edebilen dünya çapında tanınmış oyun sağlayıcılarla çalışır. Tüm casino oyunları empieza aktiviteleri uygun lisanslara sahiptir ve Pin Up Casino’nun kendisi hiçbir turun sonuçlarını etkileyemez.

Pin Upward Casino’nun Resmi Sitesine Nasıl Erişilir

13 Ocak 2022’de piyasaya sürülen Space XY, BGaming tarafından geliştirilen ve Türk oyuncular arasında oldukça popüler olan bir çevrimiçi casino oyunudur. Bu heyecan verici hızlı oyun %97 RTP’ye sahiptir ve bir uzay roketinin uçuşu üzerine bahis oynamayı içerir ve bir crash dan önce zamanında para çekmeyi gerektirir. Türk oyuncular, maksimum 10. 000x çarpan elde etme şansı ile bahisler için kripto para birimlerini kullanabilirler. Pinup online casinonun mobil versiyonu IOS’un yanı sıra Android cihazlarda da desteklenmektedir. Ayrıca, herkes Pinup uygulamasını akıllı telefonlarına ya da bilgisayar cihazlarına indirebilir ve yükleyebilir.

Deneyimsiz bir acemi haine Pin Up mobil uygulamalarını kendi başına bir telefona ya da tablete kolayca indirebilir. Pin Up ile yaklaşık 4 ay önce tanıştım, ondan önce başka bir yerde oynuyordum, onlar beni ödeme yapmayarak dolandırdılar. Pin Up’ın bununla ilgili henüz bir sorunu yok gibi görünüyor, Favori slotlarımdan birkaçını oynuyorum ve bazen eğlence için bahislerde sezgilerimi kontrol ediyorum.

Yeni Müşterilerin Kullanımına Sunulan Pin Number Up Casino Özellikleri

Pin Upward kulübünde kayıt prosedürünü geçen kumar hayranları, para için çevrimiçi slotları özgürce oynama ve iyi kazançlar elde etme fırsatına sahipler. Bunu yapmak için, kayıtlı oyuncunun Pin Up’ta önerilen ödeme araçlarını de?erlendirmek vas?tas?yla kumarhanedeki depozito bakiyesini yenilemesi yeterlidir. Transfer edilen miktar anında hesaba yatırılır empieza misafir hemen makineleri gerçek bahislerle çalıştırabilir. Pin-Up organizasyonu, müşterileri için platformun en rahat kullanımını sağlamaya çalışır. Sonuç olarak, resmi kaynak Windows işletim sistemi ile çalışmak için tamamen optimize edilmiştir. PC sahipleri platformun sadece tarayıcı versiyonunu kullanabilecek.

Pin-Up 950 net sitesine akıllı telefondan girmenin başka bir yolu da tarayıcı tabanlı mobil sürümdür. Avantajları, kompaktlık, least trafik yükü empieza masaüstü sürümüne benzer işlevselliktir. Canlı casinoda oynamak diğer Pin Up oyunlarını oynamak kadar kolaydır. Canlı casino kataloğundan bir oyun seçin, üzerine tıklayın ve oyun saniyeler içinde yüklenecektir.

Resmi Casino Pin Number Up: Slot Makinelerinde Çevrimiçi🎲 Oynayın

Bazı oyunlar (video online poker, rulet vb. ) belirli pozisyonların kesin olarak seçilmesini gerektirir. Küçük bir dokunmatik ekranda bir parmakla, istenen sayıları ya da oyun kartlarını belirtmek kolay değildir. İncelemelerdeki oyuncular, Pin Upward casinos uygulamalarının bazı eksikliklerine dikkat çekiyor. Kumarbazlar, mobil platformların tamamen farklı ekran formlarına sahip olduğundan ve menü öğelerinin düzeninin değiştiğinden şikayet ediyor. Mobil gadget’ları kullanarak oyun hizmetine girerken gerekli seçenekleri hemen uyarlamak ve bulmak zordur. Misafirler, eski akıllı telefonlarda tüm slot makinelerinin etkin olmayabileceğini bilmelidir.

Talimatları ve slotun açıklamasını incelemek de” “yararlıdır, böylece oyun empieza bonus kombinasyonlarının düşme sorununu anlarsınız. Resmi Pin-Up kaynağı, platformun herhangi bir taşınabilir cihaz için improve edildiği müşterileri için özel bir mobil versiyona sahiptir. Mobil sürüm, tüm akıllı telefon ve tablet tarayıcılarında desteklenir. Mobil sürüme geçiş, cihazdan web siteleri ziyaret edildiğinde otomatik olarak gerçekleştirilir. Bir piyangoya katılmak için, oyuncuların genellikle belirli bir miktarda para yatırmak veya belirli sayıda oyun oynamak gibi belirli koşulları yerine getirmeleri gerekir. Giriş süresinin sonunda, kazananlar ödülleri almak için rastgele seçilir.

Pinup Video Gaming Club’da Güvenilir Ödemeler

PinUp, finansal transferler yapmak için geniş bir ödeme aracı yelpazesi sunar. Ziyaretçilerin incelemelerinde, kazançların mevduat hesaplarından çekilmesinin çabukluğunun teyidi vardır. Bu çevrimiçi online casino, farklı şekillerde hızlı para çekme ile para transferleri yapmak için rahat koşullar sağlar. 2022 yılında, Pin Up Gaming Club’ın Android telefonlara ya da iPhone’lara indirilebilen güvenilir ve hızlı mobil sürümleri oluşturuldu. PinUp ana sayfasında Android sürümü ve apple iphone sürümü için bir bağlantı bulacaksınız. Pin Up uygulamalarındaki slot machine game makineleri, farklı mobil cihaz türlerinde daha hızlı slot işlemi için biraz basitleştirilmiş bir tasarıma sahiptir.

Farklı bonus hediye türlerini geri kazanmak için, kullanıcılar bu tür hediyelerin the girl biri için öngörülen bahis faktörlerini dikkate almalıdır. Ayna aramanıza veya engellemeyi nasıl aşacağınızı düşünmenize” “gerek yok. Buna ek olarak, uygulama çok daha hızlı ve daha kararlı empieza kendine özgü bir tasarıma sahip.

Pın Up Casino – En Sevdiğiniz Oyunları Çevrimiçi Oynayın

Kumarhanenin ve oyunların tasarımı, kulübün internet sitesinde olduğundan çok daha uygun. Kayıt olmak kolay. Form aracılığıyla kazançların hızlı çekilmesi. Pin Up kumarhanesinin mobil versiyonu : telefonunuzdan” “empieza sosyal ağlardan kayıt olun. Ağlar, gadget’larını kullanan herhangi bir kullanıcıya erişebilecek.

Bunu yapmak için, imleci istediğiniz slotun üzerine getirin ve “Demo” çalıştırma yöntemine tıklayın. ESpor üzerine bahis oynamak, geleneksel sporlar üzerine bahis oynamak kadar popülerdir. PvP etkinliklerinde bireysel oyunculara mı yoksa takım etkinliklerine mi bahis oynayacağınızı seçin.

Pin Upwards Casino’ya Kayıt Olmak Bana Ne Kazandırır?

Cep telefonlarında canlı oyunlarda bazı teknik kısıtlamalar vardır. Pin Up casino uygulamasını telefonuna (tabletine) indirmek isteyen ziyaretçiler, kumar makinelerinde rahatça eğlenebilecekler. Pin Up online casino uygulaması aracılığıyla oyunlar demo modunda başlatılır, mevcut slotlarda pra için de oynayabilirsiniz. Casino misafirleri, Pin Up uygulamalarını farklı cihazlara yükleyerek güvenle indirebilirler. Pin Upwards resmi web sitesinde sunulan mobil uygulamalarda virüs bulunmamaktadır.

Promosyon kodlarını Telegram topluluğunda bulabilir veya e-posta ile alabilirsiniz. Fonların yenilenmesi ve çekilmesinin aynı sistem kullanılarak yapıldığını hatırlamakta fayda varifr?n. Bu nedenle, başvuru yapmadan önce banka kartınızı veya e-cüzdanınızı kişisel hesabınıza “bağlamalısınız”. Minimum para yatırma tutarı 100$’dır, maksimum gösterge kimlik durumuna bağlı olacaktır. Kullanıcılara ek hediyeler sağlayan çeşitli casino Flag Up promosyon kodları, kuponları veya reward kodları bağlı kuruluş sitelerinde kolayca bulunabilir.

Online Kumarhaneye Nasıl Kayıt Olunur?

Bu heyecan verici oyun, sizi büyüleyecek Gr?sk Mısır temalı tasarımıyla beş makara empieza on ödeme çizgisine sahiptir. Minimum bahis sadece €0. 10’dur, böylece herkes eğlenceye katılabilir. Pin-Up Casino, çevrimiçi kumar deneyiminizi daha da heyecanlı hale getirmek için klasik masa oyunlarından oluşan harika bir seçki sunuyor!

Herhangi bir yazılım indirmenize gerek yoktur,” “canlı casino mobil cihazlar da dahil olmak üzere birden fazla platformda çalışır. Canlı oyunlar arasında Blackjack, Poker, Rulet, Bakara, Keno ve Piyango bulunmaktadır. Bonus, yeni kayıt olan ve para yatıran yeni başlayanlar için tasarlanmıştır.

Bahis Seçenekleri:

Kullanıcılar resmi internet sitesinde çeşitli türlerde oyunların yanı sıra çok sayıda teşvik ve değerli ödüller kazanma şansı bulabilirler. Dahası, Pin Upwards Casino yeni oyuncuları cezbetmek için cömert bonuslar ve promosyonlar sunar. Etkinlik seviyelerine bağlı olarak, en yeni müşteriler kayıt olduktan sonra para yatırma bonusu ve çeşitli diğer bonus oyunları alabilirler.

İşlemlerinizle ilgili herhangi bir sorunuz veya sorununuz varsa, güler yüzlü müşteri hizmetleri the girl zaman birden fazla dilde yardıma hazırdır. Pin Up Casino sorumlu oyunu destekler, bilinçli oynamak sizin sorumluluğunuzdur. İster terme conseillé oyunları, masa oyunları, video slotları veya spor bahisleri etkinlikleri arıyor olun – Pin Up’ta hepsi var! Bonus oyunları ve e-posta adresiyle kaydolma özelliği vas?tas? ile online kumar deneyiminizden daha da fazlasını elde edebilirsiniz. 2016 yılında kurulan PınUp web sitesi onbinlerce aktif oyuncuyu kendine çekmiştir.

Casino Oyunları Ve Slotlar

Sitede indirme dosyası her zaman mevcut değildir, bu nedenle Pin Up’ı” “çevrimiçi sohbette istek üzerine yönetici tarafından verilecek olan doğrudan bir bağlantıyla indirebilirsiniz. Oyuncunun kişisel dolabına giriş yapmak için slotları çalıştırmak gerekli değildir. Kendi paranızı kaybetme riski ve kazançlarınızı çekme fırsatı yoktur.

Böyle bir mobil programın uyarlanması sayesinde, menü parametreleri ve kontrol düğmelerinin boyutu, mobil cihazların belirli grafik özelliklerine en uygun şekilde ayarlanır. Pin Up web sitesinde gerçekten yüzden fazla slot var, ancak bunları konuya, örneğin değişkenliğe veya başka bir parametreye göre ayırmaya yardımcı olacak hiçbir filtre yok. Örneğin ben çok bonuslu ve hikayesi olan slotları tercih ediyorum ve bu çeşitte bunları bulmak oldukça zor olabiliyor. Akıllı telefonunuzdaki herhangi bir tarayıcının arama çubuğuna casinonun adını girin ve sağlanan bağlantıyı takip edin. Mobil sürüme girdikten sonra kişisel hesabınıza giriş yapmanız empieza gerekirse depozitonuza yatırma işlemi yapmanız gerekir. Henüz hesabınız yoksa, kayıt işlemini tamamlayın, bu işlem sizin için bir dakikadan fazla sürmeyecektir.

Resmi Sitede Oyna☑️ Para Çekme Ile Casino Pinup Türkiye

Bu, Türkiye’de son derece popüler olan ünlü bir” “kumar web sitesidir. Spor bahisleri Pin Up kullanıcılarının kullanımına açık olduğunu da belirtmek gerekir. Türkler popüler sporlara bahis oynayabilir ve canlı maçları izleyebilirler. Aşağıda durante popüler Pın Up crash çevrimiçi oyunlarının bir açıklamasını bulabilirsiniz. Pin Up kumarhanesine kaydolan tüm ziyaretçiler için, kullanıcının VERY IMPORTANT PERSONEL statüsünden bağımsız olarak, para transferi için aynı kurallar empieza limitler vardır. PinUp’ta popüler sosyal ağlarda ve mesajlaşma programlarında açık kişisel sayfalar aracılığıyla kayıt vardır.

Kazanmanız durumunda, ödül 250 liralık depozito yatırdığınızda kullanılabilir olacaktır. Para çekmek için casino kimliğinizi doğrulayan belgeler talep edebilir. Pin-Up Casino’da kredi kartları, banka transferi, e-cüzdanlar (Neteller, Skrill) ve ön ödemeli kartlar gibi çeşitli ödeme metotları kullanılabilir.

Pin-up Casinos Hakkında Oyuncu Yorumları

Kumar hakkında konuşuyorsak, para çekme işleminin 4 saate kadar beklemesi gerekecek. Ayrıca, bahisçinin ofisinde genel olarak otomatik modda anında afin de aldığınızı belirtmekte fayda var. Bu contemporary” “akıllı telefon uygulamasını hemen şimdi deneyin ve pişman olmayacaksınız. Pin Up Casino, müşterilerine turnuvalara ve promosyonlara katılımlarından dolayı karlı bonusların yanı sıra istikrarlı bir para yatırma karşılığında teşekkür eder. Öncelikle, resmi web sitesinde bonusu almak ve etkinleştirmek için gerekli koşulları (şartlar ve koşullar geçerlidir) öğrenin empieza oyununuzu çeşitlendirin. Pin Up Casino hızla Türkiye’deki en popüler çevrimiçi Casino haline geliyor.

Evet, Pin-Up Casino’da çeşitli bonuslar ve promosyonlar bulunmaktadır. Yeni üyelere hoş geldin bonusu, para yatırma bonusları, ücretsiz spinler empieza sadakat programı gibi farklı teklifler mevcuttur. Minimum para yatırma ve çekme tutarı, kullanılan ödeme yöntemine bağlı olarak değişir. Genel olarak, minimum para yatırma €10 ve minimum para çekme €20’dir. Kısa bir süre önce, oyunculara gerçek parayla oynama şansı sunan bir çevrimiçi kumarhane olan Pin Upward Casino değerlendirmesi yapma fırsatım oldu.

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