Mostbet Aviator Çevrimiçi Giriş Yap As Well As Bonus Ile Oyna

Aviator Mostbet Ücretsiz Ya Da Gerçek Paralı Oyun

“Ayrıca, demo oyunu eğlenmek isteyen ve aynı zamanda kendi tasarruflarını riske atmamak isteyen kullanıcılar tarafından seçilebilir. Aviator Mostbet oyununun ana özelliği basit oynanışı ve karmaşık kuralların olmamasıdır. Mostbet bahisçisinin web sitesine yeni kaydolmuş acemi bahisçiler bile oynamaya başlayabilir. Oyuncuların kazanmak için çok fazla zaman ve afin de harcamasına gerek kalmayacak. Aviator Mostbet’te gerçek parayla oynamaya başlamak istiyorsanız, para yatırmanız gerekir.

Bu, üçüncü şahısların oyunun sonucunu etkileyemeyeceği anlamına gelir. Amacınızın bir bahis oynamak ve uçak (yani oranlarınız) “havalanmadan” önce oyundan çıkmak olduğu bir oyundur. Oyunun” “amacı basit gibi görünse de aslında hızlı tepki vermenizi ve iyi bir strateji anlayışına sahip olmanızı gerektirir. Siteye üye olmadan, demo versiyonunu oynayarak ilk etapta oyunu öğrenebilirsiniz. Siteye üye olduğunuz zaman, Aviator için Mostbet’in verdiği kimi reward ve promosyonlarla de uma oynamanız mümkün.

Kripto Para

Gerçek para kullanmadan Türkiye’de Aviator oynamanıza izin verir. Demo modundaki Aviator’daki oyunun kuralları, para için oyundaki ile aynıdır. Uçuşu ne kadar uzun sürerse, bahsi çarpan katsayı o kadar büyük olur. Uçak oyun” “ekranından uzaklaşana kadar kazanılan miktarı toplamak için zamana sahip olmak gerekir.

Bu, platformdaki tüm oyuncuların twenty one yaşın üzerinde olması ve çevrimiçi casinolara izin verilen ülkelerde oynaması gerektiği anlamına gelir. Peki potansiyel bir oyuncunun platformda hile yapmaya çalışmadığından nasıl emin olabilirsiniz? Casino oyunları bahis siteleri listesine girdikten sonra canlı online casino oyunları arasında yer alan casino oyunu seçip Aviator oyna tuşuna basmanız yeterlidir. Aviator oyunu child yıllarda bahis oyunu oynayanlar arasında çokça ilgi görülen online casino oyunlarından biri. Tabii ki bu weil yanı sıra casino sitelerinde oyun oynayanlardan yorumlar gelmesine vesile oldu aviatör mostbet.

Tipik Bir Mostbet Aviator Oyunu Eine Kadar Sürer?

Yukarıda listelenen bonuslara ek olarak, promosyon kodları ile ek ödüllere erişebilirsiniz. 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. 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.

Crash oyunlarına düşkünlüğü olan herkesin Aviator’a ilgi duyması, bu sebeple para çoğu Mostbet üyesinin onu oynamaya zaman ayırması bir tesadüf değil. Öncelikle Aviator, kriptografik sistemsiz sayı oluşturma temeline dayalıdır. Ayrıca “Provably Fair” şifreleme sistemi vas?tas? ile de oyuna dışarıdan bir müdahale ihtimali ortadan kalkar.

Para Içinaviator Oyunu 1xbet

Evet, bahsin boyutu Aviator’da kazanma olasılığını etkileyebilir. Bir güvenlik tanımlayıcı yapısı (SID), kullanıcıları ya da grupları benzersiz bir şekilde tanımlamak için kullanılan değişken boyutlu bir yapıdır. Hashing, bir hash fonksiyonu tarafından yürütülen bir dönüşümdür.”

Pek çok casino slot oyunu gibi Aviator weil Mostbet’in mobil sayfası üzerinden rahatlıkla oynanabilmektedir. Bu süreçte artar ve zaten two to three oranında çökebilir, ancak bazen 100x ya da daha fazlasına ulaşabilir. Daha iyinin görevi, bahsi uçak kalkmadan önce zamanında kapatmaktır. Site ya da Mostbet uygulamasındaki Aviator’ın demo versiyonu deneyin. 1XBet hizmeti, kumar” “piyasasının önde gelenlerinden biridir ve bunun iyi bir nedeni vardır.

Aviator Çarpışma Oyunu

Buna ek olarak, Aviator oyunu, tüm algoritmaların doğru çalışmasını garanti eden kurumda resmi olarak temsil edilmektedir. Van Veen’de oynamaya başlamak için, sadece kayıt prosedüründen geçmeniz ve ilk para yatırma işleminizi yapmanız gerekir. Bunun nasıl yapılacağına ilişkin ayrıntılar kumarhane net sitesinde bulunabilir. Para yatırarak aviator online casino oyunu oynamaya başlamadan önce güvenilir olup olmamasından emin olmanızı ve daha sonra aviator oynamaya başlamanızı öneriyoruz. Aviator Mostbet’i gerçek parayla oynamaya başlamak için, kullanıcının oyun hesabına kaydolması ve para yatırması gerekir. Bunu online casino web sitesinde yapmak çok kolaydır, çünkü Aviator oyunu çok kolay bulabileceğiniz mostbet sitesinin üst menü çubuğunda bulunur.

Mostbet’te Aviator üzerine bahis oynarken akılda tutulması gereken birkaç şey vardır. İlk olarak, oyunda çok fazla hareketli parça vardır empieza tahmin edilemez olabilir. İkinci olarak, oranlar genellikle bahisçiler tarafından belirlenir ve bahisçiden bahisçiye değişebilir. Son olarak, Aviator’ın bir” “şans oyunu olduğunu empieza kimin kazanacağını veya kaybedeceğini tahmin etmenin güvenilir bir yolu olmadığını unutmamak önemlidir. Ancak, bunu aklınızda tutarak Mostbet’te Aviator üzerine bahis oynayarak kar etme şansınızı artırabilirsiniz.

Sonuç: Aviator’u Eğlence Ve Kazanma Şansı Için 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.

Casino web sitesine gitmek, uçak olan pencereyi açmak ve “demo” seçeneğini seçmek yeterlidir. 2019’da, Spribe şirketi Aviator adında benzersiz bir oyun yayınladı. Çarpışma simülatörü on the internet casinolarda bir hit oldu ve kısa sürede kumarbazlar arasında başarı elde etti. Aviator, bir game oyununun ve bir video slotunun özelliklerini ideal bir şekilde birleştirir. Simülatör, çok oyunculu modda oynanan hızlı oyunlar kategorisine aittir.

Aviator Oynamak Için Aşağı Strateji

Oyun çok oyunculu olduğundan, oyuncular diğer kumarbazların kazançlarının istatistiklerini, tur kazanç katsayılarını ve kazanılan miktarları görüntüleyebilirler. Bu, oyuncuların zafer ve Mostbet casino’da gerçek para kazanma konusunda şarj edildiği ve neredeyse bir topluluk oluşturduğu büyük ölçüde yardımcı olur. Aviator oyununu web sitemizde sağlayıcı Spribe’dan ücretsiz oynayın. Aviator’ın demo versiyonu, gerçek parayla oynamaya başlamadan önce size oyunun mekaniğini öğrenme, pratik yapma ve farklı strateji ve taktikler deneme fırsatı verir. Aviator Mostbet sitesinde oynandığı zaman bu artı ve eksilere baktığınızda, artıların daha fazla olduğunu görüyorsunuz.

Aviator, hileyi dışlayan yapay zeka tarafından tamamen kontrol edilir. Dürüstlük ve açıklık, projenin popülerliğinin bêtisier faktörleridir. 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.

Mostbet Aviator Oyununu Oynamaya Nasıl Başlanır?

Her gün Aviator oynayan oyuncuların sayısı düşünüldüğünde, herkesin oyunun nasıl yapılandırıldığıyla ilgilenmesi şaşırtıcı değil. Gerçek parayla oynadıkları oyunun yapısıyla ilgilenen herkes için, popüler çarpışma oyununun mekanizmasını anlamaya karar verdik. Gerçek parayla oynanan her kumar oyununda olduğu gibi Aviator ‘un da kendi bonusları vardır. Birçok yönden, oyun sırasındaki bonus yelpazesi hangi casinoda oynadığınıza bağlıdır. Oyunun bonusları genellikle nihai kazancı etkileyen bir katsayıdan oluşur.

Son dönemin en popüler collision oyunu ne sorusunun tek cevabı va, o da Aviator. 2022 yılında piyasaya çıkan oyunu Mostbet üyeleri istedikleri zaman oynayabilmekte. Ancak Mostbet’e üye olmadan da istediğiniz zaman Avitor’un demo versiyonunu oynayabilirsiniz. Açıklanan prosedür siteye para yatırmanıza yardımcı olacaktır, ancak bunları nasıl çekebilirsiniz? Aslında, para çekme prosedürü daha kolaydır, çünkü sadece düğmeye tıklamanız, miktarı ve ödeme sistemini seçmeniz empieza gönder’e tıklamanız yeterlidir.

Aviator ‘u En Ba?ar?l? Bonuslarla Hangi Casinolarda Bulabilirim?

Bu tür sonuçlara varmak için oyuncuların incelemelerine izin verin. Bir oyunun arkasında bıraktığı görüşün çoğunlukla olumlu olduğunu belirtmek gerekir. Oyuncular, projenin heyecan verici oynanışına ve dürüstlüğüne dikkat çekiyor. Kullanıcılar ayrıca güzel oranlardan ve her turun fazla zaman almadığı gerçeğinden de bahsediyor. Spribe, casino ile işbirliği içinde tüm oyuncuların hem PC’lerde hem de akıllı telefonlarda oynamasını kolaylaştırmaya çalıştı.

Yeter ki siz uçak yüksekte olduğunda daha da yükseye kalkmasını beklemeden bahisi sonlandırmayı mostbet aviatör başara bilin. En iyi aviator oyunu taktiği şudur ki oyun zamanı çok şansa bırakmadan 1. ten gibi oranda bozdurmak ve yüksek pra kazanmadan önce kısa süre küçük-küçük paralar kazanmak. Bunun için ana sayfaya girdikten sonra para yatır tuşuna basarak aviator oyunu icin pra yatırma penceresine giriş yapıyorsunuz. BTC, Para tarnsferi, Payfix, Papara, kredi kartı, banka kartı gibi yöntemlerden birini seçe bilirsiniz. Hesap bilgileri, şifre ve yatırdığınız parayı kontrol ettikten sonra parayı yatır tuşuna basarak para yatırmayı gerçekleştirmiş oluyorsunuz. En fazla 5 dakika içerisinde paranız hesabınıza yatmış oluyor ve aviator oyununda oyuncu statünüz yer alıyor.

Aviator Mostbet Kumarhanesinde Giriş Ve Kayıt

Aviator durumunda bu, oranlar x1’den biraz daha yüksek olur olmaz oyunu erken bitirerek gerçekleştirilebilir. Bu yaklaşım büyük meblağlar kaybetme riskini azaltır, ancak potansiyel kazanma miktarını da azaltır. Aviator oyunu, yeni teknoloji ile eski moda heyecanı başarılı bir şekilde birleştirdiği için birçok oyuncunun zihnini ele geçirdi.

Buna ek olarak, bazı oyun platformları Payoneer gibi yerel bankacılık sistemlerini desteklemektedir. Seçtiğiniz kumarhanenin bankacılık veya kripto para cüzdanınızla çalıştığından emin olmak için afin de yatırma ve çekme hüküm ve koşullarına göz atın. Uçağınız” “düşmeden önce birkaç saniyeniz kaldı, para çekme düğmesine basmanız gerekiyor. Para çekme işlemi yapmak için ödeme bölümünde uygun bölümü seçmeniz ve uygun para çekme yöntemini seçmeniz gerekir. Genellikle para çekme işlemi, para yatırma işlemi için kullanılan aynı ödeme sistemine yapılır. Kazandığınız yüksek paralar bir anda kayb edile bildiği gibi hem de bir anda yüksek paralar kazanıla bilir.

Mostbet Aviator Oyununda Sadakat Programları, Bonuslar Ve Promosyon Kodları

Bu da aviator oyunu oynamak isteyenler için Türkiye içerisinde hiç bir sorun olmadığını kanıtlıyor. Mostbet Aviator’ı gerçek parayla oynama fırsatına ek olarak, kumarbazlar ayrıca demo moduna da erişebilirler – yatırım yapmadan ücretsiz oynanan oyun. Bu modu başlatırken, hesabınızı kaydetmeniz veya afin de yatırmanız gerekmez.

Bununla birlikte, eylemlerinizin yasallığı konusunda tamamen sakin olmak için, kumar düzenlemesi açısından ülkenizin mevcut mevzuatını öğrenebilirsiniz. Örneğin, oranların 2, 5’e yükseleceğine dair bir bahis oynadınız. Aviator’da maksimum ödeme bahsin büyüklüğüne bağlıdır ve oynadığınız kumarhaneye bağlı olarak about binlerce dolara ulaşabilir. Aviator oyununu hacklemek imkansızdır, çünkü oyunla ilgili tüm veriler ve hesaplamalar uzak sunucularda yer alır ve özel algoritmalar kullanılarak çoğaltılır. Aviator oyunu yapay zeka tarafından kontrol edilir, bu nedenle hile yapmak imkansızdır. Her turdan önce pola, oyuncular tarafından sisteme girilen verilerden türetilen sembollerin bir kombinasyonu olan benzersiz bir karma oluşturur.

Mostbet Aviator Sinyal Hilesi 50x

Spribe sağlayıcısından resmi bir Aviator uygulaması bulunmadığından, lisanslı bir çevrimiçi kumarhane uygulaması yüklemeniz gerekir (örneğin, 1win, 1xbet, pin upward vb. ). Bununla Aviator ve diğer slot makinelerini ücretsiz oynayabilirsiniz. “Aviator” oyununun demo versiyonu gerçek parayla bahis yapma fırsatı sağlamaz.

Avıator oyunu, adrenalin ve heyecan arayanlar arasında popülerlik kazanmış heyecan verici bir kumar oyunudur. AVIATOR’un resmi web sitesi, oyuncuya afin de karşılığında oyun oynama ve şansını deneme fırsatı sunuyor. Casino Mostbet yetişkinler için büyük ölçekli bir kumar platformudur. Aynı zamanda, Mostbet online casino hala ayakta durmuyor ve sürekli genişliyor, dikkat çekmek için yeni yollar buluyor.

Aviator Oyunu Hilesi Var Mı? Aviator Oyunu Taktikleri Nelerdir?

Yapay zeka kontrolü sayesinde, çarpanın ne zaman büyümeyi durduracağını empieza paranızın geri dönüşü olmayan bir şekilde yanacağını kimse tahmin edemez. Oyunun otomatik bir modu vardır – oyun başlamadan önce ayarlanabilir. Örneğin, sabit bir bahis miktarı veya otomatik nakit çıkışı için bir katsayı ayarlayabilirsiniz. Online casino Mostbet, banka kartları, e-cüzdanlar, banka havaleleri empieza kripto para birimleri dahil olmak üzere birçok ödeme sistemini kabul etmektedir. Oyuncuların sorunlarla karşılaşmasını önlemek için, platformun yaratıcıları Mostbet’in çalışmalarını yasallaştıran bir lisans aldı. Böylece, oyunlardan para kazanmaya çalışırken veya sadece kumar eğlencesinde dinlenirken, platformda yasaları ihlal etmezsiniz.

Belirli bir hizmete ilk sefer para yatırdığınızda yaşadığınız heyecan düzeyine hepimiz aşinayız. Çoğu insan ölümcül bir hata yapmaktan veya yanlış bir şey yapmaktan korkar. Bir sonraki Aviator turu için hash kombinasyonu, boy turun hash sonucuna ve oyuncuların sidolarına bağlı olduğundan önceden belirlenemez. Her turda kazanma anı oyun başlar başlamaz oluştuğu için, kazanmanın tek yolu kazanmak için oynamaktır.

İki Kat Bahis Stratejisi

Sanal fonlar kullanır, depozito gerekmez ve kazançlar geri alınamaz. Mostbet platformunda bulunan Aviator gibi kumar oyunlarından birini oynamak için ilk para yatırma işleminizi yapmanız gerekecektir. Aircraft Aviator : kumar endüstrisinde gerçek bir hit olarak kabul edilen empieza sitede resmi olarak mevcut olan bir oyun. Oyuncularının oyunun en son güncellemelerine erişebilmelerini sağlamak için platform, içerik oluşturucularla iletişime geçti empieza resmi izin aldı. Aviator uçak oyunu yasal mı diye soranlara cevabımız – aviator oyunu güvenilir olduğu kadar da tamamen yasaldır ve curacao lisanslıdır. Son zamanlarda bir diğer fikir ise türkiye yasalarına aykırı olduğu yönde olsa da bu Mostbet online casino sitesinde hiç bir sorun olmadığını belirtmek isteriz.

Kazancınızın seçilen hesaba yatırılma süresi, doğrudan ödeme sisteminizin ya da hizmetlerini kullandığınız hizmetin özelliklerine bağlı olacaktır. Ayrıca Mostbet bahisçi mobil uygulamasını akıllı telefonunuza indirebilirsiniz. Mostbet bahis şirketinin sah web sitesinde demo modunu kullanabilirsiniz.

5x Bahis Stratejisi

Mostbet’te Aviator üzerine, uçağın parkuru nenni kadar sürede tamamlayacağını tahmin ederek bahis oynayabilirsiniz. Oranlar ekranda gösterilecek ve sürenin tahmin edilenden daha uzun mu yoksa daha kısa mı olacağına bahis oynayabilirsiniz. Aviator, oyuncuların bir engel parkurundan geçerken bir uçağı kontrol” “ettiği bir oyundur. Farklı zorluk seviyeleri vardır ve parkuru mümkün olan en hızlı sürede tamamlayarak puan kazanabilirsiniz. Tekli bahis stratejilerinden farklı olarak bu sefer ekranın her iki tarafına da bahis yapılmaktadır. Bu stratejinin temelinde bir tarafta yatırılanı kazanıp, kaybı sıfırlamak vardır.

Türkiye sınırları” “içerisinde Mostbet casino sitesinde aviator uçak oyununu oynayan ve büyük paralar kazananlara rastlıyoruz. Aklınızda bulunsun ki Aviator kazanma taktikleri arasında – büyük paralar kazanmak için acele edersen kazandığın küçük paraları de uma kayb etmeği hesaba katmak var. Aviator slotunda gelir elde etmek için temel stratejileri bu şekilde karakterize ede biliriz. Her oyuncu, Aviator slot uygulamasında bahislerin şeffaflığını takip edebilir.

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