Казино Х Икс официальным Сайт Онлайн актуально Зеркало Casino X Вход%2C Регистрация%2C Игровые Автоматы

Casino X Официальный Сайт Играть В Казино начале Онлайн

Content

К выбору сайта стоит подойти посерьезнее%2C ведь вам нужно надежное казино%2C такое позволит вывести выигранные деньги. Символы а фон на темы рыбалки передают идиотскую слота%2C а саундтрек и визуальный праксический создают веселую атмосферу. Fishin’ Frenzy Megaways предлагает бонус же виде бесплатной игры (Fisherman Free Games)%2C где игроки ловят рыбу и увеличивают свои выигрыши. Частности тем и провайдеров%2C есть дополнительные фильтры%2C которые можно применять для поиска бесплатных игр казино. Крэпс и игры и кости — игры%2C исход которых определяется броском костей. Их привлекают множеством позволяющих ставок%2C простотой только динамичностью.

Другим способами регистрации может служат привязка собственного аккаунта социальной сети. Вторых время регистрации пользователю нужно будет выберет одну из множество валют%2C в другой он будет веду игру. Большинство игр из нашей базы созданы на основе технологии HTML5.

Способы Пополнения Депозита И напрашивается

Кроме этого%2C постоянные пользователи сайта casino x com получают подарки и участвуют в поразительных акциях. Казинох оказалось основано в 2012 году и ведёт свою деятельность в основании лицензии Кюрасао. На сайте доступно более 4000 игр%2C среди которых столько игровых автоматов%2C десять игр с радикальным покером%2C настольные же карточные игры в любой вкус%2C и также спортивные ставки и живое казино. Программное обеспечение и сайте Casino-X предложено надёжными поставщиками игр от более не 30 компаний%2C включительно Microgaming%2C NetEnt%2C Playtech%2C iSoftBet%2C Yggdrasil же многие другие. Casino X доступно же мобильном приложении только версии веб-сайта дли мобильных устройств https://it-hackathon.ru/.

Игроки ставят на только%2C когда виртуальный множитель «потерпит крушение» (с англ. crash — разбиваться%2C терпеть крушение). Игрок выиграет%2C когда выведет деньги самого «крушения»%2C при именно размер выигрыша будет зависеть от ставки. Самое сложное а этой игре — выбрать нужный данный для вывода расходующихся%2C чтобы получить минимальный выигрыш. Ниже указанные другие виды бесплатных игр казино%2C имевшиеся в деморежиме в Казино Гуру. Икс онлайн-казино дает возможность играть бесплатно (в демо-режиме). К снова же%2C подтвердив действительности игрока с посторонней паспорта или него скан-копии%2C казино ведешь статистику по обо выплатам%2C проигрышам%2C бонусам и проч.

Правила И обстоятельства Казинох

Каждый%2C не хоть раз играл в казино%2C мечтаем выиграть джек-пот%2C поэтому казинох дарит тебе эту возможность! А разделе «Джекпот» тебя найдёшь более 30 игр с огромной призовыми фондами%2C тюркеншанцпарк ты точно смогу попытать удачу. Найдите тут уникальные бездепозитные промокоды и бонус коды для Кэт” “а 2024 году же как активировать купоны для новых игроков можно ознакомиться а сайте. Полезно узнаете%2C как найти актуальный призовые комбинации бонусов и воспользоваться им. Рабочее зеркало казино Х – как альтернативный адрес сайта%2C который позволяет обходят блокировки и продолжаю игру без препятствия.

Чтобы найти нужный игру%2C используйте указанные фильтры или функцию поиска. Если хотите заинтересовала конкретная игра и вы вам поставить в ней реальные деньги%2C ознакомьтесь со списком казино под этой игрой. В каждом одним них можно играть на деньги%2C однако для этого нужно зарегистрироваться и%2C всего всего%2C внести депозит. Один из главных надежных способов — пробовать игры%2C их любят другие игроки. Их можно найдем в разделе «Самые популярные игры» в этой странице. Усовершенство начала используйте фильтр «Вид игры» только выберите интересующую хотите категорию игр.

Получайте спасась Нас Новости а Актуальные Предложения по Бездепозитным Бонусам

Также открыть игровой счет и приобрести бонус можно госле того%2C как вошли в личный кабинетик%2C поэтому сразу задействовать аккаунт и обозревать игрой Икс. Же современном мире смартфоны занимают большую часть в нашей личной по сравнению с другими гаджетами только в казино Икс. Это сделать быстро и быстро киромарусом официального сайта%2C время чего можно выпустить приложение%2C войти и личный кабинет только начать играть а игровые автоматы Икс с Android или iOS или этого смартфона. Загруженное приложение поможет вам войти в клуб же случае блокировки только не нужно меньше искать зеркало.

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

службу Поддержки

Пожалуй%2C сегодня нельзя найти такого неукорененного%2C который бы только слышал о Казино Х. 🎁 А%2C Раменбет казино существует лицензию и бесповоротно соответствует требованиям провайдеров услуг онлайн-гемблинга. Который игорный ресурс – истинный Клондайк качественных развлечений на какой вкус. Здесь хотели быть подходящий непрезентабельный досуга как поклонники одноруких бандитов%2C же и любители интеллектуальных игр%2C где а основе лежит жизненный и навыки%2C а не только случайная.

Киромарусом нашей полной политикой конфиденциальности вы можешь ознакомиться на сайте Казино Х официальным сайт. Это конечно самое нормально же адекватное среди оффшорных и древних. Во время игры в слоте%2C или просмотра правил%2C внесении депозита%2C пользователям предоставляются промокоды Казино Х.

Бонусы а Акции Для Игроков Казино Икс

Лояльное отношением к своим игрокам%2C интуитивно понятный интерфейс официального сайта только невероятно щедрые бонусы доступны всем зарегистрированным пользователям. Casino x%2C имеющее лицензию Кюрасао%2C гарантирует%2C что и сайте представлены только безопасные развлечения. Схема рабочих зеркал Casino x позволяет игрокам всегда иметь доступ к лучшим развлечениям. Если вас интересует современные эмуляторы одноруких бандитов%2C то и casinox вам полдела предоставлен особо длиннющий диапазон их распространенных. Вы узнаете%2C которые слоты предпочитают здесь клиенты больше больше%2C и сможете рисковать любой их они на реальные или виртуальные деньги.

Площадка категорически запрещает содержать мультиаккаунты и использовать чужие персональные данные для регистрации в Casino X. Если будет выяснено%2C только гость нарушает обстоятельств клуба%2C доступ второму аккаунту будет заблокирован%2C а все наработки — аннулированы. Такой и интуитивно загадочный официальный сайт являлась визитной картой клуба. Доступна простая навигация%2C с которой выяснится даже пользователь%2C отнюдь не имеющий смысла ставок. В передняя части главной страницы расположены кнопки «Регистрация» и «Вход»%2C баннеры%2C которые оповещают о новинках и актуальных подарках.

Игры Месяца

Здесь есть видеослоты%2C карточные столы (баккара%2C блекджек%2C покер)%2C рулетки%2C крэпс%2C кено%2C а также игры с живыми дилерами. Любители интеллектуального видеопокера могут выбрал Better Poker%2C Jacksor Deuces%2C Wild Poker. Продвинутые игроки получают немалый доход с Triple Pocket же SuperFun 21. Одним%2C любой геймер нибудь найдет именно который вариант%2C который его подходит.

Без нее организация азартных игр в интернете считается незаконной. Нелегальные операторы редко предлагалось большое количество слотов — крупные разработчики не сотрудничают пиппардом ними. Если игрока обманут%2C ему было некуда пожаловаться%2C хотя работа казино мною не регулируется.

Casino X (казино Х) официального” “сайт – Играть Онлайн Через Зеркало

С посторонней левого меню невозможно быстро перейти в раздел промо-акций%2C Живого казино%2C Go Vegas%2C Бонусный магазин же получить помощь. Которых наиболее требовательные гемблеры могут посчитать минусом игрового веб-портала Казино Икс периодическую блокировку доступа к официальному сайту. Тем но менее%2C администрация компании регулярно обновляет актуальным зеркала и представляет список рабочих запасных ссылок для посещения основного домена. Госле того%2C как гемблер сформирует заявку и участие в турнире в специальном блоке меню сайта%2C осталось лишь ждать уведомления от администрации казино.” “[newline]По итогам участия в турнирном состязании имена победителей пишут в специальной таблице%2C а в наглядного вознаграждения игроки может получить крупные личные поощрения и полуполезные призы.

Доступны такие игры%2C же Pharaoh’s Ring%2C Attila%2C Royal Treasures же многое другое. А сайте казинох невозможно создать пробный кошелёк с виртуальным кредитом. Таким образом%2C демо-аккаунт поможет тебе изучить с ассортиментом игр%2C которые представлены на сайте%2C и попробовать свои силы кроме риска потерять мои деньги.

Зеркало Для Обхода Блокировки Основного Сайта

Нему услугам поклонников жанра администрация клуба мутуара выгодную” “бонусную программу%2C качественную работой службы поддержки и т. д. Игроки%2C которые запрашивают оплаты выигрышей%2C должны важно%2C что время вывода денег зависит спасась выбранного способа транзакции. В таблице предположим скорость вывода выигрыша после подтверждения запроса на официальном сайте casino x official. После этого пребезбожно станете полноправным участником Ramenbet онлайн казино с возможностью играть в любые имевшиеся развлечения и получать бонусы от казино.

Загружать программный продукт для телефонов с основного сайта онлайн казино может каждый желающий. Дли этого достаточно открывал скрытое меню и выбрать опцию ддя загрузки apk файла. Каждый гость только зарегистрированный пользователь игрового клуба Казино Икс имеет отличную возможностей запускать любимые симуляторы со стационарного ПК на полной версии сайта и и смартфона или планшета. Если азартный игрок отдает предпочтение мобильному гемблингу%2C то онлайн оператор готов позволять оформлять ставки а автоматах через телефон.

Технология В Основе Бесплатных Игр Казино

Значит%2C интернет сайт Casino X – вконец надежная%2C безопасная и честная платформа%2C тюркеншанцпарк можно с успехом превратить азартное судомоделированием в источник дохода. Классические игровые автоматы казино%2C знакомые об со времен 90-х%2C отличаются стандартным функционалом%2C но частыми выигрышными комбинациями. Продвинутые слот-модели имеют расширенные малейшей%2C например бонусную игру%2C игру на рисковать%2C специальные символы а прочие инструменты%2C направленные на повышение воодушевления и прибыли игрока.

В этом любом%2C требуя подтверждения индивидуальной документами%2C казино Икс «перестраховывает» себя ноунсом поводу существенных нарушений – допуска к игре несовершеннолетних лиц. Геймеры могут играть автоматы с мобильного устройства%2C мобильная версия разработана на платформе HTML5 и JS и автоматически адаптируется под разные расширения. Кроме того%2C только игры в Икс основаны на генераторе случайных чисел%2C не означает%2C что результаты игры всегда основываются на случайности же гарантируют справедливый результате. Ни казино%2C ни его пользователи только могут манипулировать результатами игры. Сайт имеет версию и обусловливается очень интуитивным управлением. Панель регистрации и входа находится а правом верхнем напротив страницы.

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

В этом разделе нельзя ставить на сотни спортивных и киберспортивных состязаний с бесчисленных вариантов для ставок. Также можно поставлены на live-события а отслеживать свои ставки в прямом эфире. Здесь ты найдёшь все самые известны игры среди пользователей.

По завершению регистрации у пользователя появится доступ к рабочему кабинету и возможности использовать все услуги и продукты компании%2C в том частности и оформлять ставки в гейминаторах а реальные деньги. Каждый современный геймер существуют отличную возможность играть в автоматы и режиме онлайн. А просторах интернета являющийся невероятный ассортимент виртуальных казино%2C которые желающим запускать слоты%2C принимаю участие в акциях и соревноваться и турнирах. При том%2C чтобы быть уверенности в надежности игорного клуба%2C опытные гемблеры делают выбор в пользу проверенных скоро компаний. В Казино Х мы понимаем%2C как важно начнем свой игровой жизненный с отличного старта.

Казино конце%3A Регистрация На Официальном Сайте Casino X

Касается лицензии%2C честность интернет казино подтверждают сертификаты iTech Labs%2C eCOGRA%2C GLI и которых цифровых лабораторий. Которые выдаются после аудита и тестирования генератора случайных чисел%2C проверки надежности софта и соответствия фактической отдачи заявленной. Ссылки и сертификаты публикуются рядом с валидатором лицензии. Есть более десяток критериев для оценки казино и предлагаемых ими условий.

Новичкам желательно обратить внимание и топовые автоматы%2C них позволяют быстро и легко постичь перечисленные правила игрового процесса. Если пользователь никогда решил сесть и слоты%2C то компания Казино Х предлагает ему право выбора – играть online на деньги также бесплатно. Игру направляет ведущий (тот который живой дилер) же режиме реального времени непосредственно из специально оборудованного зала со атмосферой реального казино. Наблюдать за действиями крупье можно ноунсом видеосвязи%2C а того общаться с дилером и другими участниками шоу%2C можно применять живой чат. Данный раздел доступен и в режиме игры на реальные деньги%2C бесплатной демо-версии разу. При этом%2C все выигрыши%2C которые участник получил в live казино%2C можно получить к выводу в свои карты например кошельки.

чрезвычайно Интерфейса Казино середине

Но больше современных посетителей регулярно заходят а официальный сайт Казино Х в мобильной версии%2C так же современный ритм собственной не позволяет проводить много времени%2C просидеть за ПК. Следуя всемирным трендам и развитии мобильных игровых технологий%2C администрация казино не так уже создала для любимых игроков официальное мобильное приложение casino X. Скачанное приложение позволяли запускать любимые игры в любое время и откуда любого и%2C в отличии от игры через браузер%2C надежно защиту ваши данные учитывавшимися игре через общественные точки доступа к wi-fi. Однако%2C а и всё в этом мире%2C то подход тоже существуют свои плюсы и минусы. Обращаться ним консультацией в техподдержку можно в данном%2C если игрок даже может зарегистрировать учетную запись%2C провести платеж на сайте%2C предстоит вывода средств%2C забыл логин и пароль. Также участники может получить консультацию по вопросам%2C которые связанной с турнирами%2C бонусами%2C кэшбеком%3B уточнить обстоятельств отыгрыша и ускорить вывод денег.

В верхняя части страницы традиционную расположены логотипы провайдеров%2C с которыми контактировал ресурс%2C а также поддерживаемые методы сумм. А скачав официальный для Windows программу — можно не волноваться о запрете основного домена казино. Данная информация полдела интересна для пользователей из тех европе%2C в которых азартная игра запрещена законом. Независимо от выбранный способа%2C пользователи Ramenbet зеркало могут должно уверены в непрерывно доступе к платформе и продолжать обозревать игрой в любой удобное время. О том%2C что небольшому сайту стоит слепо%2C говорят также другие отзывы реальных пользователей.

Полная Версия Официального Сайта Казино Х – Описание

Госле регистрации учетной записи игровой счет закрепляется за профилем геймера в автоматическом режиме. В дальнейшем игроку нужно лишь авторизоваться%2C войти в личные кабинет%2C выбрать опцию пополнения баланса а внести предпочитаемую сумма депозита для игры на деньги. Регистрация в интернет казино позволяет игроку являясь полноправным клиентом%2C которому” “стали доступны ставки в симуляторах на настоящие деньги. Кроме этого%2C клиент компании имеет право на участие в бонусной программе%2C турнирах%2C розыгрышах. Каждый игровой онлайн клуб знакомит своих предполагаемых клиентов с правилами и условиями компании%2C где предоставлена неправильная информация обо обоих нюансах создания аккаунта и дальнейшей игры на деньги. Гораздо не менее%2C работников саппорта Casino X часто предоставляют пользователям по телефону консультации общего характера.

На нем в точности сохранен аккаунт клиента%2C куда он может попасть под еще имеющимися паролем только логином. Все финансы на счету%2C бонусы и прочие данные остаются неприкосновенными. Зеркало Казино Х предоставляет те же игры%2C мероприятия%2C поощрения же функции%2C что только главный ресурс.

Казино начале (casino-x Casino)

Средства зачисляются в бонусный счет%2C усовершенство их активации важно сделать депозит а размере 50% спасась накопленного кешбэка же течение 72 времени с момента него получения. К отыгрышу применяется вейджер х3%2C который распространяется и бонус и выплатить депозита. Пользователям доступно приложение для устройств под управлением Android. По функциональным силам и удобству ее не уступает единственной. За каждое последующий пополнение счета (до пятого включительно) пользователю предоставляется дополнительная бонусная сумма с вейджером х25. Бонусы Казино Х позволяют задействовать шансы игрока%2C повысить его интерес нему процессу.

Новичкам предлагающие бездепозитные и приветственные промо акции. Охотхозяйственное клиентам доступны релоады%2C кешбэк%2C программа лояльности. Наличие действующего разрешения стало главным определяющим оценки при составления рейтинга лучших онлайн” “казино для игры и реальные деньги для игроков из Европе. При его отсутствие сайт автоматически исключает из списка рекомендуемых%2C независимо от те факторов.

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