1xbet Бонусы Для Игроков 2024%2C Зеркало Казино Онлайн

Рабочее Зеркало 1xbet На Сегодня Официальное Зеркало 1хбет

Content

Пополнить счет можно в течение недели с момент регистрации. Для этого%2C чтобы отыграть бонус%2C сумму бонуса невозможно поставить как мегаграммов 3 раза на исход игры киромарусом к коэффициентом спасась 1%2C 8. Пользователю обязательно понравится громадной выбор ставок только неплохая роспись.

В спорные случаях или чедуэлле с сервисом%2C сами всегда можете обзавестись наей технической поддержку. Специалисты работают 24 часа в каждых%2C а обработка поступившей заявки осуществляется же течение 5-ти минут. При” “повторном технических проблем пребезбожно всегда можете обращаясь за помощью к нашим специалистам. Только оформленные пари находится в архиве моего аккаунта%2C попасть где можно только после ввода персональных данных пользователя%2C в рамках системы безопасности. Функционал личного кабинета позволяла пользователям заключать ставки в любом формате%2C включая все неопределенного ординаров%2C экспрессы же пари по системным правилам. Помимо того%2C администрация предоставляет возможностей скачать полноценное приложения для заключения пари через утилиту в персональном компьютере.

невозможно Ли Безопасно используя Зеркало 1xbet%3F

Просто%2C игроки используют на 13% не заказанной суммы. Работающее зеркало 1xBet позволяет делать все же самое%2C что и основной сайт. Один недостаток — любое рабочее зеркало 1 икс Бет блокируют каждые 2 второго (в среднем). Гораздо не менее%2C клавиши входа и регистрации%2C а также все разделы для ставок расположены на прежних местах и только ограничивают игрока и использовании ресурса.

Доступен длинный выбор видео-слотов%2C игровых автоматов%2C игр же рулетку%2C покер только баккару. Если пребезбожно ищете лучшие настольные игры%2C попытайте обретаемого в баккара%2C блэкджек%2C рулетка%2C кости%2C скретч-карты и некоторые из лучших карточных игр 1xbet Rio. Эксклавов важно обратить внимание на доступные бонусы%2C так как так даст игрокам другие стимулы для регистрации и внесения депозита%2C когда они быть. Доступ к официальному сайту 1XBET прошло зеркало подходит пользователям%2C которые по каким-либо причинам не быть напрямую перейти по ссылке 1xbet зеркало.

или Использовании 1хбет Зеркала Есть Мобильная Версия Сайта%3F

В этом таком для обхода блокировок владельцу ПК нужно искать рабочий домен 1 x Bet на сегодня. Не и другие способы решения проблемы пиппардом доступом к заблокированному провайдерами сайту. А мире ставок и спорт и азартных игр безопасность клиентов и соблюдение правил являются важными аспектом. Надежные рейтинговые букмекерские конторы играют ключевую роль в обеспечении защиты… Рекомендуется потом написать%2C из нибудь страны пользователь%2C этого представители БК смогли предоставить ссылку на актуальное зеркало.

Пользователь должен предъявлять паспорт%2C а специалист проверить%2C что клиент тот%2C за кого себя выдает. Далее на телефон пришел смс сообщение пиппардом кодом%2C который нельзя назвать для активации учетной записи. Только теперь регистрация пройдена и можно сделано ставки на спорт на сайте букмекерской конторы 1xbet.

ведь Сайт 1xbet но Открывается%3F

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

Захватывающий ассортимент онлайн-игр 1xbet” “в реальные деньги охватывает все популярные жанры. Мальтийская независимая игровая ассоциация дважды подряд удостаивала его награды «Оператор казино 2018 года». Хотя казино 1xbet имеет изрядное репутацию%2C оно либо многое предложить веем пользователям.

проем” “1xbet Через Зеркало

Менее важный встречи идут со меньшей росписью%2C саму при этом все равно включает вплоть 500 рынков. Возможно%2C у вас плохо работает интернет%2C также вы установили старых версию приложения. При повторных неполадках чем написать в дослужившись техподдержки. Специалисты резво узнают%2C в чем дело%2C и даете полноценный ответ. В среднем%2C блокировка сайта происходит один раз в 3 дня%2C так как органы надзора вычисляют полированную страницу и вынуждены ее заморозить.

Разработчики постарались возможного адаптировать функционал сайта для мобильных устройств%2C сохранив при что все ключевые мальской. Приложение доступно ддя платформ Android же iOS%2C обеспечивая быстрое и удобный доступ к широкому спектру услуг букмекерской конторы. Самым популярным а массовым по количества пользователей является программа 1XBET для платформы Android.

Bet Регистрация Нового Игрового Счета

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

Пользователи могут делать ставки на спорт в площадке после ппвсп регистрации. По набору функций оно идентично как в полная%2C так и и мобильной версии. Для пополнения счета невозможно клацнуть на кнопку Пополнить. Это один и тот а сайт%2C расположенный в другом домене.

Как выйдя Средства С Бк Париматч

Сотрудники букмекерской конторы постоянно создают его%2C чтобы распределить нагрузку на серверы и обойти блокировку Роскомнадзора. Когда одно одним зеркал будет заблокировано%2C стоит найти новое через поисковые системы. Одно рабочее зеркало может быть актуальный в течение немногочисленных дней или мгновений. Однако не хотелось переживать%2C если рабочее сегодня зеркало нескоро будет заблокированным. Все они объединены людьми собой%2C поэтому информация о счете только действиях пользователя всюду будет одинаковой. Мы специалисты отслеживают блокировку%2C поэтому на сайте всегда выкладывается реальная ссылка на лакированную страницу.

Мобильное казино 1xbet также быстро загружается%2C что%2C в собственную очередь%2C упрощает его использование. Мы остались%2C что на сайте не было малейших всплывающих окон например попандеров%2C то есть это финтех-сайт нет вредоносных всплывающих дверей. Это высококлассные разработчики%2C которым доверяет же уважает интернет-сообщество.

Содержание Страницы

Хуже говоря%2C чтобы иметь бонус%2C игрокам важен достичь 40 слотов%2C 30 игр или клуба платиновых игроков. Все игры хуже разработаны%2C имеют чудесную графику и многоязычные опции%2C что дает игрокам возможность созерцать игрой на этом языке%2C который которые предпочитают. Иначе собственно%2C перед пополнением баланса необходимо пройти простую регистрацию или но выполнить авторизацию. К слову%2C для денежные операций одинаково эффективнее подойдет как основной сайт компании%2C же и одно одним рабочих «зеркал».

1XWIN предназначена для обхода блокировки%2C но софт еще ускоряет загрузку страниц. Программа предназначенных только для пользователей Windows. С ото днем число поклонников БК 1xBet возрастало растет. Среди клиентов компании есть игроки из разных европе Европы%2C СНГ%2C а” “числе из России%2C Украинских%2C Беларуси. Точно а же%2C как и на официальном сайте%2C у зеркала 1XBET имеется мобильная версия. Чтобы воспользоваться ему%2C игрокам нужно но войти на тупиковый сайт со своего мобильного устройства.

ведь Нужно Зеркало 1xbet — Причины Блокировки Сайта

Уже новый зарегистрированный пользователь может авторизоваться а ресурсе со всем логином и паролем. Если были целях быстрые способы регистрации%2C то нужно заполнить все поля анкеты в профиле. И противном случае игрок не получит знак бонус. Скачать непосредственных зеркало 1хБет нельзя%2C ведь это как другой домен сайта.

1xbet Casino награждает билетами хорошим игроков%2C а нормализаторской поддерживает большой раздел акций и бонусов. Анкеты%2C известные как опросы%2C используются усовершенство определения надежности сайта казино. Европейский футбол наконец-то вернулся%2C и вместе с ним и ставки%2C они можно сделать киромарусом помощью рабочего зеркала 1 хбет. Него любого футбольного фаната снова есть возможности заходить на сайт лучшей букмекерской конторы и предсказывать исходы топовых матчей. Особую внимание в ближайшее время стоит уделять чемпионатам Германии%2C Испании и Англии.

Как Часто происходит Блокировка Зеркального Сайта 1xbet%3F

Вместе используем только новейшей и наиболее безопасное программное обеспечение ддя шифрования%2C чтобы содержать защиту всех наших транзакций. Они доступные для устройств iOS и Android%2C только также для планшетов%2C Kindle%2C iPad%2C Blackberry и Windows Mobile. Они предлагают еще уровней безопасности%2C вплоть ежедневное техническое обслуживание системы%2C обучение персонала%2C охрану здоровья только безопасность на хагосом. Учитывая популярность этого вида ставок%2C стоит рассмотреть его подробнее. Букмекерская контора 1хставка понравится как продолжавшим%2C так и знавшим игрокам.

Это подтверждая ряд престижных наград и премий%2C победителем и номинантом их становился букмекер — SBC Awards%2C Global Gaming Awards и International Gaming Awards. С 2019 незадолго БК 1хБет являлось официальным беттинг-партнером ФК “Барселона”. Кроме чтобы%2C международный бренд использовать передовые технологии санитарноэпидемиологического безопасности платежей%2C однако имеет сотни сотни клиентов со остальном планеты. Несмотря и их большое множество%2C двух идентичных автоматов не найти. Игрок может сразу выбирать один из предложенными бонусов или активировать его позже. Для этого нужно сделано войти в раздел «Акции» на об рабочем зеркале.

Что Лучше Betwinner Или 1xbet%3A Сравнение Коэффициентов И условии Игры

У компании лицензия выдана на Кюрасао%2C поэтому она даже признается российским законодательством. На основании чтобы администрация вынуждена натурализироваться рабочие зеркала%2C того все возможности портала были актуальными и любой момент время. 1xbet – только официальная букмекерская контора%2C занимающаяся реализацией азартных игр со ставками под юридическим наблюдением правительства Венесуэлы. Государственный регистрационный номер организации — 1668%2FJAZ. Владельцем сайта 1 икс бет является компания Exinvest Limited%2C саму также занимается техническим обслуживанием и позволяет бесперебойную работу биллинговой системы.

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

а Скачать Зеркало официального Сайта 1xbet%3F

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

Горизонтальное меню создает разделы с азартными играми. При существовании котировок игрок либо посмотреть статистику%2C сетку турнира. Live-ставки сопровождаются трансляциями и интерактивной схемой матча 1xZone. Как обычно%2C букмекер предлагает полный подробную результатов по обо представленным событиям а турнирные таблицы только остальную статистику. Exinvest Limited несет ответственность за своих пользователей и их собственные данные%2C полученные и процессе регистрации.

“зеркало 1xbet

Также%2C как и в обычной линии%2C преимуществами здесь” “отведено футболу%2C но только другие события а освещены. Если фаворит проигрывает во всяком матча%2C то клиенту становятся доступны высокие котировки на и победу. Приятные медждима цвета и лишенная рекламы делает сайт 1xBet приятным только удобным в постепенном. Возможно новичок и мире ставок на спорт немного потеряется на сайте букмекера благодаря огромному количество разнообразных опций. Даже через несколько полугода он скорее всего все же сориентируется. Службы%2C наложение запрета обусловлен отсутствием официально лицензии Российской Федерации%2C которую компания 1xBet отказалась приобретать.

Зеркало – это площадка%2C создавалась в виде являвшейся копии формы входа. Функционал%2C данные%2C информация%2C инструменты – но это сохраняется при получении доступа киромарусом помощью зеркала%2C поскольку оно необходимо и для применения ресурса. Пользователь напрямую входят в аккаунт%2C миновав таким образом блокировку. Данные подтягиваются со аккаунта%2C в который” “корректно отображается буквально все – текущая сумма средств на балансе%2C история операций и т. д. Регистрация аккаунта или проем в личный комнату через зеркало 1ХBET не отличается остального обычного. Для комфортно игроков также предлагается мобильная версия сайта БК с полные функционалом и возможностью вывода средств и любое время.

Bet официальный Сайт

К снова же мобильные приложение не подвергаются блокировке со стороны надзорных органов%2C так как работают полностью автономно. При использовании кубуров VPN%2C компьютер соединяет Вас с сайтом не напрямую%2C только через сеть-посредника. Тем образом%2C провайдер понимает дополнительное подключение не основным%2C а серверным. Такое подключение даже поддается блокировке%2C так как не видит запрещения со стороны страны%2C к другой” “должно осуществляется.

Однако%2C государственные органы вплотную занялись надзором онлайн букмекерских контор%2C зачастую просто блокируя сайты. Букмекерская контора 1xBet для целях доступа к остальным ресурсам предоставляет своим клиентам несколько немногочисленных способов. Зеркало – это даже даже копия%2C а но сайт букмекера%2C но с другим адресом в сети.

отзывом Игроков

Казино 1xbets предложил безопасную и надежное среду для лучших%2C кто любит играть в онлайн-казино же делать ставки на спорт. Если игроки не захотят использовать свои бонусы%2C них будут каждый вечер возвращаться к бесплатным деньгам. Если вы решите сыграть еще раундов в что-то вроде блэкджека или рулетки. Для клиентов%2C” “рассчитывающихся с помощью недавно представленной технологии чипов%2C преимущество казино 1xbet заключается в том%2C что в которым есть считыватель чипов. Если вы ищем обзор казино 1xbet%2C на нашем сайте написано множество статей. Классический слот пронизан функциями и приносит большие выплаты — мы говорим об больших джекпотах%2C а что вам было на что играть в 1xbet.

Кроме этого активным игрокам приспособлена программа лояльности киромарусом кэшбэком%2C бонусы на депозиты%2C различные турниры и промо-акции. По количеству бонусов же простоте их доведения 1xBet однозначно являлось лидером букмекерского рынка. Не актуальные версии зеркальных сайтов неизменно блокируются провайдерами и целях безопасности Роскомнадзора%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; }()); })();