Verde Casino Romania Online Login Păreri, Jocuri, Review

Verde Casino Evaluation Bonus De Bun Venit 4800 Ron + 220 Fs

Produs de EGT, jocul a reușit să cucerească jucătorii prin simboluri precum fructe, șeptari, conceder și prin simbolurile speciale Scatter și Wild. Multe cazinouri oferă rotiri fără depunere la Shining Crown, dată fiind popularitatea lui. Dacă nu știi los angeles ce cazino să mai joci și ce bonusuri no avem disponibile pentru tine, te încurajăm să încerci Champion 120 rotiri sans frais.

Las Vegas Casino oferă two hundred de rotiri gratuite fără depunere pentru jocul Gates associated with Olympus, cu u miză de 0. 2 RON for each rotire. Pentru the beneficia de această ofertă, trebuie doar să încarci um copie an unui act de identitate în secțiunea „Profilul meu”, la cronaca „Verificare Cont”. Spre deosebire de multe cazinouri internaționale cu bonus fără depunere, cele din România au o abordare foarte inventivă una capitolul oferte de” “bun venit. Întâlnim different condiții de acordare a rotirilor fără depunere, cum fladem?l fi acordarea lor în anumite intervale orare sau eșalonarea pe mai multe zile. De asemnea, vedem campanii create în jurul unui mini-joc care determină aleatoriu ce jocuri fără depunere ajai norocul să încerci. Dacă ești enthusiast al sportului, în general, și îți dorești să generezi profituri din cunoștințele tale, un added bonus fără depunere exista perfect pentru tine.

Ce Se Întâmplă În Cazul În Attention Câștig Un Goldmine Cu Un Bonus Fără Depunere?

Free wager sunt cel mai comun cod bonus fără depunere oferit de site-urile de pariuri online. Noi am adunat cele mai profitabile bonus pariuri fără depunere într-o listă separată, pentru a-ți lessen timpul de căutare. Selectează oferta attention îți permite să pariezi pe sportul dorit, cu cota minimă/ maximă preferată și produ câștigurile pe care votre meriți. Winmasters oferă 10 rotiri gratuite pentru jocul Place of Madness tuturor utilizatorilor care își verifică contul. Pentru a beneficia de această ofertă, înregistrează-te și inserează codul bonus fără depunere ‘TOME-FREE’ pentru a revendica cele ten rotiri gratuite romania-verde-casino.com.

Fiecare cazino online fără depunere are anumite termene și condiții sobre joc esențiale. În trecut, multe site-uri casino cu added bonus fără depunere nu se bucurau sobre foarte mult succes pentru că lansau oferte cu cerințe foarte greu” “de înțeles. La timpul actuală, secțiunea sobre informații an oricărui bonus fără depunere 2024 este mult mai ușor sobre parcurs.

Bonus De Bun Venit

Rotirile gratuite sunt incluse în pachetele para bun venit și sunt activate odată ce jucătorul depune bani în cont. Rotirile gratuite sunt valabile în anumite jocuri evidențiate” “de cazinou. Al doilea și al treilea bonus de depunere oferă jucătorului fifty de rotiri sans frais fiecare, în vreme ce al patrulea îi oferă jucătorului 70 de rotiri gratuite. Bonusurile fără depunere poker tind să aibă un termen de valabilitate mai scurt decât restul ofertelor, din cauza faptului că acestea oferă bani gratis pentru intrarea în turnee.

Așadar, indiferent de bugetul disponibil, poți găsi o variantă potrivită pentru tine. În continuare îți vom prezenta și cât plătește fiecare simbol de pe ecranul de joc, de la fructe, la clopoței și șeptari. Bonusul fără depunere oferit de Conti Casino este o oportunitate” “excelentă pentru jucătorii noi să se bucure de jocurile sobre cazino fără a fi necesar să depună bani.

Jocuri Fără Depunere

Verde On line casino include o secţiune vastă de jocuri de noroc, iar datorită platformei intuitive vă va fi foarte uşor să găsiţi titlurile preferate. De asemenea, dat fiind faptul că jocurile au fost realizate de companii renumite, acestea au fost testate de agenţii independente. Acest lucru înseamnă că puteţi fi siguri că de fiecare dată când accesaţi unul dintre jocurile de pe site-ul Verde Casino acesta va fi 100% corect. În ciuda acestor aspecte, merita vizitat datorită experienței de joc captivante, serviciului de asistență eficient și diversității ofertei de jocuri.

În plus, membrii primesc rotiri gratuite nelimitate timp de 5 minute la jocul Big Bass Bienestar pentru o depunere de minimum 100 lei. Membrii noi beneficiază de Champion bonus fără depunere care include two hundred Rotiri Gratuite. Rotirile sunt disponibile una slotul Shining Top, unul dintre cele mai îndrăgite jocuri din toate timpurile. Bonusul poate fi activat după verificarea identității și va fi atribuit automat în contul de jucător. Acest added bonus fără verificare Wonder Jackpot este disponibil la slotul Shining Crown.

Bonusuri Verde Casino: Rotiri Gratuite Si Și Alte Oferte” “bonus

Doar mizele mai mici de 20 RON vor fi luate în calcul la îndeplinirea cerințelor de rulaj. Suma maximă votre poate fi câștigată și retrasă din aceste rotiri este de 100 RON. Pentru a retrage câștigurile rezultate din folosirea bonusului fără depunere, este necesară realizarea unei depuneri. Luck Casino oferă 77 de rotiri gratuite pentru jocul Shining Crown Clover Chance, disponibile pentru toți noii membri care își verifică contul. Pentru a new beneficia de această ofertă, trebuie să introduci detaliile tale folosind înregistrarea rapidă și să îți activezi contul în câteva momente. Fortuna acordă 300 rotiri gratuite fără depunere imediat după verificarea contului.

Ne-am propus să nenni răsplătim membrii activi pentru fiecare RON pariat pe platforma noastră, așa că, aceștia primesc la Verde Casino reward fără depunere sub forma unei bonificații cashback. În funcție de statusul tău în cadrul Programului nostru de Loialitate, vei primi între 3% și 12% din sumele pierdute la jocurile de noroc de rapid ejaculationature climax, site-ul nostru. Îți vei primi banii din acest reward în fiecare zi de luni a săptămânii următoare. Bine ai venit pe platforma de on line casino unde verde înseamnă noroc, optimism, voie bună, distracție și câștiguri!

Pot Juca Juicy Fruit Multihold Gratis?

Suntem los angeles dispoziție membrilor cazinoului nostru la orice ora, 24/7, prin intermediul chat-ului live și an asistenței prin email. De asemenea, cei attention doresc să între în contact cu operatorii noștri sobre casino au los angeles dispoziție un număr de telefon dedicat. În acest moment, dacă vrei să discuți cu noi, îți oferim suport via live conversation în limbile engleză, germană, poloneză, spaniolă, rusă și japoneză. În plus, atunci când joci los angeles acest cazino online din browserul smartphone-ului sau al tabletei vei avea part de aceeași selecție extinsă de jocuri de casino, precum dispui în varianta desktop.

Procesul de verificare a contului de jucător este unul foarte important. ONJN spune că bonusul para bun venit just nu poate fi mai mare de 800 RON, dacă nu ai contul verificat. Multe cazinouri online aleg să ofere bonus fără depunere la verificarea contului de jucător. Este nevoie doar de o poză cu buletinul și u factură, iar in nessun caso apoi poți câștiga bani gratis la jocuri pentru mobil și PC una casino. Cazinourile sunt obligate prin lege să îți ceară aceste documente, pentru a putea dovedi faptul că aje vârsta legală para joc. Îți recomandăm să calculezi sumele de care poți profita la bonusuri casino, pentru a ști exact dacă o promoție îți oferă avantajele cele mai mari.

Verde Casino Login – Ejaculate Să Începi Să Joci?

Înainte da începe să jucați sute de jocuri para noroc interesante, faceți clic pe butonul „Autentificare”, care se află lângă butonul verde de înregistrare. Utilizați adresa de e-mail pe” “attention ați folosit-o los angeles înregistrare, introduceți parola și faceți clic pe Conectare. Astfel, te vei conecta la contul private al jucătorului premature ejaculation rapid ejaculation, rapid climax, premature climax, platforma Verde casino login. Pentru the o descărca, e necesar să mergeți la secțiunea dedicată de pe site și să urmați link-ul. Poți cere suportului pentru clienți linkul de descărcare sau îl poți căuta pe rețelele sociale ale cazinoului.

Pentru a revendica cele 50 de rotiri gratuite, trebuie să se finalizeze procesul de înregistrare și să se creeze un cont nou la Verde Casino. Procesul de înregistrare este de obicei simplu, implicând prezentarea detaliilor personale și acceptarea termenilor și condițiilor cazinoului. RTP-ul slotului este sobre 96, 04%, deci Juicy Fruits Multihold demo poate fi încadrat în categoria de” “păcănele destul de profitabile. Trebuie să ții cont și sobre volatilitatea sa, treatment este ridicată, deci va trebui să aștepți destul de mult până vor apărea combinațiile câștigătoare pe ecran. Tocmai d aceea, versiunea demo a jocului este perfectă deoarece nu riști să pierzi bani reali din contul tău. Mai mult, te ajută să îți formezi o system de joc, treatment îți poate fi utilă când vei juca pe credite reale.

Jocuri Para Masă

Promoția fără depunere poate fi extrem de” “utilă utilizatorilor noi, care nu vor încă să facă u investiție și vor să încerce diversidade variată de sloturi create de Studio8. Betano oferă, sobre asemenea, jocuri fără depunere constând în 800 de rotiri gratuite la slotul Rise of Ra Clover Chance. Creează-ți un cont para jucător și profită de un reward fără depunere Betano chiar acum! De asemenea, membrii înregistrați pot profita de cele mai avantajoase promoții exclusive doar pentru utilizatorii existenți. Majoritatea promoțiilor propun cerințe de rulaj între 20 – 50 de ori suma câștigată. La polul opus, ze află ofertele attention au eliminat complet factorul de rulaj, iar jucătorii weed retrage întreaga sumă câștigată.

Un bonus fără depunere este cea in nessun caso populară promoție a cazinourilor online din România. La înregistrarean unui cont nou, membrii noi primesc credit gratuit una un anumit joc, fără a fi necesară depunerea unor fonduri proprii. Un bonus cu depunere este destinat jucătorilor mai implicați, care nu se tem să mizeze și să-și asume algun risc. Pentru a great activa un bonus de acest tip, înregistrează-te și realizează depunerea minimă necesară.

Maxbet Bonus Fără Depunere

De obicei, codul added bonus fără depunere este valabil pentru jocurile foarte cunoscute, ejaculate sunt Shining Overhead și Gates regarding Olympus. Ai putea să consideri că o ofertă de 250% este in nessun caso avatajoasă decât la de 100%, însă această afirmație el discutabilă. În funcție de așteptările și de bugetul fiecăruia, s-ar putea ca lucrurile să just nu stea exact așa cum ai fi crezut. După aceea, aveți nevoie doar de doi pași pentru” “a good obține un cont și a începe să jucați rapid ejaculationature climax, bani reali.

Tot ce aje de făcut exista să construiești algun bilet conform expertizei tale și să urmărești îndeaproape evenimentele pe care aje pariat. Pe site-ul nostru vei găsi bonusuri pariuri fără depunere de una brandurile de best din țară. Cu aceste free bet-uri îți poți construi cel mai ambițios bilet de până acum pentru că nu ai nimic de pierdut. Cazinourile oferă aceste bonusuri pentru an atrage jucătorii să sony ericsson înregistreze pe site-ul lor, în detrimentul competitorilor. Nu exista necesară nicio plată pentru a revendica acest bonus, însă va trebui să deschizi un cont folosind informațiile privato, precum adresa și numărul de telefon. Acest cazino el unul dintre cele mai iubite și apreciate în rândul pariorilor.

Înscrieți-vă Și Obțineți 50 Sobre Rotiri Gratuite Fără Depunere:

Astfel, cazinourile îți oferă o sumă para bani după votre te-ai înregistrat și ți-ai confirmat identitatea.” “[newline]Partea și mai frumoasă este că după consumarea acestui added bonus casino online fără depunere te poți bucura în continuare de un reward de bun venit pentru prima depunere! Rotirile gratuite sau “free spins” sunt indispensabile unui bonus casino fără depunere. Aceste sunt formate din runde added bonus care combină aspectele fundamentale ale lumii cazinourilor, distracția și câștigurile. Rotirile vin cu o valoarea prestabilită și ze supun unor condiții de rulaj premature ejaculation rapid ejaculation, rapid climax, premature climax, care trebuie să le îndeplinești pentru a retrage profitul. Prin intermediul acestui tip de reward poți să lo joci la păcănelele tale preferate sau să încerci ceva nou, în funcție de oferta pusă la dispoziție. Pe site-ul nostru găsești o varietate para oferte cu rotiri gratuite fără depunere, alege-o pe cea potrivită stilului tău de joc.

Se remarcă prin” “faptul că au păstrat un factor sobre rulaj extrem para mic, de numai 10x. Verifici contul, te joci, rulezi și câștigi, totul în intervalul de valabilitate de a few zile. Pentru că ne oferă șansa să câștigăm bani reali fără a face o depunere inițială, aceste bonusuri pot fi incredibil de atrăgătoare. Ca orice altă ofertă, bonusurile fără depunere vin cu propriul set de avantaje și dezavantaje.

Ce Bonusuri Oferă Această Platformă De Jocuri?

La Pokerstars primești 50 rotiri gratuite la verificarea contului, valabile los angeles sloturile Stars Intruders Classic și Diamond Stars Classic. Dacă ai vrut să încerci sloturi noi și unice, aceasta este ocazia perfectă! Folosește rotirile gratuite pentru a încerca sloturile valabile, cu ocazia de the și genera câștiguri. Rotirile vor fi automat acreditate în contul tău după 30 de second entre ma verificarea contului.

Experiența noastră în timpul testării an indicat un răspuns quick din partea suportului pentru clienți, ceea ce sugerează o abordare promptă în tratarea bonusurilor. Termenii și condițiile sunt ușor accesibili premature ejaculation rapid ejaculation, rapid climax, premature climax, site-ul oficial, asigurând transparență. Verde Casino România oferă u varietate de bonusuri, făcându-l o destinație atrăgătoare pentru jucătorii în căutare de valoare suplimentară.

🎰 Joc Responsabil La Verde Casino

Acest slot machine dezvoltat de Matter-of-fact Play este recunoscut pentru simbolurile selling colorate, care just nu îți dau voie să te plictisești. În acest moment bonus fără depunere Conti Cazino îți aduce 151 rotiri gratis, dar cel mai bine el să verific periodic deoarece și acest cazino își schimbă periodic bonus fără depunere Conti. Site-ul a devenit fast unul dintre cele mai populare pentru mine datorită prezenței unui program” “de fidelizare. Utilizatorii noi primesc un pachet de bun venit care include a couple of bonusuri fără depunere simultan. Versiunea mobilă a site-ului funcționează stabil, ceea votre va fi și un plus pentru un public great.

Pentru a beneficia para Bonusul pentru validarea datelor, trebuie să încarci o copie an actului de identitate pe platforma de joc. Rotirile gratuite din această ofertă pot fi jucate pe jocurile Plenty of Fruit 20, Lord of the Ocean, Double Spinner, Scorching hot Deluxe și Burning Wild. Casa Pariurilor the lansat un added bonus casino fără depunere unic și creativ, conceput special pentru a te încuraja să revii la ei cât mai des. Membrii noi care completează cu succes verificarea contului,” “primesc 300 rotiri gratuite fără depunere los angeles Shining Crown.

Păcănele Populare

Poate că cele mai populare și populare jocuri Obsceno casino jocuri sobre pe platforma sunt diversele sloturi movie. Aici, utilizatorii ze pot juca atât pe bani reali, cât și ze pot antrena uindskr?nket gratuit datorită prezenței unui mod demo special. Poți primi maxim 8000 Ron înapoi pe săptămână, bonusul trebuind să fie rulat para 5x înainte de a-l încasa (termenul maxim de rulaj este de five zile).

Dacă just nu ar exista condiții de rulaj, fiecare jucător ar putea să retragă bani gratis. Pentru că nu reprezintă u opțiune de îmbogățire peste noapte, scopul unui bonus en ligne fără depunere este de an atrage clienți noi. Multe cazinouri cu reward fără depunere acordă astfel de oferte inclusiv clienților existenți. Suma fixă îți arată care exista maximul pe attention cazinoul ți-l poate dubla. În situatie acestui bonus, suma maximă la care poți ajunge el de 2400 Lei, în urma unui depozit de twelve hundred Lei.

Player Bonus Fără Depunere

Totodată, oferă cazinoului oportunitatea de a te fideliza ca și client pe termen chest și, implicit, de a-ți oferi bonusuri cu depunere. În cazul în attention vrei să revendici un astfel para bonus fără depunere cu roriri fără depunere fără să treci de validare, acest lucru exista posibil. Pentru a revendica anumite oferte, nu este nevoie de procesul para validare. Este suficient să îți creezi contul de jucător și poți profita de bonus.

Este o oportunitate fără riscuri para an explora jocurile cazinoului și para a câștiga potențial bani reali fără a face un depozit inițial. Asigură-te că ți-ai verificat complet contul trimițând documentele necesare, cum ar fi buletinul, pentru a respecta politicile de retragere ale cazinoului. Odată ce începi să joci, urmărește-ți progresul pentru a îndeplini cerințele de rulaj. Cu atât de multe opțiuni, momentul potrivit pentru the câștiga bani reali este foarte aproape.

Bonus Fără Depunere Conti Cazino

Cele două oferte se adresează unor nevoi și preferințe diferite și din acest beweggrund diferențele dintre ele sunt foarte mari. Jocurile de masă sunt furnizate de dezvoltatori de software program de top, sperm ar fi Matter-of-fact Play, Spinomenal și NetEnt. Retragerile weed fi efectuate în același mod florida și atunci când a fost deschis contul. Verde Online casino face retrageri premature ejaculation rapid ejaculation, rapid climax, premature climax, baza principiului „primul venit, primul servit”.

Este sobre remarcat faptul că un utilizator nou va avea una dispoziție doar four zile pentru a good activa această ofertă din momentul înregistrării. Înainte de a new primi acest added bonus, citiți cu atenție regulile și cerințele pentru pariuri suplimentare. Când procesul Licencioso casino register pe site-ul este finalizat cu succes, noul cont de utilizator va deveni activ și veți putea folosi toată funcționalitatea extinsă a platformei moderne de jocuri Verdecasino. În cazul în care jucătorul acceptă termenii programului de bonus și își confirmă participarea, acesta este obligat să încaseze bonusul într-o anumită perioadă de timp.

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