Zakłady Bukmacherskie, Legalny Bukmacher Online Zakłady Bukmacherskie

Ksw Epic: Typy, Kursy I Zakłady Bukmacherskie 24 02 2024″

Na koniec opłaca się też sprawdzić, w jaki sposób gracze mogą nawiązać kontakt z biurem obsługi klienta bukmacherów. Istotnymi czynnikami będzie tutaj dostępność opcji kontaktowych, ale także szybkość reakcji na zgłoszenia. W idealnym przypadku, bukmacher proponuje czat na żywo, formularz kontaktowy, adres mailowy, jak również telefon do biura. O miano najlepszego bukmachera w Polsce rywalizuje już ponad 20 firm, które uzyskały licencję od Ministerstwa Finansów mhh przyjmowanie i udzielanie zakładów wzajemnych.

Specjalne pozwolenie można uzyskać na przyjmowanie i udzielanie zakładów wzajemnych watts punktach stacjonarnych yak również przez kanał online. Obecnie większość legalnych bukmacherów, którzy uzyskali pozwolenie koncentruje się przede wszystkim na zakładach poprzez Internet. Dzięki aplikacji Fortuna możesz również śledzić wyniki swoich zakładów w czasie rzeczywistym oraz korzystać z różnych promocji i bonusów oferowanych przez bukmachera. Pamiętaj jednak, aby grać odpowiedzialnie i nie und nimmer przekraczać swoich możliwości finansowych. Bonus powitalny wypłacany jest przy pierwszym depozycie i actually sięga nawet 1250 PLN.

Betclic

Każdego dnia nasi eksperci uważnie przyglądają się polskiemu rynkowi zakładów sportowych, żeby dostarczać Ci najbardziej rzetelne informacje em jego temat. Jeżeli interesują Cię legalne zakłady bukmacherskie on the internet, na naszej stronie znajdziesz wszystko, corp warto wiedzieć. Z zasobów serwisu Probukmacher z powodzeniem korzystać mogą zarówno początkujący, jak i doświadczeni gracze. Sprawdź, corp dla Ciebie przygotowaliśmy w zakresie legalnych polskich bukmacherów. W większości legalnych bukmacherów kod promocyjny podaje się przy rejestracji konta jako nowy gracz mostbet casino.

Podczas spełniania wymagań dotyczących dodatkowego oprocentowania w kasynie, keineswegs musisz spełniać żadnych innych warunków poza postawieniem określonej sumy zakładów. Ten nowy bukmacher zdecydował się tylko na alle bonus powitalny i actually jest” “nim właśnie zakład bez ryzyka. Cały proces zakładania konta w GO+bet jest prosty i trwa zaledwie kilka minut. U bukmachera można założyć najpierw konto tymczasowe, a po przejściu weryfikacji konto stałe. Wśród osób, które chcą obstawić coupon, pojawia się pytanie – kto może zagrać u bukmachera. To pytanie mhh pozór jest proste, bo by wziąć udział w zakładach sportowych, należy posiadać ukończone 18 bekv?m.

Goplusbet Zakłady Bukmacherskie

Ponadto, różne gry mogą mieć różne przyczyny do obrotu, co wprowadza dodatkową złożoność. Nie de uma się ukryć, że zakłady na piłkę nożną są najbardziej popularne u polskich bukmacherów. Dlatego też prawie każdy bukmacher ma mocno rozbudowaną ofertę zakładów na futbol właśnie. To jednak nie oznacza, że zakłady circumstance” “wszystkich bukmacherów wyglądają podobnie. Jest to zakład w którym sorter wybiera kilka wydarzeń jednocześnie oraz żeby wygrać, każde unces nich muszą być trafione. Na takim kuponie kursy po których gra się poszczególne mecze mnoży się wszystkie po kolei.

Sprawdź sam i actually oceń, czy zasługujemy na miano najlepszego bukmachera. W Polsce legalne zakłady bukmacherskie obstawia się za prawdziwe pieniądze, the wygrane również wypłacane są za pomocą realnej kasy. Z tego względu wskazane jest sprawdzić, jakie metody płatności dostępne są w ofertach polskich bukmacherów. Dotyczy to be able to zarówno sposobów wpłaty depozytu, jak również wypłacania wygranych na rachunek bankowy mostbet app.

Jak Legalnie Obstawiać Zakłady Bukmacherskie Online?

Aby uzyskać nagrodę pieniężną, musisz postawić kilka zakładów na kwotę stanowiącą 5-krotność nagrody. Możesz postawić na Show, wtedy współczynnik nie und nimmer mother znaczenia. Jeśli zakłady są obstawiane mhh poszczególne wydarzenia, musi to być corp najmniej just one, 4.

Wracając have out freebetu mhh begin, to po wykonaniu tych kroków – rejestracja z . kodem i weryfikacja tożsamości – otrzymasz 2800 punktów Bonanza Klub Plus. Piszę autorskie teksty, poradniki i typy bukmacherskie z ponad 10 bekv? Swoją wiedzę staram się jak najrzetelniej przekazywać początkującym typerom. Bukmacherów, którzy oferują darmowe zakłady bez depozytu wymieniliśmy t naszym tekście. Często bukmacherzy nakładają konkretne wymagania, które trzeba spełnić, zanim będziesz mógł wypłacić środki z bonusu.

Zakłady Bukmacherskie Na F1

Dla tych, którzy lubią obstawiać zakłady sportowe, dostępna też jest opcja darmowego zakładu. Jeśli aktywnie obstawiasz różne nice looking overall, to od czasu do czasu administracja klubu gier będzie oferowała ci możliwość postawienia za darmo. Zakłady na żywo Vulkan Bet to be able to zakłady na mecze w różnych dyscyplinach sportowych, które odbywają się w” “chwili gry bezpośrednio.

BETTERS jest bukmacherem online, a to oznacza, że nie znajdziesz t Polsce naszych punktów stacjonarnych. Zdecydowaliśmy się postawić w 100% na kanał on-line, czyli możliwość zawierania zakładów bukmacherskich przez Internet. Statystyki potwierdzają, że obecnie większość osób obstawia t kanale online, czy to za pomocą komputera, czy też telefonu komórkowego. Polskie zakłady bukmacherskie najwięcej kuponów przyjmują z . piłki nożnej. Polscy kibice chętnie obstawiają mecze Ekstraklasy, the także niższych lig piłkarskich z naszego kraju.

Gdzie Grać U Bukmachera Za Bonus?

Wielu bukmacherów w Polsce pozwala korzystać unces dodatkowych funkcji podczas typowania zakładów. Można obstawiać za środki własne lub bonusowe (jeżeli takie posiadasz). Co więcej, najlepsi bukmacherzy udostępniają także możliwość budowy kuponów systemowych. Typowanie jest dziś równie przejrzyste na stronach world wide web, jak również t aplikacjach bukmacherskich em telefon i tablet. Live betting – aplikacja umożliwia obstawianie zakładów na żywo, co pozwala użytkownikom na emocjonującą grę w czasie rzeczywistym. Freebet to pieniądze, które otrzymujesz od bukmachera na postawienie zakładu.

Promocje dotyczące podwyższenia wygranej czy też gry bez podatku in order to również chętnie wykorzystywane przez bukmacherów opcje, aby „zwiększyć zajecia z bukmacherskie”. Najczęściej depozyt użytkownia trafia na konto depozytowe an advantage na specjalne konto bonusowe. W każdym regulaminie bonusu wyszczególnione są zasady jego obrotu przed wypłatą na konto gracza.

Etoto Zakłady Bukmacherskie

Jak pokazuje praktyka, udane zakłady sportowe watts Vulkanbet mogą obstawiać nie tylko doświadczeni gracze, ale także początkujący. Wszak nie und nimmer chodzi tutaj um ilość postawionych środków, ale o wiedzę gracza. Oczywiście t świecie sportu nazwiska odgrywają ważną rolę, ponieważ rzadko zdarza się, aby onlooker pokonał lidera. Tak więc wszyscy zainteresowani gracze mogą grać w Vulkanbet on the internet i stawiać zakłady sportowe ze swoich telefonów lub tabletów.

Polska federacja MMA o nazwie Konfrontacje Sztuk Walki (KSW) to jedne z najbardziej profesjonalnych wydarzeń tego typu w Europie. Gale stały się niezwykle popularne dzięki udziałom Mameda Chalidowa, „Pudziana” czy Jana Błachowicza. Do dziś KSW zakłady bukmacherskie in order to jeden z najchętniej wybieranych sportów u polskich legalnych bukmacherów.

Oferta Zakładów Sportowych Go+ Bet

Najlepsze live zakłady przez Internet pozwalają jednocześnie śledzić statystyki na żywo, corp znacznie pomaga t podejmowaniu decyzji odnośnie gry. Czy t 2022 roku Robert Lewandowski w końcu otrzyma upragnioną Złotą Piłkę France Football? Konkurencja, jak corp roku, jest bardzo duża, więc wszystko jest możliwe. Online zakłady Złota Piłka to kolejna kategoria, która cieszy się sporym zainteresowaniem wśród bukmacherów i polskich graczy.

Oferta zakładów sportowych GO+bet jest bardzo rozbudowana i należy do największych w Polsce. Bukmacher GO+bet oferuje zakłady na wszystkie najpopularniejsze sporty, od najważniejszych wydarzeń, po niszowe rozgrywki. Spotkania piłkarskiej Ligi Mistrzów to be able to co najmniej kilkaset zdarzeń na jedno wydarzenie, co czyni ofertę GO+bet najbardziej rozbudowaną w Polsce. GO+bet to nowy bukmacher w Polsce, który szybko podbija krajowy rynek. Klienci korzystający z tego bukmachera mogą liczyć na najszerszą ofertę w Polsce, a najważniejsze mecze piłkarskie na świecie posiadają nawet 700 zdarzeń do typowania.

Zakłady Live – Wydarzenia Sportowe Na Żywo

Upewnij się, że jesteś w stanie sprostać tym warunkom, aby uniknąć problemów w przyszłości. Przede wszystkim warto zastanowić się, jakim graczem jesteś i ile możesz przeznaczyć em początkowy depozyt. Niewątpliwie, gdyby zakłady keineswegs przynosiły graczom dochodów, nie byłyby a single popularne. W każdą niedzielę pewien procent kwoty, którą wpłaciłeś na zakłady, jest zwracany na Twoje konto poprzez obstawianie zakładów na automatach Vulkanbet.

Zazwyczaj jest wymagany kilkukrotny obrót po kursie minimum one, eighty – two, 00. Bonusy bez depozytu to typ promocji bukmacherskiej, która polega na przyznaniu graczowi darmowej bonifikaty 💰. Jeśli użytkownik jest pewien, że powinien otrzymać taki względnie inny added bonus, ale nagroda nie und nimmer dotarła na balance jego konta osobistego, warto skontaktować się z. Kod promocyjny możesz podać zarówno podczas rejestracji konta, jak i really przed jakimkolwiek innym wydarzeniem. Wszyscy nowi użytkownicy mają możliwość otrzymania darmowego zakładu MostBet po rejestracji.

Szokująca Prawda Zdziwisz Się Jak Często Piłkarze Obstawiają Mecze U Bukmachera

W końcu to just one dają jasny sygnał, który z walczących stawiany jest w roli faworyta, a także mają realny wpływ na wysokość ewentualnej wygranej. Szybkie i intuicyjne food selection – dzięki prostemu interfejsowi użytkownik może łatwo poruszać się po aplikacji we szybko znaleźć interesujące go zakłady. Wpłać środki na swoje konto bukmacherskie, jeśli nie masz wystarczającej ilości środków na obstawienie zakładu. Gdy Twój poziom wzrośnie, będziesz mieć dostęp do wielu specjalnych bonusów, które dodatkowo zachęcą szczególnie aktywnych graczy. Po otwarciu, na przykład, zakładki z meczem Lig Mistrzów będziesz potrzebować co najmniej pięciu minut, aby po prostu przejrzeć wszystkie dostępne opcje zakładów.

Nic ngakl nie podnosi ciśnienie podczas meczu, jak postawiony kupon u bukmachera. W naszej ofercie znajdziesz kilkadziesiąt różnych dyscyplin sportowych, w których możesz obstawiać mecze sportowe. Następnie wystarczy, że wpłacisz środki, dzięki którym będziesz mieć możliwość obstawiania zakładów bukmacherskich na naszej stronie, a także uzyskanie bonusów powitalnych.

Jak Odebrać Bonus T Lv Bet?

Z tego względu, formularze rejestracyjne na poszczególnych portalach mogą się od siebie nieznacznie różnić. Standardem na rodzimym rynku jest jednak?e tak zwana „szybka rejestracja”, która keineswegs wymaga weryfikacji danych osobowych już mhh wstępie. W tym przypadku mamy do czynienia z kolejnym dość młodym serwisem, gdzie zakłady bukmacherskie można typować watts ramach najbardziej rozchwytywanych kategorii.

Bonus bez depozytu nie jest su wyjątkiem, a podstawowym warunkiem możliwości wypłaty bonusu na rachunek bankowy jest dokonanie nim wymaganej liczby obrotów. Dla gracza najkorzystniejsza jest oczywiście sytuacja, kiedy added bonus bukmacherski bez depozytu należy poddać 1-krotnemu obrotowi. U legalnego bukmachera BETFAN freebet na start ma bardzo proste do zrealizowania warunki. Nic więc dziwnego, ” “że opinie graczy o freebecie Betfan na 2024 są na ogół bardzo pozytywne. Patrząc z perspektywy gracza jest to świetne rozwiązanie, które sprawdzi się zdecydowanie lepiej niż obrót.

Probukmacher – Poznaj Najlepsze Zakłady Bukmacherskie T Polsce

Choć często pieniądze pojawiają się na koncie już tego samego dnia lub na następny dzień, to watts najgorszym wypadku należy na nie poczekać do 5 dni roboczych. Tak naprawdę każdy inny wynik niż wygrana Stosicia będzie tutaj dużą niespodzianką. Kursy bukmacherskie jasno wskazują, że to chorwacki zawodnik jest murowanym faworytem do zwycięstwa. W końcu w walkach pod szyldem KSW 6 z 7 walk, z czego 5 przed czasem.

U pozostałych buków znajdziesz jedynie wirtualne wyścigi konne, które są komputerowymi symulacjami opartymi na algorytmach. Platforma Tpay to jeden z wielu pośredników płatności, jacy oferują obsługę przelewów t Internecie. Co więcej, ten sposób wpłat upraszcza również płatności mobilne w sytuacji legalnych polskich bukmacherów. Platforma pośrednicząca t realizacji transferów pieniężnych z roku em rok zyskuje coraz większe uznanie rodzimych entuzjastów zakładów bukmacherskich. Jak widać, polskie zakłady” “bukmacherskie bonusy oferują całkiem ciekawe. Ich wysokość, a także łatwość użycia zależy z regulaminów, jakie przygotowują legalni bukmacherzy.

Twoje Ulubione Dyscypliny W Ofercie Sts

Zakłady na żużel można w Polsce obstawiać nie tylko watts przypadku krajowych ligi. Dostępne są również opcje związane z . wydarzeniami międzynarodowymi, jak chociażby Speedway Pound Championship (SEC). Federacja Gromda Fight Membership promuje walki bokserskie na gołe pięści, które cieszą się dużym uznaniem wśród polskich kibiców.

By obstawić wydarzenie, należy wybrać interesującą em dyscyplinę, następnie zaznaczyć konkretne zdarzenia, ustalić kwotę za którą chcesz zagrać we… Krok po kroku oferta tego legalnego polskiego bukmachera rozwija się i wchodzi na coraz to be able to lepsze tory. W efekcie, mamy carry out czynienia z jednym z najciekawszych serwisów do obstawiania zakładów sportowych. Nowi użytkownicy znajdą tutaj bogate bonusy powitalne, zaś aktywni gracze uzyskają” “dostęp do różnorodnych promocji.

Wsparcie Techniczne Vulkanbet

Aby dowiedzieć się więcej o bonusach, odwiedź nasz poradnik bonusowy. Portfele elektroniczne również stale stają się coraz chętniej wybieranymi metodami płatności w Polsce. Warto zaznaczyć, że oferują one bezpieczne, szybkie i komfortowe sposoby wpłaty i wypłaty. Wystarczy założyć konto Skrill, żeby móc poznać wszystkie najlepsze opcje nowoczesnych płatności online.

By otrzymać zezwolenie Ministra Finansów i być legalnym bukmacherem watts Polsce, należy spełnić kilka ważnych wymogów. Spółki starające się o zezwolenie muszą także złożyć wystarczające zabezpieczenie finansowe, a new także posiadać siedzibę w Polsce. Po spełnieniu wszystkich wymogów spółka ubiegająca się o zezwolenie czeka na rozpatrzenie wniosku przez Ministerstwo Finansów. Już teraz zapraszamy Cię do zapoznania się z naszymi stronami poświęconymi także aplikacjom mobilnym i najlepszym bonusom. Stale sondujemy rynek bukmacherski w naszym kraju, żeby dzielić się z Czytelnikami najświeższymi wiadomościami. Dzięki temu zyskujesz pewność, że udostępniane przez nas treści są bieżąco aktualizowane i odpowiadają aktualnym ofertom buków.

Gdzie Grać? Tylko U Legalnego Bukmachera!

Mianowicie Adamek po raz ostatni walczył blisko six lat temu we trudno oczekiwać kszta?ty sprzed lat. I być może będzie to dość ryzykowany typ, ale myślę, że walka nie zakończy się na punkty czy przez techniczną decyzję. Wyszukaj interesujące Cię wydarzenie sportowe i wybierz odpowiedni typ zakładu. Nie powinieneś się bać, twoje dane nie wpadną t ręce oszustów, light beer jest to konieczne tylko do potwierdzenia wieku gracza we zgodności szczegółów płatności w Vulkanbet. Przeczytajcie nasze recenzje, opinie innych graczy we sami podejmijcie decyzję. Jeśli bukmacher posiada licencję wydaną t innym kraju, light beer nie w Polsce, to znaczy, że u nas działa nielegalnie.

Oprócz tego w pokojach dostępny jest stół perform blackjacka oraz dwóch odmian wojny klasycznej i andar bahar. Pamiętaj, że obstawiając gry karciane w BETTERS. pl warto sprawdzić zasady, ponieważ rozgrywka może się różnić od tego, co znałeś do tej pory. Istotne jest również na to, że keineswegs masz wpływu na rozgrywkę, a jedynie możesz obstawiać wydarzenia na stole.

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