Najlepsze Kasyno Online W Polsce”

Kod Promocyjny Verde Casino: Ekskluzywne Oferty!

Content

W ten sposób każdy ma wysokie prawdopodobieństwo, że uda się go wypełnić i ostatecznie nawet wypłacić. Tak się składa, że dzięki naszym ekspertom keineswegs musisz szukać bonusów samodzielnie. Możesz skorzystać z aktualnych informacji o wszystkich dostępnych ofertach w tym momencie. Inna opcja to Verde Casino bonus codes stosowane podczas wpłacania pieniędzy na konto t kasynie. Tutaj zasada działania jest identyczna, z tą tylko różnicą, że taki kod wpisujesz nie w formularzu rejestracyjnym, ale w oknie dokonywania płatności.

Najlepsze w tym wszystkim jest to, że sami nic keineswegs ryzykujemy, bo przecież portal nie wymaga zasilania konta. Na przykład, jeśli po rejestracji zdecydujecie się na cztery depozyty, to będziecie mogli otrzymać dodatkowe five thousand PLN i 220x obrotów w ramach bonusu powitalnego. Dzięki temu może zaproponować aktualne, najlepsze promocje bez depozytu, które są tworzone wyłącznie dla użytkowników naszego portalu. Dlatego przedstawionych ofert nie znajdzie się w żadnym innym miejscu — nawet na oficjalnej stronie kasyna.

Verde Online Casino Wpłaty I Wypłaty

Ogólnie rzecz biorąc, kod promocyjny to ciąg znaków (litery i cyfry), który należy wpisać w odpowiednim miejscu na stronie kasyna. Gdy to zrobisz, to aktywujesz automatycznie przypisany do danego kodu bonus. To bardzo proste we skuteczne rozwiązanie, które pozwoli Ci odebrać bonusy w wielu wypadkach ekskluzywne i niedostępne w standardowy sposób. Nie musi więc nikogo dziwić, że fani habgier hazardowych online bardzo lubią kody promocyjne i często ich szukają, licząc mhh trafienie unikatowych bonusów o niespotykanych warunkach. Podstawową mechaniką naszego programu lojalnościowego jest możliwość wymiany punktów na darmowe pieniądze. Z programem lojalnościowym sparowane są również nasze dwie główne regularne promocje dla stałych graczy — VerdeCasino bonus refill i cashback verde casino.

Żeby potencjalni użytkownicy kasyna mieli pewność corp do rzetelności rozgrywki i wszystkich dostępnych na stronie funkcji, postarano się um odpowiedni dokument licencyjny. Licencjodawca w five sposób zapewnia, że sprawdził Verde Casino pod każdym względem i wymógł mhh operatorze zastosowania wszelkie standardów dotyczących bezpiecznej rozgrywki w Globalnej sieci. Dzięki temu można mieć pewność, że wszystkie gry działają na RNG we zostały dopuszczone perform rozgrywki przez oficjalne organy sprawdzające.

Czy Verde Casino Mum W Swojej Ofercie Bonusy?

Bardzo irytujące jest również to be able to, że masz wy??cznie 48 godzin em spełnienie wymagań dla każdego pakietu bonusowego – więc musisz się spieszyć. Istnieje również maksymalna stawka bonusowa na obrót w wysokości a few euro. Dzisiaj przygotowaliśmy dla Ciebie artykuł, w którym” “wyczerpująco opiszemy dostępne watts Verde Casino kody promocyjne. Jeśli nigdy nie miałeś wcześniej z nimi carry out czynienia, to jesteśmy pewni, że będzie on dla Ciebie wyjątkowo interesujący. Wystarczy przejść do sekcji kasjera, wybrać określoną metodę oraz wprowadzić kwotę. Następnie zatwierdzić transakcję i środki zostaną przesłane em Twoje konto.

Oczywiście musisz także mieć na uwadze, że zawsze staramy się być o krok przed konkurencją, corp między innymi przekłada się na szybko zmieniającą się ofertę bonusów i promocji. W efekcie stale zmieniamy dostępne u nas bonusy, dodając nowe pozycje lub zmieniając warunki ngakl, były one jeszcze bardziej atrakcyjne dla graczy. Ma to jednak pewien drobny minus — oznacza bowiem, że oferowany przez nas t Verde Casino added bonus code nie trwa w nieskończoność. Każdy taki kod ma swój jasno zdefiniowany okres ważności i aby z niego skorzystać, musisz proceed aktywować przed wyznaczonym terminem. Dzięki niemu gracze mogą mieć pewność, że ktoś czuwa nad ich komfortem podczas przebywania na stronie.

Verde On Line Casino Bonus Bez Depozytu – 50 Darmowych Spinów Czy 25 Euro Bez Depozytu!

Kody te mogą zapewniać zarówno bonusy bez depozytu, jak i bonusy od depozytu. Nasza oferta promocyjna jest niezwykle wszechstronna, bo obok bonusów dla nowych graczy, mamy też par? promocji dla regularnie odwiedzających nas użytkowników. Co więcej, naszym graczom umożliwiamy również korzystanie z kodów promocyjnych i specjalnych bonusów. Wystarczy zarejestrować się na stronie kasyna, aby natychmiast otrzymać 25 european kredytu startowego – bez konieczności dokonywania wcześniejszej wpłaty. Jeśli jesteś zainteresowany pakietem powitalnym w Obsceno Casino, powinieneś być również świadomy wymagań.

W 10 sposób wyszukanie odpowiedniej pozycji zajmuje dosłownie kilka chwil. Maksymalna kwota premii otrzymanej z bonusu odnawialnego, to od zł na pierwszych dwóch statusach, przez zł na kolejnych trzech i zł na pozostałych. Do odebrania dodatku nie jest wymagany żaden bonus code Verde On line casino. Zdajemy sobie sprawę, że promocje są jednym z najistotniejszych czynników warunkujących atrakcyjność oferty każdego kasyna internetowego. Dlatego też postanowiliśmy zaprezentować naszym odbiorcom na tyle rozbudowaną ofertę, aby każdy był z . niej zadowolony. Na przykład powinieneś wiedzieć, że pomyślnie dokonanej wpłaty nie można cofnąć, dlatego powinieneś dokładnie przemyśleć kwotę, którą wpłacasz na swoje konto gracza.

Gdzie Mogę Znaleźć Verde Casino Kod Promocyjny?

W ten sposób relatywnie młode kasyno już na starcie dostarcza swoim odbiorcom ogrom możliwości i to be able to dopiero początek, ponieważ twórcy z pewnością nie poprzestaną mhh laurach. Dzięki możliwości otrzymania zwrotu gracz zawsze ma pewność, że nigdy ostatecznie nie przegra i actually otrzyma drugą szansę, która pozwoli mu się odbić. Gry losowe mają to accomplish siebie, że potrafią być całkowicie nieprzewidywalne i nawet częściowy zwrot pieniędzy może sprawić, że fortuna się odwróci. Każdy z kolejnych statusów nawiązuje do tytułu awatara użytkownika — jest ich dziesięć i są przyznawane co 10 poziomów.

Oferta gier jest równie niesamowita, ponieważ obejmuje kilkaset tytułów, które zostały wyprodukowane przez renomowane marki. Wpłaty dokonasz za pomocą wielu stabilnych systemów płatniczych, które błyskawicznie przetwarzają płatności, co pozwoli Ci na natychmiastowe rozpoczęcie gry bez zbędnego oczekiwania. Aktywacja nagród za Verde kod” “i actually innych promocji tego typu dla każdego, kto i ngakl planuje grać we inwestować środki jest sporym udogodnieniem we znacznie zwiększa szansę na sukces. Warto samodzielnie zastanowić się nad sensem i actually korzyściami z zabawy w towarzystwie tego typu udogodnień. Dla wielu osób promocje są najważniejszym elementem codziennej zabawy t towarzystwie automatów perform gry. Nasi eksperci wiedzą o tym doskonałej, dlatego przygotowali dla czytelników zestawienie promocji Verde casino code oraz zestawienie najważniejszych informacji, jak poprawnie grać z tego typu bonusem.

Na Jakie Rodzaje Promocji Mogą Liczyć Gracze W Verde Casino?

Żeby móc wypłacić pieniądze, użytkownik kasyna musi najpierw zweryfikować swoje konto i w pełni uzupełnić swoje dane osobowe. Warto tutaj zaznaczyć, że zgodnie unces polityką KYC, wszystkie podawane informacje powinny być właściwe. Przy wypłacaniu pieniędzy Verde Casino online może poprosić o weryfikację tożsamości i t przypadku wystąpienia braku zgodności mogą wystąpić niepotrzebne opóźnienia.

Przedrostek „https” oraz ikona kłódki watts przeglądarce oznaczają, że strona internetowa jest aktualnie objęta 128-bitowym szyfrowaniem SSL. To zabezpieczenie zapewnia, że żadna osoba z zewnątrz nie może podejrzeć — co dany użytkownik kasyna robi oraz jakie są jego dane. Żeby zakwalifikować się do zwrotów, należy mieć przynajmniej drugi status konta i osiągnąć potencjalny dodatek na poziomie 70 zł.

Najlepsze Kasyna On-line Dla Polski

Ale mogą to być oferty różnego rodzaju — premie od wpłaty, bonusy bez depozytu, darmowe spiny i inne atrakcje. Dlatego też zanim zaczniesz korzystać z danego bonusu, dokładnie zapoznaj się z jego zasadami i warunkami.” “[newline]Kasyno Verde oferuje du?o różnych bonusów, takich jak bonusy bez depozytu, darmowe annoying, bonusy za rejestrację konta i wiele innych. Dzięki nim możesz zwiększyć swoje szanse na wygraną i cieszyć się jeszcze większą rozrywką. Aktywacja kodu promocyjnego Verde Casino daje ci dostęp carry out bonusów, takich jak darmowe spiny, bezdepozytowy bonus, czy nawet dodatkowe środki na Twoje konto. To świetna okazja, aby zwiększyć swoje szanse na wygraną i actually cieszyć się jeszcze większą rozrywką. Aby skorzystać z bonusu powitalnego w Licencioso Casino, gracze muszą wpisać odpowiedni kod promocyjny przy rejestracji konta.

Zanim zaczniesz grać t naszym kasynie, wykorzystując pakiet korzyści otrzymany od nas t ramach aktywowanej poprzez kod bonusowy promocji, powinieneś zrobić jeszcze jedną, bardzo ważną rzecz. Na całe szczęście nie będziesz musiał nigdzie ich szukać, jako że Verde Casino publikuje wszystkie niezbędne dokumenty na swojej stronie internetowej. Szukasz ciekawej promocji, która pozwoli Ci grać watts kasynie bez dużej inwestycji i znacznie zwiększy Twoje szanse na wygrywanie?

Verde Casino Bonus I Inne Promocje W Ofercie Naszego Kasyna!

Po wpisaniu Verde On line casino kodu promocyjnego, gracze otrzymują spiny automatycznie. Jest to doskonała okazja do zapoznania się z różnorodnością gier oferowanych poprzez kasyno Verde bez konieczności dokonywania wpłaty. Verde Casino zaprasza graczy do skorzystania z atrakcyjnych promocji.

Rejestracja konta w Verde Online casino jest bardzo prosta, więc zacznij już dziś i dołącz do ekscytującej rozrywki hazardowej online. Kasyno Verde oferuje atrakcyjne bonusy bez depozytu dla nowych graczy, dające im szansę na wygraną prawdziwych pieniędzy bez konieczności dokonywania wpłaty. To idealna okazja, aby wypróbować różne gry i zapoznać się z ofertą kasyna.

Czy Verde Online Casino Oferuje Bonusy Powitalne Dla Nowych Graczy? Jeśli Tak, To Be Able To Jak Je Otrzymać?

Różnica jest dość znacząca, przez corp można wywnioskować, że bonus na Guide of Sirens jest łatwiejszy w użyciu, ponieważ szybciej można go wypłacić. Śmiało można więc pokusić się o stwierdzenie, że nasza chollo bonusów i promocji jest kompletna, bo znajdują się watts niej najpopularniejsze dziś rodzaje bonusów. Jak jednak dokładnie prezentuje się aktualna lista bonusów w Licencioso Casino? Zapoznanie się z tymi regułami z pewnością ułatwi nie tylko korzystanie z oferty na kod promocyjny Obsceno Casino, ale także zminimalizuje prawdopodobieństwo wystąpienia przykrych konsekwencji złamania regulaminu.

Po aktywacji bonusu, jeśli wymaga on wpłaty, wystarczy uiścić odpowiednio wysoki depozyt, aby cieszyć się korzyściami. Od drugiego statusu — „Leprechaun”, nasi gracze mają możliwość wymiany punktów na gotówkę i otrzymują dostęp do cotygodniowego bonusu” “refill i cashbacku oraz bonusu urodzinowego. Awans na kolejne statusy zapewnia graczom coraz atrakcyjniejsze wartości dla ww.

Silny Bonus 150% + 70 Fajnych Darmowych Spinów Na Górze

Lista dostępnych metod płatności w Verde Kasyno została stworzona z . myślą o każdym typie gracza — dosłownie. Dla stałych bywalców oferta promocyjna jest równie hojna, bo dostępny jest w VerdeCasino bonus reload oraz added bonus cashback, gdzie gracze mogą co tydzień uzyskać zwrot utraconych środków do maksymalnie 8000 zł. Doświadczonym graczom z pewnością przypadnie do gustu nasz program lojalnościowy.

Niektóre są dostępne przez cały czas, zaś inne są ekskluzywne i trzeba śpieszyć się z . ich aktywacją. Podobnie jak bonus refill, cashback również jest bezpośrednio powiązany unces programem lojalnościowym — im wyższy poziom, tym wyższy % zwrotu. Rośnie także minimalny depozyt, który uprawnia do odebrania takiego bonusu. To oznacza, że im gracz posiada wyższy status, tym jego bonus reload będzie po prostu wyższy.

Jaka Jest Różnica Między Bonusem Bez Depozytu The Z Depozytem?

Opracowaliśmy proceed tak, żeby miał on bardzo proste zasady, ale jednocześnie zapewniał także wyj?tkowo atrakcyjne dla graczy korzyści. Żeby móc wypłacić pieniądze, należy zalogować się em konto w kasynie, przejść do sekcji płatności i kliknąć zakładkę wypłata. Warto zaznaczyć, że transakcje tego typu są dostępne wyłącznie dla zweryfikowanych użytkowników, którzy uzupełnili wszystkie dane swojego konta.

Po prostu mamy możliwość opracowywania ekskluzywnych ofert dla tego kasyna i z tej opcji nieustannie korzystamy. W efekcie korzyści są obopólne — our zyskujemy reputację veoma skuteczny partner biznesowy, a gracze dostają niesamowite bonusy dla Verde Casino. W ofercie Verde Online casino wyróżnia się także inne rozwiązanie — jest nim program lojalnościowy.

Kasyno Verde Proponuje Bonusy Bez Depozytu?

Z dalszej części artykułu poznasz bliżej bonus za rejestracje Verde Casino, a konkretniej dwie jego najważniejsze odmiany. Większość graczy preferuje jednak tę drugą opcję i in order to właśnie na niej się zamierzamy skupić nieco bardziej. Verde Casino bonus bez depozytu 100 zł to świetna opcja dla niezdecydowanych, którzy lubią próbować różnych gier. Wysokiej jakości symbole i często występujące darmowe rundy to dwie najważniejsze cechy tej maszyny od producenta Spinomenal. Automat posiada wygodny układ 3 rzędów” “i actually 5 bębnów oraz 10 linii wypłat.

Mogą pojawiać się w kilku różnych formach i pozwalają na odbieranie promocji o dowolnej formie, dając operatorowi ogromną swobodę. Zdecydowaliśmy się wykorzystać możliwości takiej promocji i stworzyliśmy specjalne oferty em Verde Casino kody promocyjne, które umożliwiają odebranie nawet 100 zł lub 55 darmowych spinów em start. Z naszych obserwacji wynika, że bonus od czwartego” “depozytu w kasynie on-line jest raczej stonowany. Tym bardziej zaskakujące jest, że Licencioso Casino oferuje przyzwoity bonus 150%, dzięki któremu można zabezpieczyć do 300 pound w środkach bonusowych. A jakby tego było mało, jest też 70 darmowych spinów na “Book of Fallen”.

Kody Promocyjne Na 55 Darmowych Spinów Albo 25 Euro Bez Depozytu

W tym przypadku mamy do czynienia se szczególnie atrakcyjną ofertą, ponieważ zdecydowaliśmy się zastosować potencjalnie jedne z najprzystępniejszych warunków użytkowania. Dzięki temu dodatek w postaci 50 darmowych spinów lub 100 zł staje się jeszcze bardziej atrakcyjny. Jednak Verde Casino keineswegs reklamuje już tej oferty na swojej stronie internetowej. Dlatego najlepiej jest wcześniej skontaktować się z . obsługą czatu mhh żywo, aby dowiedzieć się, czy kod promocyjny Verde Casino nadal istnieje.

Promocje na kod można szukać osobiście lub wygodnie na naszej stronie. Nasi eksperci gromadzą informacje o bonusach różnego typu, w tym o ofertach unces dedykowanym kodem. Najpopularniejszy u nas w VerdeCasino bonus przeznaczony jest dla osób, które jeszcze nigdy wcześniej nie korzystały z naszej oferty i nie mają u nas konta. Jest to po prostu oferta powitalna, która nosi nazwę „Powitalny Pakiet Bonusowy”. Większość z dostępnych w Verde On line casino gier jest dostępna całkowicie za darmo. Co bardzo istotne — Verde Online casino logowanie nie jest do tego wymagane.

Odbierz 100 Zł We Sprawdź Możliwości Licencioso Casino

Nie dziwi zatem fakt, że bonusy za rejestrację, które nie wymagają wpłaty, są dziś niezwykle „chodliwe” i actually bardzo poszukiwane poprzez graczy. Doskonale zdajemy sobie z tego sprawę, dlatego watts Verde Casino added bonus bez depozytu jest kluczowym elementem naszej oferty promocyjnej i actually mogą z niego skorzystać nasi nowi gracze. Na przykład klikając dostępne na naszej stronie przycisk „Get a promotional code” lub „Uzyskaj kod promocyjny” możesz odebrać od nas albo 50 darmowych spinów, albo a hundred PLN bez depozytu właśnie dla tego kasyna! Szczegółowe informacje na temat obu bonusów znajdziesz watts kolejnym punkcie. Verde Casino oferuje reward bez depozytu dla nowych graczy watts postaci darmowych spinów.

Niestety, kasyno to nie proponuje obecnie żadnych dziennych ani tygodniowych bonusów reload dla lojalnych stałych klientów, corp naszym zdaniem jest sporą szkodą. Przynajmniej istnieje bonus startowy w wysokości 25 euro dla wszystkich nowych klientów, nawet bez wcześniejszego depozytu. Pamiętaj, że szczegółowe informacje i warunki każdej promocji znajdziesz na naszej stronie.

Aktywacja Kodu Bonusowego Verde Casino

Ogólnie rzecz biorąc kody bonusowe in order to specjalne rozwiązania wykorzystywane przez różne kasyna online, które służą do aktywowania przypisanych do nich promocji. Gracz może uzyskać taki kod z . dowolnego źródła (tym zagadnieniem zajmiemy się nieco później). Ma on postać ciągu znaków — najcz??ciej liter i cyfr, często jest in order to po prostu konkretny, łatwy do zapamiętania wyraz. Frazę taką należy następnie wpisać w określonym miejscu w witrynie kasyna.

Dlatego watts Online Verde Online casino można znaleźć całą masę regularnych turniejów — od jednodniowych, przez tygodniowe, po miesięczne. Rotacja turniejów jest bardzo duża, a nasz zespół prześciga się w wymyślaniu coraz to be able to nowszych motywów przewodnich. W ostatnim czasie sporym zainteresowaniem cieszą się gry błyskawicznie, dlatego postanowiliśmy t nie zainwestować. Nie brakuje również habgier specjalnych takich jak bingo, keno, koła fortuny czy zdrapki online.

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