Melhores Cassinos No Brasil 2024 20 Top Web Sites De Cassino Online

Os Melhores Cassinos Online No Brasil Em 2024

Content

A Sensible Play é alguma das pioneiras no ano de jogos caça-níqueis na português e possuindo moeda brasileira. Por exemplo, ze the vantagem da odaie for 2%, obligación que o cassino vai ganhar 52% das vezes, from the o jogador ajajai ganhar 48% dasjenige vezes (em teoria, claro). Caso o seu problematica apresentando o cassino on the web não tenha sido resolvido, saiba u qual é possível mandar uma reclamação diretamente para o órgão emissor da licença. De fato, os game shows ze tornaram mais buscados nos últimos anos e é possível encontrá-los em sostanzialmente em qualquer cassino online. Com o layout 5×4 elizabeth uma trilha sonora emocionante, você tem a possibilidade de ganhar rodadas grátis” “at the proliferar seus ganhos sony ericsson cair símbolos iguais numa de suas 12 linhas. Também é possível ganhar rodadas grátis elizabeth possuir multiplicadores aumentando seus ganhos at typically the vitórias.

Se eles decidirem melhorar at the consertar os problemas que descobrimos – reiniciamos nosso trâmite de análise. Os jogos gratuitos também são ótimos em virtude de experimentar diferentes estratégias de jogo electronic para aprender tais como aumentar suas chances de ganhar no jogo. Se estiver a depositar, clique em prosseguir elizabeth no meio de minutos, ou mesmo segundos, operating system fundos atingirão tua conta no cassino e você poderá jogar instantaneamente. Uma oferta de reembolso assume a manera do bônus para depósito e você receberá de cambiamento uma porcentagem carry out dinheiro que apostou, dependendo de quanto dinheiro perdeu. Sugerimos que aprenda the familiarizar-se com todas as regras, apostas, pagamentos e posibilidades deste jogo. A nossa equipe de especialistas BRCassinos. com preparou um maior e mais interessante guia com dicas sobre roleta e ainda um panorama das melhores estratégias para um jogo de roleta profissional os melhores cassinos.

É Seguro Jogar Nos Casinos Online?

Os termos e condições gerais e para bônus também dão boas dicas a respeito de the proposta carry out cassino. Os bônus de boas-vindas são uma forma bem well-liked de atrair novos jogadores. Eles oferecem bônus logo design la cual você cria uma conta, que podem vir em manera sobre saldo adicional ou até ainda sobre rodadas grátis. Cada um possui suas próprias características at the, com um bocado de indagacion, você encontrará os grandes cassinos” “novos perfeitos para você. Desde roleta francesa, europeia à americana, oferecemos múltiplas opções em um dos jogos de comensales privado.

Depois de escolher um cassino online confiável, é escrupuloso se cadastrar e depositar. No guia a seguir, vamos explicar, de maneira geral, como cumprir esses passos. A legislação brasileira da voie que cassinos on the web atuem no País brasileiro, sendo a única proibição os estabelecimentos físicos. Ele tem uma ótima gama de jogos, que vão desde aqueles que são febres no momento até operating system que já estão consolidados no setor há muitos anos. O Onabet traz um visual também clássico que pode agradar jogadores mais experientes, sem deixar de lado sobre oferecer o Pics como método de pagamento.

Os Bônus Também Populares Dos Bons Cassinos Online

Esses provedores são empresas que criam e inventam slots e mesas de cassino ao vivo. As licenças de autoridades para jogos internacionais, tais como Curaçao, Malta, Reino Unido, Portugal elizabeth mais, seguem sendo a melhor garantia para apostas protegidas. Ao longo da regulamentação oficial zero Brasil, é fácil encontrar cassinos confiáveis para apostar. Para turbinar tudo,” “é possível usar to código promocional Parimatch PMVIP e pretender 150% até R$ 7. 500 no primeiro depósito. Depois dessa excelente chollo, você encontra torneios e promoções sazonais que turbinam because apostas.

A Autoridade Regulatória de Gibraltar determine as leis pour empresas de games de azar la cual desejam obter typically the sua licença. Assim como a licença de Malta, since empresas que querem obter uma concessão, precisam entrar simply no padrão internacional relacionada jogos que foi estabelecido pela GRA. A Parimatch também é ótima em virtude de os fãs pra esportes virtuais, já que tem um dos catálogos também completos do segmento. Este cassino é um” “2 nossos preferidos através de uma sua simplicidade, a partir de o momento do cadastro até ao de apostar. É fácil encontrar os slots que procuramos e o web site é super rápido tanto no móvil como no personalized computer. Esses sites de jogos para azar são uma versão virtual 2 cassinos que encontramos em muitos partes do Brasil electronic você poderá jogar onde e no momento em que quiser usando to seu computador ou dispositivo móvel.

Mostbet Casino Онлайн — Android Apk, Ios, Честное Интернет Казино

Todos os melhores internet sites de jogos online apresentam centenas de caça-níqueis clássicos elizabeth slots de vídeo em seus industry lobbies – com sua oferta de jogos de slot se desenvolvendo o tempo en absoluto. Este é to tipo de bônus de cassino online no qual os jogadores não precisam se preocupar no ano de realizar um grande número de apostas para sacar os ganhos de um limitado jogo. Ou venha a ser, para solicitar um resgate, os jogadores precisam apostar um valor do crédito apenas algumas vezes.

Antes de fazer um pagamento dos lucro pela primeira vez, a plataforma Pin Up solicitará ao usuário que passe através do procedimento de verificação, ou seja, que confirme seus dados pessoais. É por isso que é extremamente importante asignar informações confiáveis ​​sobre você. Prepare digitalizações dos documentos necessários (passaporte, código sobre identificação). Sem enseñar os jogos de mesa, cartas, jackpots e títulos exclsuivas da casa.

Spaceman: O Jogo Do Astronauta

O bônus do cassino produz jus ao fama Bet7k, já la cual ao realizar seu depósito, você tem a possibilidade de ganhar até R$ 7. 000. Famosa por ser alguma das casas sobre apostas esportivas cependant confiáveis do setor internacional, a Parimatch já faz algum tempo que também reina como alguma das grandes operadoras de jogos sobre cassino online. Como pode ser visto no banner, eles têm diversos Accident Games e oferecem facilidade de pagamentos para o público brasileiro, bem tais como suporte direcionado. Os sites de jogo online acima são um resumo rápido para que” “você possa entender quais são os bons cassinos online disponíveis para jogar hoje no Brasil. Estes são sua mais interessante escolha se você quiser jogar operating-system melhores jogos, nos melhores cassinos at the com os grandes bônus. Está a procura dos melhores jogos de cassino assim como os maiores bônus do mercado?

Então faça teu cadastro na 10bet utilizando o nosso banner exclusivo e amplie sua experiência de jogos on the internet. Se quer aproveitar a seleção para caça-níqueis e jogos de cassino ao vivo do Izzi Casino, então inicie a sua experiência fazendo seu cadastro por meio do nosso banner exclusivo. Com mais de 2. 000 jogos disponíveis, o cassino Rivalo também está entre as melhores opções de cassinos online do País e do mundo.

Por Que Você Tem Que Confiar Em Em Do Brasilcasinos Apresentando Br

Aliás há uma considerável circulação sobre dados bancários e dinheiro que precisa ser protegido en contra fraude e ou qualquer forma sobre hackeamento. Abaixo, descreveremos o porquê este 10 itens são indispensáveis ao decidir um cassino. Ao se cadastrar not any BC. Game to casino te presenteará com um bônus de 300% zero seu primeiro depósito de no mínimo R$50. Portanto, come agora se cadastrando na qualquer uma dasjenige nossas indicações para experimentar o funcionamento dos sites. Acompanhe com atenção a new resposta de qualquer dúvida para ficar ainda mais bem informado. Procuramos deixar tudo o também esclarecido possível afin de você ter toda segurança e comodidade na hora para apostar.

Sim, além de se entreter com os seus jogos de cassino favoritos, em quaisquer sites que indicamos você pode fazer apostas com recurso financeiro de verdade elizabeth fazer a huida do seu saldo positivo. Felizmente, some sort of grande maioria dos cassinos online já trabalha com o Pix em” “alguma capacidade, seja para depósitos, saques systems ambas as opções. Os cassinos online no Brasil funcionam de forma muito similar a 1 físico, no quisquilloso que você pode aproveitar diversos jogos e lucrar dinheiro real. Como não poderia ser diferente, o cassino ao vivo é mais um ponto positivo, apresentando diversas opções pra os jogadores brasileiros, com salas de Roleta e Black jack com atendimento no ano de Português. Você tem a possibilidade de jogar Aviator, JetX, Spaceman e diferentes títulos nas principais plataformas de jogos como 1xbet e Stake.

Críticas Do Casino On The Internet Pin-up

Isso ocasiona do Vaidebob the escolha ideal parecchio para iniciantes, o qual ainda estão aprendendo as nuances dos jogos de cassino, quanto para jogadores experientes, que querem aprimorar suas táticas. O aplicativo Melbet é fácil para baixar e dar, e oferece acesso a toda some sort of gama de jogos e recursos carry out cassino. Isso inclui uma ampla seleção de slots, jogos de mesa, jogos de dealer ao vivo, e até mesmo apostas esportivas. Analisando todos os melhores cassinos on the internet, o cassino da Stake é to de maior destaque entre eles. Agora basta dar to próximo passo at the criar a sua conta nos bons cassinos no Brasil que estão em nossa retahíla.

Você pode entender the diferença do bingo de cartelas pra o vídeo stop online grátis aca em nossos diferentes textos do ApostasLegais sobre esse scontro. Por agora, um que importa” “é saber que um melhor cassino possuindo bingo de cartelas é o ag Betmotion. Aqui, u que importa é que a 1xBet tem um bônus de até R$ 9. 500 e mais 150 giros grátis. A segunda colocada em nosso rating de promoções em virtude de novos jogadores foi a LeoVegas, possuindo uma oferta sobre até R$ five. 000 e também 50 giros grátis. Como tem diversos jogos crash simply no catálogo, muitas vezes acabo por dormir R$1 para tentar a minha caso no jogo crash Aviator ou na versão exclusiva de uma marca, o PariMan.

Tipos De Games Mais Comuns Em Cassinos Online Zero Brasil

A experiência dos usuários vem sendo melhorada a cada ano pela trampolín, que disponibiliza game titles clássicos e também os mais modernos. Vale destacar que a Betmotion aceita criptomoedas como o de seus métodos de depósito electronic saque. Isso provoca com que este cassino online possa ser o indicado para quem pretende jogar com moedas digitais. Além disso, to cassino Bet7k proporciona depósito mínimo desde R$ 5, transformando mais acessível perform que nunca afiliarse na ação at the começar a dar online.

Além disso, nesse cassino os jogadores devem verificar suas conta anteriormente a fazer um primeiro depósito. Desse modo, a comunidade de jogadores ze torna muito néanmoins segura e confiável, evitando fraudes e problemas futuros. Essa é uma grande oportunidade e uma excelente estratégia pra aumentar as suas chances de ganhar. Portanto, não perca tempo e faça o seu cadastro no cassino os quais mais chamou the sua atenção. Outra característica importante sobre um bom cassino é a facilidade para navegação que ele precisa oferecer. Esse é um ponto muito relevante para quem está começando a apostar agora.

Melhores Sites Sobre Cassino Em 2024

Uma das seções mais interessantes para quem joga no 888casino é a 888 Exclusivo, some sort of qual contém games que são exclusivos desse cassino on the web. Além disso, toda segunda-feira acontece o Boost da Tercer, que aumenta suas chances com o bônus de 100% sobre o depósito. A plataforma também oferece competições electronic torneios, sempre repletos de prêmios, além de raspadinhas elizabeth bingo. O cassino Rivalo se destaca por sua tradição e confiabilidade, já que está not any mercado a néanmoins de dez anos.

Também existem muitos cassinos que não são tão confiáveis e pode se tornar arriscado se cadastrar em algum deles. Quanto mais você pesquisar antes de selecionar o cassino em que vai realizar o seu cadastro e depositar, melhor. Por isso, vamos ajudar você com as respostas pra as principais perguntas que recebemos 2 nossos leitores. Primeiramente, não é to cassino que desenvolve os jogos os quais estão disponíveis no website.

Bet – Mais Bônus De Boas-vindas De Cassino

Se pretende uma boa opção de marca possuindo site responsivo electronic app para Android os e iOS, você precisa conhecer to cassino Sportsbet. io. O cassino 20Bet, por exemplo,” “tem licença do Governo de Curaçao, alguma das melhores em dias de hoje em dia. Para crash online games, a casa tem cashback semanal afin de Aviator, Spaceman e Mines. A Betano tem uma reputação incrível, principalmente quando falamos da zona do cassino, multi premiado (recebeu, inclusive, prêmio de mais interessante cassino do ano pela SBC Honours de 2023). Então esse jogo para slot com structure 7×7 vai ght deixar com água na boca elizabeth com os olhos brilhando com since chances de lucro graças a possibilidade de ter tua aposta multiplicada possuindo até 5 símbolos combinados.

Já explicamos que o cassino online é permitido aqui no brasil em outro texto aqui carry out ApostasLegais. Portanto, tem a possibilidade de abrir a tua conta em qualquer um dos websites que listamos que todos são seguros e permitidos em virtude de brasileiros. Você quem deve decidir to que é essencial no cassino on the internet confiável que vai se cadastrar. Ou seja, todos estes 3 cassinos contam com uma ótima variedade de salas para jogar stop online valendo recurso financeiro.

Conclusão Sobre Operating System Melhores Cassinos On The Web No Brasil

Nenhuma categoria apresenta tantos jogos disponíveis nos melhores cassinos online quanto os slots (também conhecidos aqui como caça-níquel). A Blaze tem um dos grandes cassinos online autorais do Brasil, oferecendo aos jogadores uma coleção incrível de games exclusivos, criados através da marca junto the grandes provedores carry out ramo. Assim como os demais bons cassinos online, some sort of F12 Bet traz categorias e distintos funções de pesquisa que aprimoram some sort of experiência. Porém, o foco está nas apostas ao vivo, em especial em mesas de bingo online e online poker, com torneios elizabeth participações de jogadores ao redor carry out mundo. Você tem que saber que bônus e promoções podem ser encontrados nos melhores cassinos on the internet, é uma manera de agradecer pelo seu registro electronic confiança. O web site oferece uma ampla variedade de games de cassino electronic um extenso ramo de apostas esportivas.

Dá para buscar bônus de boas-vindas, rodadas grátis, além de promoções regulares para os jogadores. Os melhores cassinos online costumam conseguir uma variedade bem grande de mercados de apostas esportivas com diversos esportes para você curtir apostando na sua modalidade favorita. A verdade é os quais o melhor cassino online para você não necessariamente é o mesmo afin de outros brasileiros.

Blackjack Online

Somos considerados um dos melhores cassinos porque oferecemos os grandes jogos feitos pelos melhores desenvolvedores. Os amantes de games de estratégia podem escolher jogos sobre roleta ou tarjetas. Se você desejar experimentar novas emoções, pode tentar trabalhar com revendedores ao vivo. Aqui você vai encontrar análises, jogos, métodos de pagamento e bônus disponíveis nos grandes sites de cassino online. Tenha uma experiência incrível, acompanhando com a pandilla tudo o la cual precisa saber relacionada cassinos seguros para apostar e lucrar de verdade. Os jogos de cassino online também podem ser jogados por diversão antes de” “dar dinheiro de verdade.

Mas um casino tem a possibilidade de facilitar ou privar esse processo, possuindo diferentes fatores lo que requisitos de apostas, métodos de deposito limitado, verificação sobre identidade negada. Mas talvez você seja um apaixonado por esportes, ou prefira se entreter com jogos de caça-níquel ou mesas de jogos ao vivo. Se você é o apostador brasileiro, electronic precisa utilizar sobre um VPN para ter acesso some sort of sites de casino, isso não é um ponto objetivo. Os Casinos os quais têm permissão pra operar online” “not any mercado nacional, deixam o acesso liberado, caso contrário esta pode não ser uma rede segura.

Qual O Melhor Jogo De Apostas Pra Ganhar Dinheiro?

Sites licenciados elizabeth regulados por organizações que garantem transparência, segurança como também a integridade dos jogos para cassino online. Experimente a emoção das apostas grátis ou teste alguns 2 jogos da página comos bônus oferecidos pela Betpix365. Você sentirá a recompensa por cada depósito feito graças à espetacular oferta promocional. Acreditamos que operating-system pagamentos são alguma das partes também importantes dos games online com dinheiro real. É por isso que nos concentramos tanto em opções bancárias, pagamentos rápidos e processos transparentes e verificados. Além disso, muitos cassinos online rapidamente oferecem outras promoções conjuntamente com o bônus de boas-vindas.

É alguma tendência geral que as pessoas pensem que os cassinos são todos iguais. Apesar deles apresentarem modalidades de jogos semelhantes, isso não quer dizer os quais você precisa escolher o primeiro os quais aparece no seu mecanismo de trata que. Se não conhece os diferentes modelos de cassino, possivelmente fará uma seleção equivocada. Veja arrancar as opções para diferentes cassinos afin de que você decida qual deles poderá suprir as suas necessidades. Observe since particularidades e examine as alternativas afin de priorizar as grandes.

Pagamento Seguro Em Cassinos Online

Analisamos quaisquer sites que apresentam uma plataforma para cassino ao festón para que você saiba quais jogos pode jogar. Quando se trata sobre jogos de cassino ao vivo, é essencial saber to que faz to melhor jogo ao vivo se despuntar do resto. O processo de reconocimiento é habitualmente simples e rápido, não tardando mais os quais um par sobre minutos.

Tudo isso, por oferecer os métodos de pagamento cependant funcionais e descomplicados do mercado, tais como Pix, transferência bancária, carteiras virtuais no meio de outros. Verificamos a sua variedade electronic experimentamos seus jogosEntramos em um cassino online para jogar, portanto os games oferecidos são relevantes para saber sony ericsson um cassino on the internet vale ou não nosso tempo. Uma combinação de caça-níqueis online, loteria, stop, jogos de comensales e jogos sobre cassino ao festón é importante afin de atender à grande parte dos jogadores. Logo acima é possível encontra a sugestão da Melhorescassinosonline. possuindo para os melhores bônus de cassino nacionais, com operating-system detalhes das ofertas atuais. Considere operating system requisitos de expresamente do bônus, some sort of sua validade, quais os jogos incluídos e se há limitações nesse sector, assim como os métodos de pagamento elegíveis para o bônus sobre boas-vindas.

Conselhos De Especialistas Em Igaming Em Virtude De Jogadores De Cassino Brasileiros

Alguns dos provedores para jogos de cassino mais conhecidos incluem NetEnt, Play’n Proceed,” “Playtech, Evolution Gaming elizabeth Pragmatic Play. Os cassinos que recomiendan têm filtros at the funções de pesquisas bem funcionais, para que os usuários consigam achar facilmente to jogo que procuram. Consultar o RTP e outras informações dos jogos também deve ser um mais simples possível.

A tablado, majoritariamente laranja, também possui uma versão para celulares tranquila de usar e rápida de navegar, então será fácil encontrar o bônus de boas-vindas elizabeth outras promoções. Com uma extensa lista de jogos Bundle of money, o design weil plataforma é lúdico e limpo. Muitos dizem que u site possui um layout muito bom, com boa seleção de jogos; diferentes, afirmam que operating-system saques demoram the ser processados. Já que o Brazino777 é brasileiro, some sort of plataforma possui alguma conta no Reclame Aqui, o Trustpilot nacional, digamos desta maneira. Esta página contém referências a ofertas de um ou cependant dos nossos parceiros. Poderemos receber uma compensação quando você clicar nesses links e resgatar alguma oferta.

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