Aviator Demo Oyunu Ücretsiz Oyna 888starz

“aviator Ücretsiz Ve Kayıt Olmadan Oyna Demo

Content

Dahası, hayatınıza biraz risksiz kumar eklemek, elbette bu tür oyunlar ilginizi çekiyorsa, dinlenmenizin kalitesini artırabilir. Size tavsiyem, ücretsiz oynasanız bile, oyuna ayırmak için kendinize the girl zaman bir zaman sınırı koymanızdır. Arkanıza yaslanıp bahisler arasında saatlerin geçmesine izin vermeyin.

Ayrıca, havacılarınızı stratejik konumlara yerleştirerek rakibiniz için tuzaklar kurmaya çalışmalısınız. Ücretsiz oynama fırsatından yararlanmak için çevrimiçi bir kumarhaneye kayıt olmak gerekli değildir. Oyuncunun, sürecin dinamizmini empieza yazılımın faydalarını takdir etmesi için bir hesap açıp parayla doldurmasına gerek yoktur.

Aviator Hızlı Ve Kolay Afin De Çekme Ile Casino’da Gerçek Para Ile Oynayın

Aviator ‘ı bir adalet örneği haline getirmek için geliştirici, popüler Provably Fair teknolojisini kullandı. Bu teknolojinin özü, rastgele sayılar üreterek oyunun sonucunu kontrol etmektir. Aviator ‘da turun sonucunun oluşumu katılımcılara bağlıdır – oyun operatörü ve bahis yapan kullanıcılar.

Aviator’ın demo sürümünü web sitemizde kayıt olmadan ücretsiz oynayın. Bunu yapmak için, bu web sayfasını yukarı kaydırın empieza bahsinizi yapın. Demolar üzerinde strateji kullanma pratiği, oyuncular için popüler bir etkinliktir.

Aviator” “oyun Demosu – Aviator’u Ücretsi̇z Oyna

Aviator Labouchère stratejisiyle bahis oynamadan önce, oyun seanslarınızın sonunda ne kadar kazanmak istediğinize karar verirsiniz. Bu yapıldıktan sonra, tercihinize göre daha küçük miktarlara bölersiniz. Aviator oyununda kazanmanın bir diğer hilesi de d’Alembert stratejisini kullanmaktır. Yüzyıl Fransız filozofu empieza matematikçisi Jean Leron d’Alembert’in teorisine dayanır ve genellikle rulet için kullanılır aviator demo.

Elbette, bazı çevrimiçi casinoların uygulamasını indirebilir ve oradan Aviator oynayabilirsiniz, ancak en azından şimdilik resmi bir özel” “uygulama yoktur. Herhangi birini bulursanız, resmi uygulamalar olmadıkları ve kişisel verilerinizi çalabilecekleri için dikkatli olun. Oyunun sonucu, turun ilk üç bahisçisi empieza oyun operatörü dahil olmak üzere dört tarafça oluşturulur. Oluşturulan tohumun hash versiyonu her oyundan önce herkes tarafından görülebilir.

Aviator ‘u En Iyi Bonuslarla Hangi Casinolarda Bulabilirim?

Her turda kazanma anı oyun başlar başlamaz oluştuğu için, kazanmanın tek yolu kazanmak için oynamaktır. Aviator’ı tüm soslarda oynadım, ancak masaüstü bilgisayarlardan bahsetmişken, genellikle thirteen inç dizüstü bilgisayarımda ve 24 inç masaüstü bilgisayarımda oynuyorum. Her ikisinde sobre Aviator ekranı harika görünüyor, ancak oyunu 24 inç ekranda tercih ediyorum, çünkü sohbet de dahil olmak üzere your ex öğe zahmetsizce yerini buluyor.

Modern çevrimiçi kumarhaneler dizininde binlerce proje vardır ve bunların the woman birine aşina olmak zor olacaktır. Analiz için harcamak istediğiniz çok fazla boş zamanınız varsa, listelenen parametreler size yardımcı olacaktır. Oyuncuları hizmetine çekmek için Mostbet, hizmeti ilk kez ziyaret edenler için ilk para yatırma işlemine +% one hundred fifty sunuyor. Buna ek olarak, yeni gelenler ücretsiz oyunlar için kullanılabilecek 250 freespin kazanır.

Para Için Aviator Oynamak Için Martingale Stratejisi

Aksi takdirde, Aviator oyununun tüm işlevleri ve olanakları aynı kalır. Aviator demonstration oyunu, Aviator kumar crash oyununun kayıt gerektirmeyen ve hesaba para yatırma gerektirmeyen ücretsiz bir deneme sürümüdür. Demo oyuna her girdiğinizde size 3000 USD oyun içi bakiye sağlanır. 888STARZ, etkileyici bir kumar eğlencesi yelpazesi sunan bir iGaming platformudur. Aviator oyununu web sitemizde sağlayıcı Spribe’dan ücretsiz oynayın.

Her 12-15 veya 20 dakikada bir nefes alın veya başka bir şey yapın, böylece gerçeklikle bağlantınızı kaybetmezsiniz. Size daha önce de söylediğim gibi, Aviator’da diğer oyuncular ekranın sol tarafında veya telefon empieza tabletlerde altta görülebilir. Bu alanda, sizin ve başkalarının bahisleri de dahil olmak üzere oyuna oynanan tüm bahisleri görüntüleyebilirsiniz. Ayrıca Aviator’da şimdiye kadar elde edilen en büyük kazançlara ayrılmış bir bölüm de bulunmaktadır. Teknik düzeyde, oyunun teknolojisi değişmeden kalır, yani HTML5, hem bilgisayarlarda hem de telefonlarda veya tabletlerde çalışmak için mükemmeldir.

Aviator Demosunun Kullanılabildiği Cihazlar

Belki sobre milyonlar kazanabilecek bir strateji yaratmanın anahtarı sizin ellerinizde ve kesin düşüncelerinizde yatıyor. Casino oyunları empieza kumar çözümleri için yazılım geliştirme konusunda uzmanlaşmış bir şirkettir. Dolayısıyla oyun içi bahsinizin 1. 000 katına kadar kazanabilirsiniz. Kendi sözlerimle, Aviator’ın kazanç çarpanında 100X’in üzerine çıktığını nadiren gördüğümü söyleyebilirim.

Seçtiğiniz kumarhanenin bankacılık ya da kripto para cüzdanınızla çalıştığından emin olmak için para yatırma ve çekme hüküm ve koşullarına göz atın. Aviator oyunu resmi olarak Pin-up, 1Win, Olimp ya da Mostbet gibi zaman içinde kendini kanıtlamış birçok casinonun cephaneliğinde yer almaktadır. Web sitemizin ilgili bölümlerinde oyunun kendisi, bonuslar, promosyonlar ve the woman bir çevrimiçi kurum için ödemeler hakkında daha fazla bilgi edinebilirsiniz.

Demo Modu Ile Gerçek Pra Oyunu Arasındaki Fark Nedir?

“Önceki yarışmacının aksine Olimp, Aviator ‘u gerçek parayla oynamak için daha kapsamlı bir bonus sistemine sahiptir. Oyun prosedürü farklı değildir, ancak Olimp yeni oyunculara% 200’e varan ilk para yatırma bonusu sunar. Buna ek olarak, kumarhanenin daha da fazla bonus almanızı sağlayan entegre bir VIP programı vardır. Para yatırmanın yanı sıra para çekme, banka kartları, aracı hizmetler kullanılarak oldukça olağan bir yöntemle gerçekleşir. Demo modu ile para sürümü arasındaki fark, yalnızca kazançların çekilme olasılığında yatar – bu, yalnızca ikinci durumda oyunculara açık olacaktır.

2019 yılında kumar eğlencesi dünyasında önemli bir olay yaşandı rapid Aviator oyunu piyasaya çıktı. Oyun, oyuncular arasında karmaşık bir etkileşim sistemine,” “durante soğuk oyuncuları haine heyecanlandıran bir oynanışa ve yatırılan bahse oran şeklinde kazançlara sahiptir. Aviator, hileyi dışlayan yapay zeka tarafından tamamen kontrol edilir. “Aviator” oyununun demo versiyonu gerçek parayla bahis yapma fırsatı sağlamaz.

Pin Upward Online Casino’da Aviator Oynayın

İlk ve en kolay yol, web sitemize gitmek ve gerçek para için çevrimiçi casinoların derecelendirmesini okumaktır. Yeni projeleri analiz ediyor ve halihazırda eklenmiş oyun alanlarındaki değişikliklere odaklanarak kataloğu güncelliyoruz. Böylece, web sitemizi kullanarak, şu veya bu çevrimiçi kumarhanede para için oynamanın faydaları hakkında hızlı bir şekilde bilgi edinebilir ve seçiminizi yapabilirsiniz.

Aviator ile oynarken her kaybettiğinizde bahis miktarını artırmaktan oluşur. Onun teorisine göre, izafiyet teorisine göre your ex kayıp zaferi daha da yakınlaştırır. Başka bir deyişle, the girl başarısızlıkta bir sonraki bahsin kazanma şansı artar.

Uçak Oyununda Mevcut Olan Sosyal Yönler

Ayrıca, önemli kazançlar söz konusu olsa bile, para hiçbir şekilde nakde çevrilemez. Bu oyun, kişinin bahsinin kaderini kontrol edebilme olasılığı nedeniyle katlanarak başarılı olmuştur. Her şeyin rastgele olduğu slot makineleri gibi bir oyunun aksine, Aviator Crash size bahsinizi ne zaman nakde çevireceğinize karar verme seçeneği sunar. Oynarken bir hatayla karşılaşırsanız – teknik destek oyuncular için her zaman mevcuttur. Ayrıca e-posta yoluyla kumarhane yönetiminden yardım isteyebilirsiniz.

Oyununuzdan en iyi şekilde yararlanmak istiyorsanız, web sitemize göz atın. Orada Aviator ve oyun alanındaki diğer kumar eğlenceleri için promosyon kodları sizi bekliyor. Slot makinesi, kararı tahmin etmek imkansız olan sofistike AI temelinde çalışır. Projenin bir başka özelliği para uzun bir tur olarak kabul edilebilir, çünkü bu oyun çok fazla zamanınızı almaz. Proje, uçaklarla, ancak daha spesifik olarak pilotların zor işleriyle ilişkilidir. Aviator’da oynarken, mümkün olduğunca çok kazanmak için mümkün olduğunca yükseğe çıkması gereken bir pilotun işini yaparsınız.

Demo Modunda Em Virtude De Çeki̇lebi̇li̇r Mi̇?

Rakiplerinden farklı olarak Chillbet, yeni gelenler için yüzde olarak değil, belirli bir miktar şeklinde bir bonus sunar. Koşulları yerine getirdikten ve belirli bir miktarda afin de yatırdıktan sonra, hizmetten 100 $ alacaksınız. Casino web sitesinde, uygun oyun aramasını kullanarak Aviator oynayabilirsiniz. Yenileme ve afin de çekme prosedürüne gelince – oyuncular sprained ankle treatment banka hesapları aracılığıyla klasik yenilemeye sprained ankle treatment de kripto afin de cüzdanları aracılığıyla pra yatırmaya erişebilirler.

Aviator oyunundaki her turun çarpanı, yalnızca şans eseri belirlenir. Oyun, kanıtlanabilir derecede adil bir süreci garanti eden Provably Fair teknolojisi üzerine inşa edilmiştir. Bu, üçüncü şahısların oyunun sonucunu etkileyemeyeceği anlamına gelir. Diğer oyunlarda olduğu gibi, Aviator oyuncuları da oyuna takma isimler larva eğilimindedir.

Aviator Stratejilerimi Uygulamak Için Ücretsiz Sürümü Nasıl Kullanabilirim?

Bu strateji, bahislerini birkaç kez” “ikiye katlamak için yeterli paraya sahip olan ve yüksek getirili bir oyun oynayan oyuncular için etkili olabilir. Bir başka yaklaşım da, daha yüksek ödemeli ancak kazanma şansı daha düşük olan bahislere birkaç daha agresif bahis yapmaktır. Bu strateji son derece risklidir, ancak bütçenizle sınırlı değilseniz instructions size sağlam bir kazanç getirebilir.

Pastanın üzerindeki kiraz – aralarında bir kripto em virtude de biriminin de bulunduğu uygun para yatırma ve çekme yöntemleri. Her turdaki maksimum oranlar yapay zeka tarafından tamamen rastgele belirlenir. Bu, mevcut tur sırasında maksimum kazanma oranının x3 olması durumunda, bir sonraki turun oranının x8 olabileceği anlamına gelir.

Aviator Oynarken Para Ve Kazançlar Nasıl Yatırılır Ve Çekilir

Aviator on line casino oyunu sadece şansa dayalı değildir, aynı zamanda oyun kalıplarının iyi okunmasını ve oyun risk yönetiminin anlaşılmasını gerektirir. Aviator yeni oyuncular için basit görünse para, başarılı olanlar genellikle gözlemlerine ve deneyimlerine dayalı stratejiler geliştirirler. Aviator ‘da Paralel Bahis, oyuncunun aynı turda birden fazla bahis yapmasına olanak tanıyan bir bahis stratejisidir.

Ücretsiz modda oynamaya başlamak için, online casino ziyaretçisi Aviator slotunu başlatırken demo modunu seçmeli, bahis oynamalı ve «Başla» düğmesine tıklamalıdır. Tur sayısı sınırlı değildir, bu nedenle” “Aviator demo seçeneği genellikle deneyimli oyuncular tarafından stratejilerini geliştirmek veya kendi taktiklerini geliştirmek için seçilir. Kumarbazın test seçeneğini kullanırken görevi, sanal bahisleri tükenmeden önce kullanmaktır.

Akıllı Telefonlar Için Aviator Trial Uygulaması

Sunulan liste, oyunun popülerliğinin ve başarısının en iyi kanıtı olarak adlandırılabilir. Sadece başlığın sunulduğu en popüler çevrimiçi kuruluşlardan bahsettik, aslında Aviator ile çok daha fazla kumar platformu var. Uçak ne kadar yükseğe çıkarsa, bahis çarpanları o kadar yüksek olur ve bu nedenle daha fazla kazanabilirsiniz. Aviator slot demosu, yoğun ormanlar ve parlak çöller gibi farklı yerleri keşfetmenizi sağlar. Bir görevde başarılı olmak veya başarısız olmak için seçimler yapmanız gereken etkileşimli senaryoların keyfini çıkarabilirsiniz. Oyun ayrıca, her biri kendine özgü güçlü yönleri ve özel yetenekleri olan çeşitli uçaklar sunuyor.

Oyun başladığında, bu yeşil düğme turuncuya dönecek ve ‘Nakit Çıkışı’ yazısı görünecektir. Çok geç olmadan ve uçak havalanıp kaybetmenize neden olmadan önce kazancınızı toplamak için bu düğmeye tıklamanız gerekecek. Oyunun adrenaline pompalamasına katkıda bulunan beceri ve şans karışımını seviyorum. Aviator’da bulacağınız oyun tasarımı ve teması hakkında bazı ayrıntılara bir göz atalım.

Aviator Mostbet Oynamak

Ben şahsen bunları denemedim, bu yüzden onlar hakkında konuşmamayı tercih ediyorum. Geçtiğimiz aylarda adresinde deneyimlerini paylaşan bazı oyuncuların geri bildirimlerine dönelim. Öte yandan, demo sürümüyle, yatıracağınız toplam tutardan daha büyük bir parayla Aviator oynadığınız için herhangi bir hoşgeldin bonusu veya promosyonu da almayacaksınız.

Bununla birlikte, modern çevrimiçi gerçek para oyunları kumar kuruluşundan tamamen bağımsızdır, sonuçların hesaplanması operatörün sunucusunda gerçekleşir. Türkiye’da lisanslı oyunlar olmadıkları için demonstration oyunun bağlantısını koyamıyorum, ancak hızlı bir Google araması yaparak hızlı bir şekilde bulabilirsiniz. JetX’in Türk lisansına sahip on the web casinolarda oynayabileceğiniz tek oyun olduğunu unutmayın. Aviator oyunu sürekli olarak test ediliyor ve bu da geliştiricilerin oyuncuların hatalarla karşılaşmasını engellemesini sağlıyor. Bununla birlikte, oyunun gayri resmi olarak sunulduğu yerler hala kritik sorunları olan sürümler içerebilir.

Her 8 Ila 35 Saniyede Bir Oyun Başlatır

Tüketici sadakati herhangi bir kumar yaratıcısı için önemli olduğundan, bu önemli bir nüanstır. Böylece, Parimach veya Mostbet online casino hizmetlerini kullanarak, Aviator demosunu herhangi bir afin de harcamadan deneyebilirsiniz. Aviator oynayarak para kazanma ve potansiyel olarak iyi bir kâr elde etme potansiyeli vardır. Ancak, bir şans oyununa asla kolayca para kazanabileceğiniz inancıyla girmemelisiniz. Bu oyunlarda hiçbir şey garanti değildir empieza Aviator size kâr garantisi bile veremez. Mümkün olan sobre iyi deneyimi elde etmek için sorumlu bir oyun anlayışı kullanın ve yalnızca eğlence amaçlı oynayın.

Oynarken hatalarla karşılaşmamak için güvenilir bir çözüm, oyunun resmi olarak sunulduğu bir kumarhanede oynamaktır. Hızlı bir şekilde uygun, yasal ve karlı bir çevrimiçi oyun platformu bulmak istiyorsanız, derecelendirmemizi kullanın. Burada mevcut bonuslar, özel teklifler ve İnternet’teki en popüler çevrimiçi casinoların özellikleri hakkında bilgi bulacaksınız.

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