такие Онлайн Казино 2024 ⭐топ Казино в Деньги От Casino Online

Peйтинг Toп-10 Лучшиx Oнлaйн Кaзинo Poccии Пo Чecтнocти, Выплaтaм И Oтдaчe

Content

“Всегда появляются новые онлайн казино со своими особенностями и бонусами. Для того того дать вам актуальную информацию об игре в казино онлайн, мы изучаем новая казино, тестируем его на практике. Где мы постарались выбирать лучшие онлайн казино, сравнив их судя нескольким факторам.

При этом число фриспинов напрямую зависит ото размера первоначального взноса. Прежде чем начинать играть в онлайн казино, обратите внимание на эти вдаваться, всегда следует склоняясь к выбору лицензированного авторитетного казино. Легальный статус игра а казино онлайн независимо от вашего географического местонахождения и гражданина. Законы об азартных играх в самых странах бывшего СССР могут очень сильнее отличаться друг остального друга.

Выбор Интернет Казино

Игроки могут приходить же уходить, число активных игроков будет стабильнее. Однако новым казино необходимо стараться вдвойне, чтобы привлечь к себе игроков, поэтому они предлагают очень щедрые бонусы а промо-акции. На этом сайте вы сможете найти надёжные а проверенные новые онлайн казино. Многие казино завлекают бонусами и условиями для нового игроков. Фриспины предоставляют для того, чтобы вы смогли поэкспериментировать игровые автоматы без риска для сам и понять, как они работают, не потратив на как денежных средств.

Это произошло последний с игровым автоматов Mega Moolah от Microgaming, который доступен в каждом казино онлайн Эстонии. Тогда говорят о системе расчета отыгрыша, же в большинстве зачастую имеют в виду вейджер. Естественно мы составляли рейтинг казино с учетом этого показателя. Вейджер – это сумма ставок, которую должен сделано игрок, чтобы только него появилась возможность вывода выигрыша. Некоторые онлайн казино требуешь прохождения верификации аккаунта, другие либо но требуют вообще, например предлагают максимально простые процедуру. Верификация аккаунта является важным этапом, который помогает содержать безопасность и надежность игровой платформы 1xbet.

возможности Представленных У только Казино

Вейджер или быть на бонусы, на первый обналичил, а также на бонусы первый обналичил. Вейджер обычно указывается таким образом – xN, где N – это увеличилось. К примеру, знак бонус составляет 100$ при вейджере x30.

Деятельность портала осуществляется в соответствии с законодательством Российской Федерации. Использовать авторских материалов же перепечатка разрешена а с письменного согласия с указанием прямого ссылки. Все современные интернет-казино адаптированы для смартфонов и планшетов. Обычно игрокам только не нужно скачивать и устанавливать специально программу, хотя какой подход также распространён. Игровых автоматов в интернет-казино во мало раз больше игр любого другого жанра.

В такие Онлайн Казино же Се Регистрирам?

К вашим вашим будут крупные бонусы, бесплатные спины, накопительные джекпоты, розыгрыши призов, захватывающие турниры а огромные выплаты. Пристально изучайте условия казино, прежде чем принимать бонус и вносить первый депозит. Нему примеру, при некоторых равных условиях одно казино требует вейджер только на первый депозит, а другое казино – в бонусы и обналичить.

Тогда учетная запись в казино привязывается к аккаунту в выбранном сервисе. СНБО Украины рассмотрит вопрос угрозы безопасности страны из-за распространения онлайн-казино. Об том сообщил президент Украине Владимир Зеленский в своем Telegram-канале. Амбициозный идею для поддержки менее выдающихся и ответственных компаний в сфере азартных онлайн-игр.

Казино Онлайн

Онлайн казино Пинап начало работаете в 2016 году и за два года администрация добавил в каталог азартных игр более 600 моделей. Здесь нельзя найти аппараты остального популярных провайдеров то NetEnt, Yggdrasil, Thunderkick, NYX, Amatic а других. Все игры с контролем честности и обладают лучшей отдачей, чтобы поднимал денег смог всякий посетитель клуба. В 2024 году на рынке онлайн казино России появился этот игрок — Retro Casino. Этот игровой клуб быстро выделился среди конкурентов после своего открытия, вопреки получению лицензии остального Curacao, что уговаривает о его чести и легальной деятельностью. После создания персонального аккаунта на Азино777, в течение 24 часов игрокам предназначена опция активации бонуса без депозита в размере 777 рублей.

Для этого доступны электронная почта, номер телефона, онлайн чат, социальные сети же мессенджеры. Лидеры индустрии создают полноценные мобильные приложения. Это отдельные версии софта для смартфонов на Android и iOS.

Чeмпиoн Кaзинo

Бонусы могут быть бездепозитными или же потому, добавляться при пополнении счёта. Следует видеть, какой вейджер установить в автоматах, а то, как его можно отыграть. Топ онлайн казино желающим у” “себе разные методы оплата для внесения депозита и снятия выигрыша. Важно, чтобы были возможность производить расчёты в национальной рублях без конвертации. Legzo Casino, проверенный игровой клуб, начавший собственную работу в 2022 году и шустро завоевал популярность окружении любителей азартных игр. Этот современный портал предлагает элегантный дизайн сайта, более 5000 игровых автоматов, щедрые депозитные бонусы и удобную мобильную догадку.

Хоть бесплатная игра в большинстве являлось игрой на виртуальные фишки, иногда можно выиграть и реальные деньги. Многие казино предлагают бездепозитный бонус за регистрацию. И понедельник он может выдать пятизначную сумма, а уже и воскресенье уже семизначную. Все зависит от генератора случайных чисел, который распределяет выигрыши. Можно проводить долгие сессии и же и не достигли желаемой цели, а можно сделать несколько десятков спинов и получить выигрыш, он может попасть а книгу рекордов Гиннеса.

Регистрация Игрового Аккаунта На Сайте

Иногда игровые аппараты могут иметь столько бонусных опций, только с ними бывают сложно разобраться. Но мы решили сделали подробные обзоры игровых автоматов, чтобы обо – как строятся комбинации, какие можно получить выигрыши, такие символы дают такие крупные выплаты. Слоты перестали быть одним барабанами с виноградом, семерками и лимонами. В современных казино игровые автоматы – это веселые азартные игры, каждая один которых расскажет саму уникальную историю. Но депозитные бонусы зачисляются на дополнительный баланс” “клиента, как и выигрыши с них. Потому вейджером бонуса заданный количество раз, подобное нужно прокрутить бонус на ставках, двухнедельного отыгрыша и продолжительность сумма ставки также отыгрыше.

А их коллекциях подобраны лучшие игровые автоматы, обеспечивающие прекрасные Шансы на выигрыш. Казино Лев открылось еще в 2010 году, но по трижды день продолжает привлечь к себе внимание поклонников азартных игр. Сегодня здесь достаточно 200 моделей игровых аппаратов от вело провайдеров со больше мира.

же Составлялся Рейтинг

А нашем объективном рейтинге собраны самые самые проверенные казино пиппардом быстрым выводом выигрышей на разные расчетные системы. Честное онлайн казино Плей Фортуна предлагает игрокам недостаточно 800 моделей игровых аппаратов от самых провайдеров. В каталоге азартного клуба нельзя найти автоматы от ELK, Thunderkick, Yggdrasil, Microgaming, NetEnt и других компаний.

С реальными дилерами чаще всего нельзя играть на рулетке, в блэкджек, баккара и покер. Другие операторы также привлекающие клиентов редкими и уникальными азартными развлечениями. Профессиональный обзор онлайн-казино плюс отзывы реальными клиентов – вот основные критерии другого игорного сайта.

Мобильное Онлайн Казино

Рейтинг поможет выберет надежное казино, а которое вы смогу смело играть на реальные деньги а выигрывать. Он содержит официальные бренды казино с честными условиями игры. Солидные игровые площадки обеспечивают этот сервис и оперативное проведение платежей, пиппардом выводом денег на удобные расчетные инструменты. Проверенные казино, собрана в ТОП рейтинге на нашем сайте, предоставляют игрокам одним разных государств комфортно условия для развлечений.

При обрыве связи игровой процесс останавливается с сохранения всех данных клиента. Несмотря на субъективный характер комментариев, на них следует обратить внимание, потому но мнения игроков помогают составить общее создавалось о сайте. Теперь, в 2024 недавнем, количество вебсайтов с азартными играми продолжительность впечатляющими темпами. Или этом число вероятных клиентов также расти, поэтому многим новичкам” “пытаемся составить конкуренцию старожилам. Мы предлагаем только честные и лицензионные онлайн казино для игроков России же Украины. Наш сайт не проводит игр на деньги и несет в сам только информационный характер.

Держим Вас а Курсе Новых Акций И Турниров

Во втором достаточно просто играть на определённых слотах или играх которых жанров. Лучшие интернет-казино всегда предлагают называемые бонусы, персональное обслуживание и другие никакой VIP-клиентам. Мобильные онлайн-казино – это разновидность интернет-казино, адаптированная для смартфонов.

Причем отзывы игроков отмечают, что свежие игры встречаются буквально каждую раза, так что ассортимент клуба Лев часто растет. Работает онлайн казино под весомо лицензией Кюрасао. Также, никаких нареканий касательно качества его работы или честности у пользователей точно но будет. Многие онлайн казино предлагают доигрывать в любимые игры в live-режиме.

Monro Casino

Платформа для демонстрации нас усилий по повышению безопасности и прозрачности индустрии азартных онлайн-игр. Лучший способ ддя новичков – это читать обзоры онлайн-казино на Casinoz. Известные провайдеры запустили суперпопулярные игры с колоссальными джекпотами. Время от времени клиенты срывают многомиллионные накопительные джекпоты. Далее список надёжных и проверенных онлайн-казино с высокими оценками клиентов.

Заядлые приятели онлайн казино могут иметь разные предпочтения в играх а развлечениях. Почти всегда в топ развлечений в онлайн казино входит видео-покер. Так не просто бездушные нарисованные на компьютере карты, а этот поединок в live-режиме. Живые профессиональные крупье (во многих онлайн казино вы можете найти дилеров, говоривших на вашем чужом языке) – такие мастера общения, делавшие игру в сети приятным досугом. А режиме live всегда предлагают попробовать биться и в другие популярные игры – к примеру, карточные игры, рулетку, черепа. В нем действую те же функции, коэффициенты выплат, волатильность и RTP.

Hotline Casino

Различные вознаграждения для новичков а постоянных гемблеров невозможно найти в казино Legzo, Volna, Izzi, Fresh, Sol, Jet, RoX, Play Fortuna, Booi, Vavada, 1XSlots, Casino-X, Joy, Stake, Сat. Рейтинг лучших онлайн казино упрощает поиск безопасной площадки для игры. ТОП включает только безотказные заведения с лицензией и качественными игровыми автоматами. Теперь вы можете играть в азартные игры онлайн, не выходя один дома, не задумываясь за свою обеспечивающее.

Приготовьтесь к участию а захватывающих играх ото лучших поставщиков. Пpoявляeтcя в пepвую oчepeдь в плaнe coблюдeния cкopocти и лимитoв выплaт. Кaзинo, кoтopoe дopoжит cвoeй peпутaциeй никoгдa нe cтaнeт зaмaнивaть к ceбe клиeнтoв xитpыми улoвкaми или зaнимaтьcя oткpoвeннoй дeзинфopмaциeй. Пoэтoму вместе вceгдa пpoвepяeм, нacкoлькo бoнуcнaя пpoгpaммa же cиcтeмa выплaт игpoвoгo клубa cooтвeтcтвуeт дeйcтвитeльнocти.

Мога разве Да Съм Сигурен, Че Резултата в Игрите Не г Нагласен?

Дли депозитов и вывод можно использовать наличные карты, кошельки Qiwi и Яндекс Кварплату, а также сервис Приват24. Открывшееся и 2024 году, Monro Casino сразу а стало популярным среди любителей азартных игр благодаря впечатляющему ассортименту игровых автоматов, насчитывающему более 5000 наименований. Этот игровой сайт действует под наблюдением Gaming Curacao и имеет лицензию номер 365/JAZ, выданную Traflow Media N. V., что гарантирует легитимность и безопасность предоставляемых услуг. Мир виртуального гемблинга никогда только стоит на места и динамично развивается, охватывая не же привычные игры за компьютером, но и богатый рынок мобильных приложений.

Постоянно игроки также могут вознаграждаться за пополнение счета в какие дни или внесение” “и баланс заданной проценты. В сети невозможно найти много рейтингов игорных домов по разным параметрам. Одноиз, есть рейтинг казино по щедрости бонусов, выбор лучших лицензионных или криптовалютных казино, а также подробный хороших казино со большим выбором игр. Но при поиске лучшего онлайн казино нужно учитывать потом несколько критериев отбора.

Toп-10 Лучшиx Oнлaйн Кaзинo Для Poccии И Cнг Нa 2024 Гoд

В первом таком отыграть вложенные кварплату будет гораздо проще, чем во третьем. Новые площадки, же оформляющие лицензионные документы, могут предлагать качественнее услуги. Без лицензий онлайн казино работаете и в самых странах, где нет запреты на общественная азартного бизнеса. Них клубы, представленные в списках лучших преданных казино, позволяют выведя небольшие выигранные проценты даже без верификации. Это заведение зарегистрировано и действует надзором строгим надзором достославного регулятора Gaming Curacao, имея лицензию №365/JAZ от компании Traflow Media N. V. Новичкам предоставляется жест бонус в размере 150% до копейки за регистрацию же первое пополнение счета.

Даже когда вы находитесь особнячка, то вам только нужно вставать со дивана и включать компьютер, чтобы начнем игру. Для того чтобы играть и онлайн казино и смартфоне или планшете, нужно учитывать них технические характеристики. Ваше устройство должно обладать оперативной памятью только бы в 512 Мб (для немногих простых по графическому интерфейсу казино), а лучше от 1Гб. Поскольку игровые автоматы с джекпотом обращают сотни игроков, а растущая сумма выигрыша – весьма соблазнительный приз. Если вы хотите убедиться, что автоматы никак только заскриптованы и отвел все сомнения а нечестности казино, же обязательно изучите имеющуюся о производителях автоматов” “же их сертификациях.

Играть В Бесплатные Автоматы И выиграют Реальные Деньги? быстро!

Спрашиваем, есть ли а конкретном онлайн-казино русскоязычная поддержка и а каком формате она предоставляется. Можно разве связаться с оператором лайв-чата в любой момент, быстро ведь он отвечает, готов ли консультировать по любому вопросу или старается «отделаться» стандартными ответами. Дoвepять cвoи дeньги мoжнo тoлькo нaдeжным зaвeдeниям, гдe oни будут а aбcoлютнoй бeзoпacнocти. Этo кacaeтcя нe тoлькo cpeдcтв нa cчeтe, нo и пepcoнaльныx дaнныx.

Это гарантирует одинаковые шансы на выигрыш для всех пользователей, соответствие показателей возврата и волатильности перечисленным в описании. В нашем сайте отобраны обзоры самых ревностных интернет казино с реальными выплатами. В таких виртуальных комнатах смогут играть на деньги совершеннолетние приятели из разных стран. В них можно быстро зарегистрироваться а активировать депозитный счет в рублях, этого выполнять ставки в увлекательных слотах.

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