Mostbet Bahisçisi: En İyi Oranlar Ve Çevrimiçi Canlı Bahis Deneyimi

Mostbet Chicken Resmi Sitesi Mostbet Casino 2024

Oyuncu, uygulamanın güncellemesini göz ardı ederek, yalnızca yüklenmesini önemli ölçüde yavaşlatmakla kalmaz, aynı zamanda kritik güncellemeler yoksa programın bir noktada açılmama riskini de taşır. Geri kalan durumlarda, mostbet. apk dosyasını indirdikten” “sonra Android uygulamasını yükleme prosedürü, onu mobil cihazda başlatmak ve basit ve anlaşılır talimatları izlemektir. Kurulum birkaç saniye sürer ve tamamlandığında, akıllı telefonun çalışma ekranında Mostbet logosuna sahip bir kısayol görünecektir.

Çok çeşitli klasik slotlar var – birçok türden orijinal görsel ve ses tasarımına sahip yüzlerce oyun. Slotları yalnızca ana hesaptan değil, aynı zamanda bir demo hesabından de uma (ücretsiz olarak) oynayabilirsiniz. Bu, depozitonuzun güvenliği için her oyunun arayüzünü güvenli bir şekilde tanımanıza olanak tanır. Mostbet’teki spor bahisleri bölümü, durante popüler olanlardan (futbol, hokey, tenis, basketbol) sıra dışı olanlara (araba yarışı, at yarışı, köpek yarışı) kadar 33 farklı sporla çok geniştir. Bir spor seçtikten sonra, bahis listesini şampiyonalara, liglere empieza ülkelere göre sıralayabilirsiniz. Kullanıcı dostu arayüzü ile dikkat çeken bu platform, yüksek oranlar ve geniş bahis seçenekleri sunarak kullanıcılarına eşsiz bir deneyim sağlamayı amaçlamaktadır.

Çizgi, Bahis Için Mevcut Maç Sonuçlarının Listesi Ve Oranlar

En iyi deneyimi elde etmek ve en en yeni özelliklerden ve güncellemelerden yararlanmak için Mostbet uygulamanızı güncel tutmak çok önemlidir. Mostbet’in kullanıcı gizliliğini empieza güvenliğini ciddiye aldığını ve kullanıcı bilgilerini korumak için sıkı güvenlik önlemleri kullandığını belirtmek önemlidir. Kullanıcı bilgilerini korumak için, tüm hassas veriler şifrelenir ve platformda güvenli bir şekilde saklanır, bu de uma geçerli tüm kurallara ve veri koruma mevzuatına uygundur. Ziyaretçinin ek bonuslar almasını sağlayan bir promosyon kodu varsa kayıt aşamasında da girebilir mostbet turkey.

Ayrıca uygulama menüsünde destek hizmetleri koordinatları, kurallar empieza sıkça sorulan soruların cevapları vardır. Uygulamada Türkçe de dahil olmak üzere çok çeşitli diller bulunmaktadır. Tüm verilerinizin güvende ve emniyette tutulmasını sağlamak için durante son şifreleme teknolojisini kullanırlar. Ayrıca, müşteri destek ekibi the girl türlü sorunuzu ya da endişenizi yanıtlamak için her zaman hazırdır. Mostbet ayrıca Klasik Bakara, Mini Bakara ve Yüksek Limitli Bakara gibi çeşitli bakara çeşitleri sobre sunmaktadır.

Mostbet’te Ücretsiz Bahisler

Mostbet iOS uygulamasını indirmek için App Store’a gidin ve “Mostbet “i arayın. Uygulamayı bulduğunuzda, “Get” butonuna tıklayın ve uygulamayı kısa sürede cihazınıza yüklemiş olacaksınız. Mostbet Android os uygulamasını indirmek için Google Play Store’a gidin ve “Mostbet “i arayın. Uygulamayı bulduğunuzda, “Yükle” düğmesine tıklayın ve uygulamayı kısa sürede cihazınıza yüklemiş olacaksınız. Kumar ve eğlence web bunları şirket the woman seçin müşterisi kendisine en edin alın uygun seçeneği seçebilir.”

Hesabınızı silmek için destek hattıyla veya mevcut başka bir yöntemle iletişime geçmeniz ve niyetinizi onlara bildirmeniz gerekir. Doğrudan mobil cihazınıza indirebilir veya apk dosyasını bilgisayarınıza indirebilir ve mevcut herhangi bir yöntemle telefonunuza aktarabilirsiniz. Hesabınızı doğrulamak için öncelikle kişisel dolabınızda bir périphérie doldurmanız gerekir.

Ios Için

Mostbet’te promosyon kodlarını kullanmak için, bunları kayıt veya ödeme sırasında uygun alana girmeniz yeterlidir. Ne elde ettiğinizi anladığınızdan emin olmak için kodla ilişkili tüm hüküm ve koşulları okuduğunuzdan emin olun. Promosyon kodları yalnızca belirli spor bahisleri hizmetleri için geçerli olabilir, bu nedenle kullanmadan önce gerekirse iki kez kontrol ettiğinizden emin olun. Most Bet kumar türçe dili ve eğlence internet sayfası henüz aşina değilseniz, bahisçinin kalitesi ve güvenilirliği ilgili kafanız da sorular oluşması oyunculara kapalı muhtemeldir. Herhangi bir şüpheyi” “ortadan kaldırmak için, Mostbet casino ve bahis şirketinin hizmetlerini uluslararası tipte bir lisans — Curaçao temelinde sunduğunu etkinlik belirtmekte fayda var. Rakiplerle karşılaştırıldığında, bu bahis şirketinin ofisinde afin de yatırma ve çekme işlemleri çok uygundur.

Mostbet TR bahisçi ofisi, taşınabilir cihazlarda oynamak için sitenin mobil sürümünü veya Google android ve iOS için Mostbet App kullanma olanağına sahiptir. Uygulamaları mobil sitedeki bağlantılardan ücretsiz olarak indirebilirsiniz. Slot makinesindeki demo modunu etkinleştirmek için – üzerine “Ücretsiz oyna” tuşuna basmanız gerekir – bu durumda oyuncu trial modunda oyuna girecek ve gerçek pra kaybetme riski olmadan oynayabilecektir. Bu imod çoğu yuvada, sanal sporda, özellikle de popüler Aviator gibi crash oyunlarında kullanılabilir. Belli sebeplerden dolayı gerçek krupiye olan oyunlarda böyle bir mod yoktur – orada her çekiliş veya kart dağıtımı para için oyun formatında yapılır.

Mostbet’te Haftalık Para Yatırma Bonusları

Bu bahis sitesi, sektördeki en iyi bahis oranlarından bazılarını ve NetEnt empieza Microgaming gibi önde gelen sağlayıcıların geniş bir oyun yelpazesini sunar. Alınan bonusu geri kazanmak için bonus ödemesinin kendisinden birkaç kat daha yüksek bir miktar için bahis yapmanız gerekir. Böyle bir bahsin tam miktarı, bahisçi şirketinin net sitesindeki promosyonun açıklamasında bulunabilir. Mostbet’e gidin ve en sevdiğiniz sanal sporlar dallarına ve popüler siber disiplinlere karlı bahisler yapın. Bu şartın yerine getirilmemesi ve kayıt sırasında belirtilen telefon numarası ve e-postanın onaylanması olmadan, yeni oyuncu hoşgeldin bonusu alamaz ve ilk ödeme talebinin yapılmasına izin verilmez. Hesap engelleme son çare olarak başvurulacak bir önlemdir, eğer yönetim bunu kullanırsa, oyuncunun sahtekarlığına dair kesin kanıtlara sahip olması muhtemeldir.

Bu güzel reward, bahis için yapılan ilk para yatırma işleminde belirli bir limite” “kadar %100 eşleşme imkanı sunuyor. Mostbet, yr yılından bu yana faaliyet gösteren, sahibi Venson Ltd olan ve sektördeki en güvenilir isimlerden biri haline gelen Kıbrıs merkezli bir bahis şirketidir. Şirket spor bahisleri ve online casino oyunları da dahil olmak üzere çeşitli seçenekler sunmaktadır.

Mostbet’te Kayıt Süreci

Bir oyuncunun sanal” “slot machine game makinesinin arayüzüne alışması veya kumar bileşeni olmadan oynaması için bir demo hesabı gereklidir. Bu incelemeden, Mostbet (mostbet. com) dürüst bir bahis şirketi olduğu sonucuna varabiliriz. Özellikleri, şansınız yaver giderse kazancınızı kesin olarak alacağınızdan emin olarak kumar oynamak için kullanılabilir. Mostbet bir oyuncuyla yaptığı finansal işlemlerin meşruiyetini sağlamak empieza oyuncunun kurallara uygunluğunu doğrulamak için gereklidir.

Buna ek olarak, çeşitli bonuslar” “empieza promosyon kodları ile oyuncularını cezbetmekte. Ancak, bu teşviklerin yanı sıra, bazı koşullar ve şartların de uma bonusları etkin olarak kullanabilmek için yerine getirilmesi gerektiğini unutmamak önemli. Öte yandan, platformun sunduğu müşteri desteği, bazı kullanıcılar için sınırlı olabilmekte veya yavaş yanıt verebilmekte ki bu da belirli durumlarda dezavantaj olarak görülebilir. Çeşitli sporlara ve e-sporlara bahis yapma imkanına ek olarak şirketinin sitesinde kumarhaneyi ziyaret edebilirsiniz. Tasarımı klasiktir – ana ekranda farklı kategorilerde (“TOP”, “Öneriler” vb. ) slotlar mevcuttur. Ayrıca slot makineleri uygun filtreler kullanılarak – türe, sağlayıcıya ve daha fazlasına göre seçilebilir.

Mostbet’te Yeni Ziyaretçiler İçin Hoşgeldin Bonusu

Programı bulduktan sonra, güncellemeleri arayın ve ekrandaki talimatları izleyerek mevcut olanları yükleyin. İşlevsel olarak, uygulama hiçbir şekilde siteden daha geri değildir – burada yeni bir oyun hesabı oluşturabilir, hesabınıza para yatırabilir, bahisçinin tüm bonus tekliflerini kullanabilirsiniz. Sadece uygulamada kullanılabilen bir dizi özellik de vardır – canlı maçlardan bildirimlerin ayarlanması, temanın değiştirilmesi (karanlık, açık). Maç öncesi, maç veya etkinlik başlamadan önce herhangi bir spor dalına bahis oynayabileceğiniz anlamına gelirken, canlı bahis, etkinlik sırasında bahis yapmanıza olanak tanır.

Çevrimiçi spor bahisleriyle ilgilenen oyuncular Mostbet sitesine göz atmalıdır. Bu bahis sitesi sektördeki en iyi bahis oranlarından bazılarını ve NetEnt ve Microgaming gibi önde gelen sağlayıcıların geniş oyun yelpazesini sunmaktadır. Genel olarak, Mostbet mobil uygulaması kullanıcılara favori spor etkinliklerine bahis oynamaları için uygun, güvenli ve kullanıcı dostu bir program sağlar.

Mostbet Kayıt Ve Doğrulama

Uygulamanın ‘Bize Ulaşın’ sekmesi veya SSS bölümünün her ikisi de çeşitli seçenekleri listeler. Mostbet net sitesini ziyaret ederek ve ‘Kaydol’ seçeneğini seçerek bir Mostbet hesabı açabilirsiniz. Kayıt formunu kişisel bilgilerinizle doldurun, ardından hesabınızı onaylamak için talimatları izleyin. Ayrıca bu tür programlar bêtisier siteye erişimin kapalı olduğu durumlarda bile yüklenebilmektedir. Mostbet sporlarına bahis oynamanıza izin veren uygulamaları nasıl indireceğinizi öğrenmek için” “ilgili Mostbet mobil uygulamasına gitmeniz yeterlidir. Oyuncular mobil versiyonun yanı sıra uygulamaları da kullanabilirler.

Bir aydan fazla bir süre önce kaydolduysanız, ilk pra yatırma bonusu kullanılamayabilir. Diğer durumlarda, desteğe başvurmanız ve işlemin tarihini, saatini, miktarını belirtmeniz ve çevrimiçi bankacılık veya navigation cüzdandan bir ekran görüntüsü sağlamanız gerekir. Para çekme işlemi, hesaba para yatırma işlemi sırasında kullanılan yöntemle gerçekleştirilir. Mostbet, 17 farklı afin de yatırma ve çekme yöntemi sunmaktadır empieza en popüler olanları aşağıdaki tabloda bulabilirsiniz. Ana ekranda oyunlar özelliklerine göre (bonus, jackpot, risk oyunu vb. ), türe göre (çizgi motion picture, spor, 18+, Mısır vb. ) ve sağlayıcıya göre sıralanabilir. Mostbet uluslararası bir kuruluştur ve net sitesi. com joe adı bölgesinde yer almaktadır.

Mostbet Bonusları

Bu, ne zaman bahis yapmak isterseniz isteyin, Mostbet’te herkes için bir şeyler olduğu anlamına gelir. Ücretsiz döndürmeler, bahislerinizden daha fazlasını elde etmenin bir başka yoludur. Bu ücretsiz döndürmelerle, potansiyel olarak bazı büyük ödüller kazanmak için makaraları döndürebilirsiniz.” “[newline]Ücretsiz çevirmeler genellikle slotlarda ve diğer on line casino oyunlarında sunulur, bu nedenle bonus ararken en iyi fırsatları kontrol ettiğinizden emin olun. Bu nedenle, şu özel Many bet Türkiye bahis şirketinin yeni ziyaretçileri için ilk pra yatırma da anında %100 sunduğu promosyonları alma iyi fırsatı hediye vardır.

Günün veya gecenin herhangi bir saatinde katılabilirsiniz ve aralarından seçim yapabileceğiniz birçok farklı oyun türü vardır. Bunlar, kullanıcıların bu kumarhanede bahis oynayabileceği birçok lig ve turnuvadan sadece birkaç örnektir. Çevrimiçi spor bahisleri, milyonlarca insanın çeşitli spor dallarına bahis oynadığı devasa bir sektördür. Bahis yapılabilecek en popüler sporlar futbol, ​​basketbol ve beyzboldur. Ancak at yarışı, tenis ve diğer e-sporlara da bahis oynayabilirsiniz. Bir kumarhane için yapılan depozitoda %100 bonus + 13 $ veya daha fazla para yatırma işleminde seçilen slot oyunları için 250FS.

Android Için Mostbet Uygulamasını İndirin ( Apk Dosyası)

Mostbet, Türkiye’de” “spor bahislerinden canlı kumarhane oyunlarına kadar geniş bir yelpazedeki kumar ve bahis seçeneklerini arayan kullanıcılar için ideal bir tercihtir. Mostbet bahis şirketi, kullanıcılarına yüksek oranlar ve bir dizi eğlenceli oyun sunarak, bahis piyasasında kendine sağlam bir yer edinmiştir. Siteye erişim sağlayabilmek için güncel Mostbet giriş adreslerinin takip edilmesi ?art? aranmaktad?r, zira bu tür siteler sık sık erişim engellemelerine maruz kalabilmektedir.

Ayrıca, kazancınızı önemli ölçüde artırabilecek dolar topu ikramiyeleri ve aşamalı ikramiyeler gibi added bonus özelliklerle birlikte gelirler. Ayrıca bahis oynayabileceğiniz daha az bilinen birçok spor dalı da vardır. Ayrıca, rekabetçi oranlar ve çizgilerle, her zaman büyük kazanma şansınız olacak. Hoş geldin bonusları, online bahis oynamaya başlamak için harika bir yoldur. Bu bonuslarla, kaydolurken genellikle hesabınıza belirli biraz para yatırılmasını sağlayabilirsiniz.

Mostbet’te Bahis Yapılabilecek Popüler Spor Etkinlikleri

Bu sadece sitede mevcuttur, yani mobil uygulama aracılığıyla kayıt yaptırırken mevcut değildir. E-posta ile kayıt yaptırırsanız – Mostbet’ten gelen postada belirtilen adrese gelecek olan bağlantıyı de?erlendirmek vas?tas?yla e-posta adresini onaylamanız gerekir. Mostbet ayna web sitesi, orijinal resmi web sitesiyle aynı içeriğe ve işlevselliğe sahip bir yedek veya alternatif web sitesidir. Mostbet‘ten para çekme işlemi, geçerli bir ödeme yöntemine sahip oldukları sürece lokasyona bakılmaksızın tüm müşteriler tarafından yapılabilir.

Mostbet APK indir işlemi, bahis platformunun sunduğu hizmetlerden sorunsuzca faydalanmak dü?ünenenler için büyük öneme sahiptir. Android cihazlarınıza kolayca indirilebilen bu uygulama ile spor bahisleri, çeşitli canlı casino oyunları ve zengin slot seçeneklerine anında ulaşabilirsiniz. Ayrıca, uygulama üzerinden mevcut hesabınıza giriş yapabilir veya yeni bir hesap oluşturabilirsiniz. Mostbet bahis platformu, kullanıcılarına cazip bonuslar ve promosyon kodları sunarak onların oyun deneyimini zenginleştirmeyi hedeflemektedir. İster spor bahisleri alanında isterse de online casino oyunlarında farklı promosyon seçeneklerinden faydalanmak mümkündür. Örneğin, en yeni üyeler için hoş geldin bonusu, mevcut kullanıcılara ise yatırım ve kayıp bonusları gibi çeşitli kampanyalar düzenlenmektedir.

Mostbet Türkiye’de Spor Bahisleri Için Yasal Ve Güvenli Bir Platform Mu?

Kullanıcılar platformu kullanabilmek için Mostbet uygulamasını indirmeli ve yüklemelidir. Mostbet uygulaması cihazınıza indirildikten sonra artık çok sayıda spor etkinliğine bahis yapmaya başlayabilirsiniz. Onun on-line avantajlarından biri hem yeni kullanıcılara hem sprained ankle de düzenli müşterilere sunulan çok sayıda bonustur. Hoşgeldin bonusu ilk para yatırma işleminden sonra kredilendirilir ve yatırılan tutarın %100’üne ulaşabilir. Mostbet Türkiye‘de tüm popüler sporların yanı sıra bazı oldukça orijinal disiplinlerde çevrimiçi bahisler yapabilirsiniz. Futbol, ​​basketbol, ​​futsal, masa tenisi ve daha pek çok alanda turnuvalar vardır.

Mostbet tarafından sunulan kredi/banka kartları, e-cüzdanlar, banka havaleleri ve diğerleri gibi para çekme seçeneklerinden birini kullanarak kazancınızı nakde çevirebilirsiniz. Para çekme işlemini başlatmak için hesabınızda oturum açın ve ‘Para Çek’ düğmesini seçin. Kredi/banka kartları, e-cüzdanlar, banka havaleleri ve diğerleri gibi kabul edilen ödeme yöntemlerinden birini kullanarak Mostbet hesabınıza para ekleyebilirsiniz. Başlamak için, hesabınıza giriş yapın ve ‘Para Yatırma’ seçeneğini seçin. Bir Mostbet hesabı oluşturmak ve hareket halindeyken platformun yeteneklerini kullanmaya başlamak için hızlı ve basit bir yaklaşım Mostbet mobil uygulamasını indirmektir. Kullanıcı dostu düzeni ve pratik özellikleri sayesinde bahislerinizden empieza keyif aldığınız spor etkinliklerinden haberdar olmak için ideal bir yöntemdir.

Mostbet Para Yatırma Ve Para Çekme Yöntemleri

Yetkisiz kullanıcılar oyunun şart ve koşullarını, spor bahis oranlarını görebilir, destek ekibiyle iletişime geçebilir ve slot machine demo sürümlerini oynayabilirler. Yetkilendirme sırasında herhangi bir hata oluşursa, şifreyi geri yüklemeyi deneyin. Bunu yapmak için, görünen giriş penceresinde “Şifrenizi unuttunuz mu? 30 saniye içinde ulaşacak olan e-postadaki SMS kodunu veya bağlantıyı de?erlendirmek suretiyle şifreyi sıfırlamanız empieza yeni bir tane oluşturmanız gerekir.

Mostbet’teki müşteri hizmetleri personeli iyi eğitimlidir ve tüketicilere en iyi çevrimiçi deneyimi sunmayı taahhüt eder. Mostbet müşteri hizmetleri personeli, bahis, hesapla ilgili problemler veya aradaki her şey hakkında sahip olabileceğiniz her türlü sorunuzda size yardımcı olmak için buradadır. Güncellemenin düzenli olarak yapılması gerekir, çünkü uygulama geliştiricileri sürekli olarak hataları düzeltmek ve programı – tasarımını ve işlevselliğini – modernize etmek için çalışırlar.

Mostbet Mobil Uygulamasının Faydaları

Mostbet müşteri hizmetleriyle canlı sohbet seçeneği, e-posta, telefon görüşmesi veya Mostbet web sitesinin SSS alanı aracılığıyla iletişime geçerek hızlı empieza kolay bir şekilde yardım alabilirsiniz. Mostbet’teki müşteri hizmetleri personeli, karşılaşabileceğiniz herhangi bir soru veya sorunla ilgili olarak size yardımcı olmak için günün her saati hazırdır. Mostbet Türkiye sitesine kaydolmak, canlı casinoda bahis yapma, maçların video yayınlarını izleme, kumarhanede oynama fırsatına erişmenizi sağlar. Şimdi Curacao düzenleyici otoriteleri tarafından verilen uluslararası bir lisans temelinde çalışmakta. Şirket herhangi bir ciddi kısıtlama olmaksızın dünyanın her yerinden bahisçileri kabul etmekte. Ek olarak kullanıcılar finansal işlemleri gerçekleştirme kolaylığı için mevcut birkaç para birimi arasından seçim yapabilmekte.

Bu avantaj, bazı ülkelerde kaynakları engellenebilecek offshore kumarhaneler ve bahisçiler için özel bir değere sahiptir. Yeni hesaba giriş yaptıktan hemen sonra sitede veya uygulamada başlatılacak bir zamanlayıcı yönlendirmeye yardımcı olacaktır. Evet, Mostbet’te çeşitli uluslararası spor etkinliklerine bahis oynayabilirsiniz. Ayrıca, belirli sporların ve etkinliklerin canlı yayınını da sunarlar, böylece aksiyonun hiçbirini kaçırmazsınız.

Mostbet Ios Uygulaması Nasıl Indirilir

Ayrıca ana sayfada casino oyuncuları için güncel bonus teklifleri hakkında bilgi sahibi olabilirsiniz. Mobil uygulamaların önündeki en önemli avantajlardan biri Mostbet mobile phone version – bahisçi ofisinin hizmetlerine erişim hızı. Uygulamadaki kullanıcı adı ve şifre sistem tarafından hatırlanır ve girişte çok nadiren talep edilir, bu da programı hızlı bir şekilde açmanıza ve spor bahislerine ve online casino oyunlarına erişmenizi sağlar. Mostbet’e para yatırmak ve çekmek için öncelikle çevrimiçi spor bahisleri kuruluşunda bir hesap oluşturmanız gerekir. Para yatırma empieza çekme için kesin prosedür, kullandığınız platforma veya cihaza empieza mevcut ödeme seçeneklerine göre farklılık gösterebilir.

Mostbet Türkiye, aralarından seçim yapabileceğiniz çeşitli spor dalları ile çeşitli bir bahis deneyimi sunuyor. Basit tasarımı ve banka bankacılığı, e-cüzdanlar empieza kripto para birimleri dahil çoklu işlem yöntemleri, para yatırma ve çekme işlemlerini sorunsuz bir deneyim haline getirir. Türkiye’den oyuncular için mostbet. com sitesinde TL’ye kadar bahis oynamak veya casino oynamak için (isteğe göre) hoş geldin bonusu vardır. Müşteriler telefon numaralarını, e-posta adreslerini veya Twitter, Telegram, Steam veya Yahoo gibi sosyal medya hesaplarını kullanarak Mostbet’e kaydolmayı seçebilirler. Bu, kayıt sürecini hızlı, kolay ve kullanışlı hale getirir ve müşterilerin anında bahis oynamaya ve platformun keyfini çıkarmaya başlamasına olanak tanır. Ayrıca tüm düzenli kullanıcıların bu şirketin sitesindeki etkinlikleri için özel teklifler almalarını sağlayan sadakat programının şartlarını okumayı da unutmayın.

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