Alle Aktuell Boni Ebenso Promo Codes

Vulkan Vegas Promo Code über Freispielen Und Bonusguthaben!

Content

Neue Vulkan Vegas Promotionen, die erscheinen, sind immer wieder immer nicht versteckt und scrollen letztens bei dem Hauptbildschirm, thus dass dieser Zocker sich für sie anmelden muss. Stellen Sie dementsprechend treu, dass sie einander vor dieser Einzahlung mit den Bonusbedingungen im Detail beschäftigt haben und information, welche Zahlungsmethoden einander nicht qualifizieren. Auf der Seite dieses Anbieters angekommen, müssen Sie einfach wirklich auf den “Registrieren” Button klicken, to den Registrierungs Keep an eye on zu öffnen. Sobald sich die Eingabemaske geöffnet hat, geben Sie dort allesamt wichtigen Informationen bei welche art Vor- und Zuname, Anschrift, E-Mail-Adresse, Handynummer, Geburtsdatum ein. Es gilt also, immer absolut hinzusehen, damit man nichts übersieht.

Daher können die aktivsten Nutzer durchaus über keine einzahlung rechnen. Sie sollten jedoch immer bedenken, dass Boni ohne Einzahlung in der Regel nicht so tillokkende sind wie Aufstockungsboni. Daher ist sera in manchen Fällen besser, das Konto einzuzahlen, damit move away Prämien höher ausfallen.

Erhalten Bis Zu €/$1, 500 + A Hundred And Fifty Freispiele

Die genauen Umsatzanforderungen für jeden Bonus finden Sie in unseren Vulkan Las vegas Bonusbedingungen. Bekannt für sein Sportwettenangebot within Deutschland, überzeugt fue nun auch mit seinem umfangreichen Casino-Angebot. Mit dem Anbieter können Sie wirklich nur das Beste vom Besten erwarten. Sehen Sie einander an, wie Sie mit dem Megapari Gutscheincode einen Willkommensbonus erhalten können https://vulkan-vegas-login.com.

Bei Vulkan Vegas ist natürlich es unser oberstes Ziel, dass unsere Spieler zu alle Zeit eine großartige Erfahrung hat. Daher arbeitet unser Group ständig daran, schnelle und aufregende Bonusangebote zu entwickeln. Im Jahr 2024 sein wir einige welcher besten Boni anbieten, die Vulkan Vegas je gesehen hat. Da stellt einander häufig die Frage, ob es reicht, nur bei einem Anbieter zu spielen. Diesen Bonus Computer code können Sie sofort bei erfolgreicher Registrierung und ersten Einzahlung eingeben und besitzen dann den Vorteil, von einem fantastischen Bonus Angebot zu profitieren. Leider offeriert Vulkan Vegas living room Spielern nicht pass away Möglichkeit, Sportwetten über platzieren.

Top 3 Alternativen über Vulkan Vegas

Aber pass away mobile Version jeder Webseite bringt genauso viel Spass ebenso Unterhaltung, wie wie haetten Sie noch eine App zur Verfügung. Auch die zweite Einzahlung ab 12-15 Euro wird durch einem 125% Added bonus bis zu 400 Euro plus fifty Freispiele bei Disaster of the Dead belohnt. Wenn Sie mehr als 50 Euro einzahlen, dann wartet auf Sie ein 200% Benefit bis zu” “700 Euro sowie 100 Freispiele bei Flames Joker. Auf welcher Seite des Anbieters angekommen, müssen Sie einfach nur auf den “Registrieren” Press button klicken, um living area Registrierungs Bildschirm zu öffnen. Sobald einander die Eingabemaske geöffnet hat, geben Sie dort alle vertrauenswürdigen Informationen wie Vor- und Zuname, Anschrift, E-Mail-Adresse, Handynummer, Geburtsdatum ein.

In unregelmäßigen Abständen kann es jedoch vorkommen, dass Vulkan Vegas einen exklusiven Livecasino-Bonus zur Verfügung stellt oder entsprechende Turniere veranstaltet. Bei den meisten Bonusangeboten in Online Casinos erhalten die Spieler die Preise nie und nimmer direkt als Cash, sondern in Contact form von Bonusguthaben. Dieses Guthaben unterliegt sogenannten Umsatzanforderungen, die erzielt werden müssen, bevor Spieler das Bonusguthaben in Echtgeld umwandeln können.

Weltklasse-fußballerin Wirbt Für Illegales Online

Wer zum ersten Mal dieses Konto bei unserem Internet casino eröffnet, koennte sich die tolle Summe snabbt zu dem Start auf sein Konto zahlen lassen. Falls Sie dachten, dass jeder Vulkan Vegas Added added bonus bereits in welcher Vergangenheit eine passende Sache” “war, danach machen Sie sich auf sehr gefasst. Im nächsten Jahr stehen Ihnen nämlich einige unglaubliche Vulkanvegas Bonus Angebote inches Haus. Lesen Sie weiter, o schon jetzt den Vorgeschmack zu bekommen, has been Sie im Jahr 2024 bei uns erwartet.

Dieser Mehrwert, der sich in family room Vulkan Vegas Promo Codes versteckt, werden zu einem mächtigen Instrument in living room space Händen der Zocker. Einmal freigesetzt, koennte er direkt junge einer Vielzahl vonseiten Spielen eingelöst sowie in echtes Cash verwandelt werden. Tauche ein in pass on aufregende Welt vonseiten Vulkan Vegas Bonuscode und entdecke living room Schatz an Spielspaß und Belohnungen über unseren exklusiven Promo Codes. Die Einlösung des Codes ist auch auf einen nenner gebracht undramatisch ebenso erfolgt während dieses Einzahlungsvorgangs. Spieler besorgen einfach den erhaltenen Code ein, 1 die hierdurch verbundenen Vorteile zu aktivieren. Sie müssen” “living area erhaltenen Betrag likewise 5 Inconforme bei Vulkan Las las vegas einsetzen, bevor Sie eine Auszahlung dafür anfordern können.

Wie Kann Man Den Kundenservice Von Vulkan Vegas Erreichen?

Den Benefit kann man sich auszahlen lassen, wenn man die Bonusbedingungen von Vulkan Las vegas komplett erfüllt hat. Fordern Sie perish Auszahlung schon davor an, dann verfällt Bonus und Gewinne. Es scheint, als wäre Vulkan Vegas ein Spezialist within jedem Gebiet, welches eine Online-Spielhalle überhaupt bieten kann. Hier erwarten Sie passende Boni, die Sie mit dem Vulkan Vegas Promo Signal auch noch erweitern können. Ein Bonus Signal ist eine Artwork Passwort mit deinem man einen Added bonus freischalten kann. Vulkan Vegas legt großen Wert darauf, das attraktives Bonusangebot darzubieten.

Eine Einzahlung vonseiten 10 € tätigen und ganze 70 Freispiele geschenkt haben? Grund dafür ist natürlich der spannende Vulkan Vegas Bonuscode “rionights”, welcher Ihnen die fantastische Möglichkeit bietet. Ab und über erlaubt sich Vulkan Vegas auch, offensiv auf Kunden zuzugehen, indem ein Vulkan Vegas Bonus Code mit einem Hazard per Post und eMail verschickt vermag. Natürlich gibt sera noch Partnerseiten vonseiten Vulkan Vegas, perish immer wieder mal über einem Aktionscode unter Vulkan Vegas aufwarten und so direkte Spieler anlocken. Der Willkommensbonus von Vulkan Vegas umfasst neben einem Bonusbetrag vonseiten bis zu 1000€ auf die ersten drei Einzahlungen darüber hinaus ganze 175 Freispiele. 25 Freespins für” “Guide of Dead findet man direkt für die erste Einzahlung.

Bonusguthaben Im Casino

Zu ordentlicher Letzt erhält person jeden Samstag, wenn man an diesem Tag mindestens a few Einzahlungen tätigt, einen vulkan vegas bonus in Höhe des arithmetischen Mittels jeder Einzahlungen. Neben just about all dem können diejenigen, die einen vulkan vegas aktionscode besitzen, auch von anderen vulkan vegas aktionscode profitieren. Neben almost all dem können diejenigen, die einen vulkan vegas aktionscode besitzen, auch von sonstigen vulkan vegas aktionscode profitieren. Sobald Sie die Registrierung abgeschlossen haben, müssen Sie innerhalb von four Tagen den Willkommensbonus aktivieren.

Zum Beispiel bietet expire Marke die Möglichkeit, Cashback und weitere Revenu zu erlangen. Wenn ein Zocker häufig Drehungen durchführt, muss er sein Level erhöhen. Dazu gehört die Möglichkeit, Gratiswetten und Freespins über erhalten. Es koennte notwendig sein, den gutscheincode anzugeben, o einen solchen Benefit zu” “aktivieren. Das Vulkan Vegas Casino ist das Garant für vielfältige und immer wieder üppige Bonusangebote – aktuell leider in der tat für Kunden aus Österreich.

Bonus & Angebote: Bonuscodes Vulkanvegas+icecasino Thread

Wenn Sie 50€ oder allerdings mehr einzahlen, bekommen Sie auf die zweite Einzahlung 200% bis zu 700€ und 100 Freispiele. Laut den Umsatzbedingungen müssen Sie dieses Bonusguthaben 40-fach freispielen, ansonsten verfällt der Willkommensbonus und allesamt daraus resultierenden Gewinne. Bei der Registrierung auf dieser Plattform haben neue Benutzer eine große Anzahl” “von Angeboten zur Auswahl. Der vulkan vegas Bonus für direkte Spieler ist eine gewisse der besten Promotionen, die unsereins derzeit in Online-Casinos” “finden können. Zunächst einmal werden jedem Zocker 50 Freispiele angeboten, ohne dass emergeny room eine Einzahlung tätigen muss.

Sollten Sie Den Promo Program signal während der Registrierung nicht eingegeben besitzen, können Sie ha sido später im Bonusbereich nachholen. Vulkan Vegas hat praktisch immer eine große Anzahl an interessanten Bonusangeboten zu bieten. Darunter Bonusse unter abzug von Einzahlungen wie etwa kostenloses Startguthaben oder Freispiele und natürlich auch klassische Willkommenspakete mit Bonusguthaben und Freispielen. Etwa in Form von Aktionsangeboten, zum Beispiel zu Feiertagen oder aber anlässlich größerer Sportevents oder im Rahmen des genialen Treueprogramms von Vulkan Las vegas. Sie haben jeweils 5 Tage Zeit, um diese Bedingungen zu erreichen, ansonsten werden die Excédent gelöscht. Genau wie bei den sonstigen beiden Angeboten, müssen Sie einfach wirklich ein Konto registrieren und Ihre Handynummer bestätigen.

Wie Funktioniert Der Promo Program Code Von Vulkan Vegas?

Wer regelmäßig und eventuell sogar viel spielt, kann durch das VIP-Programm noch lieber profitieren. Das können nur Sie beantworten, da wenn Sie mit nur einem Anbieter zufrieden sind, ein anderer wiederum noch gerne 1-2 Alternativen hätte. Leider bietet Vulkan Vegas lounge room Spielern nie und nimmer die Möglichkeit, Sportwetten über platzieren.” “[newline]Dies ist natürlich eine gewisse Online-Plattform, expire sich ausschließlich auf living room Casino-Bereich konzentriert. Auf der sonstigen Seite ist das Erlebnis an Spielen therefore vielfältig, dass allesamt Spieler eine Auswahl treffen kann. Ein brandaktueller Vulkan Las vegas Promo Signal 2024 kann Ihnen beispielsweise Spielguthaben oder allerdings Freispiele für das Vulkan Vegas Net casino bescheren.

Für die zweite Einzahlung folgen dann hundred Freispiele für Flames Joker oder unter der dritten Einzahlung Freispiele für. Nach weiteren Freespins muss man aber hier nicht suchen, denn nach erfolgreicher Registrierung werden neuen Spielern 50 Freispiele abgerechnet Einzahlung gewährt. Über das Glücksrad ebenso das Treueprogramm gibt es hin und erneut auch Freispiele weniger Einzahlung oder als zusätzlichen Bonus für eine Transaktion. Gewinne aus Freespins müssen bei Vulkan Las vegas grundsätzlich 15-fach umgesetzt werden. Highrollern ist Vulkan Vegas über seinem Bonusangebot sehr entgegen.

“vulkan Vegas Bonus Code 2024

Um unseren Lesern einen Überblick über dieses Online-Casino zu verschaffen, sein wir sowohl die negativen als auch die positiven Aspekte berücksichtigen. Außerdem koennte jeder Spieler, dieser einen vulkan vegas aktionscode verwendet, i am Laufe der Zeit von weiteren vulkan vegas aktionscode profitieren. Nichts könnte einfacher sein, als within diesem Online On line casino ein Bestandskunde zu werden. Alles, has been Sie dafür realisieren müssen, ist, einander als neuer Spieler zu registrieren darüber hinaus einfach Ihrer Leidenschaft zu folgen. Das bedeutet, dass Sie einfach nur regelmäßig spielen sowie sehr einzahlen, um mit Echtgeld spannende Apps zu spielen.

Ein Bonus, der immens hohe Guthaben nach sich zieht, so muss nicht zugleich bedeuten, dass man herausragend viel davon cap. Wer beispielsweise lediglich mit kleinen Einsätzen oder gelegentlich spielt, wird einen Bonusbetrag von beispielsweise 310 Euro nur relativ schwer binnen 5 Tagen 35-Mal umsetzen können. Bei Vulkan Vegas steht relativ klar der Einzahlungsbonus und das Cashback im Mittelpunkt, egal ob es sich dabei um Angebote für neue Nutzer oder Bestandskunden handelt.

Schritt Your Five: So Erhalten Sie Den Bonus Unter Vulkan Vegas

Nach der Registrierung, die rasch erledigt ist, werden unsereins mit einem Willkommensbonus belohnt. Uns cap wirklich gefreut, dass wir den Vulkan Vegas Promo Signal nicht unbedingt während der Registrierung eingeben mussten, sondern konnten es später realisieren. Weniger erfreut waren wir über pass away Umsatzbedingungen der verfügbaren Boni, die enorm kompliziert sind.

Der vulkan vegas Bonus für schnelle Spieler ist noch eine der besten Promotionen, die wir derzeit in Online-Casinos aufspüren können.” “[newline]Zunächst einmal werden man sicher Spieler 50 Freispiele angeboten, ohne dass er eine Einzahlung tätigen muss. Bei der ersten Einzahlung erhält der Zocker einen vulkan vegas bonus von bis zu 100 % des Wertes, bis zu einem Maximum von 300 Euro. Für die zweite Einzahlung erhält dieser Spieler einen Reward von 125% bis hin zu zu einem Höchstbetrag von 700 Pound. Außerdem können diejenigen, die einen Vulkan Vegas Promo Program code verwenden, von einem Willkommensbonus von sogar 200% der ersten Einzahlung profitieren.

Bietet Vulkan Vegas Ein Treueprogramm?

Wer beispielsweise einen Vulkan Las vegas Bonus Code für Bestandskunden nutzen möchte, sollte das einfach machen und die gültigen Bedingungen ausnutzen. Möglicherweise könnten Sie sich nämlich eines der spannenden Angebote entgehen lassen, wenn die Frist abläuft, ehe Sie pass away Chance genutzt besitzen. Besonders vor nahenden Events in” “Klamotten Sport (WM, NO ANO DE, Meisterschaften, Olympische Spiele, usw. ) lohnt es sich, dieses Auge auf expire aktuellen Promos über halten. Zu eben dieser Zeit sind pass away Buchmacher und On the internet Casinos erfahrungsgemäß besonders aktiv. Hier gibt es hohe Bonusbeträge, umfangreiche Cashback-Aktionen und verhältnismäßig faire Bedingungen. Wer dem Casino expire Treue hält, ist regelmäßig belohnt ebenso kann sich letztens wieder über zusätzliche Promotions freuen.

Es werden auch ein Feld für den Vulkan Vegas Code geben und Sie werden bereits ein Passwort und einen Nutzernamen festlegen können. Stimmen Sie anschließend living room AGB zu sowie fordern Sie bei Interesse auch gleich den Newsletter a good. Gerne unterbreiten unsereins Besuchern unserer Seite einen solch exklusiven Bonus. Allerdings sind diese zwei oben genannten Bonuscodes nur aktivierbar, wenn Sie den entsprechenden Backlinks auf unserer Seite folgen.”

Vulkan Vegas Kundenbetreuung

Ab und zu spendiert Vulkan Vegas den Aktionscode für Bestandskunden aber auch each E-Mail oder geradlinig über den Kundenbereich. Neben den klassischen Bonusangeboten wie family room Willkommenspaketen, kostenlosen Freispielen und Cashback-Prämien findet man mit den Promo-Codes eine weitere spannende Bonusform. Welche sich übrigens sowohl für Neulinge als ebenso erfahrene Spieler eignet! Im Prinzip beinhaltet ein Aktionscode nämlich oft viele der bereits genannten Bonusformen. Casinos wie Vulkan Vegas sind unter der Gestaltung dieser speziellen Aktionen sowie Promo-Codes meist sehr kreativ.

Im Casino Bereich wartet ein 100% bis zu 500 European Bonus, den direkte Spieler in Recht nehmen können. Lesen Sie hier, auf welche art Sie dieses Erlebnis mit dem Yonibet Bonus code erhalten. Der Willkommensbonus wurde sehr gut gewählt und erstreckt einander auf die ersten beiden Einzahlungen. Toll ist, dass guy seinen Einzahlungsbetrag frei wählen kann und je nachdem für welchen Betrag guy sich entscheidet, kann man unterschiedliche Bonusangebote erhalten. Das mächtigkeit vorwiegend dann Sinn, wenn es sich bei Ihnen 1 einen High Painting tool handelt. Sobald die Summe aller Ihrer Einzahlungen 1000€ erzielt, wird von Vulkan Vegas eine Identitätsverifizierung angefordert.

Handelt Es Sich Bei Vulkan Vegas O Einen Legalen Anbieter?

Um diese Frage über beantworten, habe ich ein Konto auf dieser Plattform eröffnet, um zu sehen, wie sie funktioniert. Gleichzeitig haben unsereiner” “das Feedback anderer Nutzer im Internet studiert, um Ihnen eine möglichst genaue Meinung zu geben. Unserer Meinung nach ist auch die Oberfläche von Vulkan Vegas ausgesprochen angenehm und leicht zu bedienen. Es ist sehr leicht zu bedienen, darüber hinaus für diejenigen, expire zum ersten Mal ein Konto bei einer solchen Website erstellen.

Setzen Sie einander mit ihnen throughout Verbindung sowie sie werden Ihnen bei der Lösung Ihrer Probleme helfen. Vulkan Vegas ist auch ein Online-Casino i am Besitz von Brivio Restricted. Auch perish zweite Einzahlung stomach Euro wird über einem 125% Extra bonus bis zu 500 Euro additionally 50 Freispiele unter Trouble of typically the Dead belohnt. Wenn Sie mehr als 40 Euro einzahlen, danach wartet bei Sie” “ein 200% Bonus bis zu 700 European sowie 100 Freispiele bei Fire Joker.

Verwenden Sie Noch Jetzt Einen Vulkan Las Vegas Promo Code!

Damit wird dieses Spielerlebnis auf noch eine gewisse neue Stufe gehoben und ermöglicht ha sido living room Spielern, ihre Lieblingsspiele mit zusätzlichen Ressourcen zu genießen. Die Aktivierung dieses besonderen Codes steht über personalisierte Aktionen, perish direkt an die Spieler zugestellt sein. Es muss einander dabei um E-Mail-Benachrichtigungen, Nachrichten internet advertising Spielerkonto oder andere Kommunikationsmittel handeln. Neben dem Willkommensbonus können Sie bei Vulkan Vegas noch andere Einzahlungsboni erhalten. Besuchen Sie einfach regelmäßig unsere Seite für Boni und Promotionen, um sich vonseiten den aktuellsten Angeboten zu überzeugen. Genau wie bei lifestyle room anderen beiden Angeboten, müssen Sie direkt nur dieses Konto registrieren ebenso Ihre Handynummer bestätigen.

Dann holen Sie sich living room Bonus Code für 50 Freispiele für Dead or Alive 2. Klicken Sie auf Du Profil, wählen Sie den Vulkan Las vegas No Deposit Bonus aus sowie schon kann dasjenige Spielen starten. Um sich das gratis Guthaben über forty Euro oder perish 80 Hot Rio Nights Free Spins zu holen, müssen die entsprechenden Vulkan Vegas No Deposit Rules eingegeben werden. Allerdings funktioniert” “drops dead ausschließlich über family room Link auf unserer Webseite. Die Spiele sind sehr belly geordnet, thus dass der Zocker leicht und schnell aufspüren kann, has already been er sucht.

Vegas Gambling Establishment Bonus Ohne Einzahlung

Der ComeOn Casino Bonus oder welcher Interwetten Casino Bonus wird erst für Einsätze im Casino benutzt, wenn dasjenige Echtgeld-Guthaben aufgebraucht ist echt. Nach dem Erhalt des Codes gilt es dann natürlich, diesen auch zu nutzen und über aktivieren! Neukunden benötigen natürlich erst inconforme ein Kundenkonto ebenso sollten sich daher im ersten Schritt zunächst beim Vulkan Vegas Casino registrieren. Bestandskunden nutzen unterdessen einfach ihre vorhandenen Kundendaten, um einander in ihr Kundenkonto einzuloggen. Alle anderen folgend beschriebenen Schritte sind dann sowohl für Neu- wie auch Bestandskunden so gut wie gleich. Besuchen Sie einfach regelmäßig die Seite für Revenu und Promotionen, um sich von living area aktuellsten Angeboten zu überzeugen.” “[newline]Die Gewinne aus den Freispielen werden wie Bonusgeld ausgezahlt, dasjenige Umsatzbedingungen von 3x unterliegt.

Mit jeder Einzahlung und jeder Drehung mit Echtgeld steigt der User” “an dieser stelle nach und je nach im Rang bei und kann sich so über sicher bessere Bonus Typen freuen. Außerdem steht über das Treueprogramm auch in regelmäßigen Abständen ein Dreh am Glücksrad zur Verfügung, wo zusätzliche lukrative Preise hoffen. Grundsätzlich können expire Bonusangebote des Online Casinos aber nie und nimmer bei den Are living Spielen genutzt werden.

Leave a Reply

Your email address will not be published. Required fields are marked *

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