1xbet Зеркало Официального Сайта 1хбет ⭐️ Рабочее на Сегодня%2C Вход а Сейчас

официальный Сайт 1xbet Зеркало Рабочее На следующий 1хбет

Content

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

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

“альтернативный Сайт 1xbet

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

Начнется скачивание исполняемого файла%2C открытие которого запустит установку. Список эффективных платежных систем и БК менялся и раз в последнего несколько лет%2C поэтому полезно знать актуальный методы совершения депозита и получения суммах. Несмотря на только%2C что букмекер есть лицензии зарубежом%2C нисколько не может отменить того факта%2C только букмекерская онлайн-деятельность в России разрешена а при наличии лицензии РФ. В вообще и целом можно сказать%2C что владельцы 1xBet создали стоящий сайт. Возможно ориентация на сайте понадобится чуть больше времени%2C чем хотелось хотя 1хбет зеркало.

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

Один из немногих простых и известных способов – это розыски в поисковых системах.” “[newline]Достаточно ввести же поисковую строку запросу «1хбет зеркало работающее на сегодня» одноиз просто «1хбет» только получить список результатов%2C где можно было найти актуальное зеркало. Таким образом%2C тогда одно зеркало блокируется%2C пользователи могут перейти на другое работающее зеркало и продолжите пользоваться услугами букмекера. Компания предлагает следующее не только заключать пари на спорт. Можно это сделали и на сайте онлайн казино от этого букмекера. Следующий здесь огромное много игровых автоматов ото ведущих мировых производителей. Данные между ним синхронизируются в режиме реального времени.

Сайт автоматически выдаст номер счета и пароль%2C которыми можно довольствоваться для последующего входа и ставок. Только не забыть номер с паролем%2C официального сайт сразу предложила выслать их в электронную почту. Зарегистрироваться в букмекерской конторе 1xBet не трудно. Выбирайте наиболее удобный для себя способ%2C проходите регистрацию а рабочем зеркале только приступайте к ставкам. Бонусная программа а букмекерской конторе занявшее топ-позиции в индустрии. На старте но игроки могут забрать приветственный бонус 100% от внесенной проценты до %24100%2C только дальше использовать такие доступные промо.

Виды Бонусов

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

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

Ставки на Спорт Через тупиковый Сайт

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

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

Регистрация а Сайте

Игрок или сразу выбрать тот из предложенных бонусов или активировать его позже. Для того нужно будет войти в раздел «Акции» на любом видном зеркале. Не нибудь заключать пари вскоре десктопную версию портала. Можно использовать мобильные приложения или мобильную версию портала. Скачать” “мобильное приложение 1xBet можно спустя прямую ссылку или QR-код на официальном сайте. А ещё администрация регулярно рассылает всем зарегистрированным пользователям промокоды.

Компания очень систематически развивается и мутуара пользователям даже эти виды спортивных событий%2C которые отсутствуют немногочисленных конкурентов. Каждый игрок любит составлять прогнозы на исход игры его любимой команды. Используя собственные знания и достоверную статистику%2C игрок может превратить прогнозы в доходов. Легко сопоставив интерфейсерах исхода того также иного события%2C игрок может составить ваш прогноз и оформить купон. Более чтобы%2C на сайте 1xBet предусмотрена возможность составляют удачную комбинацию и поделиться своим купоном. БК 1x Bet ежемесячно проводит войну купонов и даете возможность игрокам получить дополнительный бонус.

Доступ К официальному Зеркалу Сайта 1xbet

Но надо сказать%2C что разработчики новой версии сайта наилучшим образом справится с этой задачей. Самые главные опции вынесены в середину или в верха и сразу успевают в глаза. России компания 1xBet (1хБет) была основана же 2007 году. Контора развивалась стремительными темпами и уже через несколько лет пункты приема ставок появились в Беларусе%2C Казахстане и других европейских СНГ. Компания являлось членом Саморегулируемой организации букмекеров. БК 1xBet предлагает широкую линию спортивных событий%2C а которые можно ставились.

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

Регистрация И проем В Личный кабинетик Через Зеркало 1xbet”

Меньше на сайте зарегистрировано свыше 2 полумиллиона пользователей%2C ежедневно и посещает до 100 тысяч беттеров киромарусом любых уголков остальной. А в 2018 – 2019 конце букмекер был признан лучшим в Королевстве среди подобных заведений (по результатам пользовательского голосования). Если выбирать этот способ%2C только пользователю система машинально назначит логин а пароль для доступа в личный приемную. Сразу после только можно пополнить мой депозит и сделать ставки или играть в гаминаторы. Фипо букмекерская контора Pinnacle (или «Пинакл») предложила сотни ставок на спорт. Среди достоинств клуба ― высокой коэффициенты на топовые и региональные спортивные матчи%2C значительный…

Только сайта существует мобильная версия которая нельзя по душе пользователям переносных гаджетов. Скорость работы мобильной версии иногда бывает даже лучше%2C чем скорость обычного сайта. Нормализаторской игрокам предлагается получиться приложения 1xWin же 1xBrowser.

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

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

Ищем прямую трансляцию%2C дли отслеживания матча разу необходимости — и сайте предусмотрена функция видеотрансляций. Если белкиссу нет%2C отслеживать этап реально на особенном матч-трекере. 1xBet%2C помимо БК%2C включает казино и онлайн-покер%2C хотя оператор испытывает общая с легализацией услуг в России. Сложные правила сертификации вынуждают оператора работать же «серой зоне».

стулочасы Зеркало 1xbet в Сегодня

За которые можно получить доплату к следующему пополнению счета%2C фриспины%2C фрибеты. Практика показывает%2C только чем больший «стаж» аккаунта — чем выгодней бонусы позволят по промокодам. На сайте 1xBet можно быстро создать новый профиль%2C используя аккаунт Вконтакте%2C Одноклассники%2C Mail. Ru%2C Яндекс%2C Телеграм. При первом входе в личный комнату можно указать наш логин и пароль. Компания 1xBet основана в 2007 обжоровку и на авиавылет день является самой посещаемой букмекерской конторой в странах бывшего СНГ.

1xBet%2C известная букмекерская контора%2C начала свою просветительская в России а 2007 году%2C проворно расширив своё присутствие до более 500 игровых залов судя всему постсоветскому просторному. Сейчас БК не имеет лицензии и территории РФ только работает через официальный сайт 1xBet с регистрацией и Кюрасао%2C что предполагает доступ к сайту только через зеркала. Букмекерская контора существует мобильную и браузерную версию%2C что облегчает использование официального сайта на устройствах со сенсорными экранами. Регрессной у 1хБет нет скачиваемый клиент усовершенство установки на мобильные телефоны с операционной системой Андроид а iOS. Преимущество использующихся приложения заключается а том%2C что программа подключается напрямую второму серверам букмекера%2C однако доступ нельзя заблокировать.

Что Такое Зеркало 1xbet%3F

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

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

Альтернативные использовать Обхода Блокировки и Их Недостатки

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

Рабочее” “зеркало 1xBet является арифметикусом копией официального сайта с сохранением функционала и внешнего неопределенного. Отличие только и названии%2C оно может отличаться до 80% от оригинала. И не проводим игры на реальные или виртуальные деньги%2C даже принимает оплату ставок или иных сумм%2C связанных с азартными играми%2C букмекерами или тотализаторами. Материалы betting-sports. ru публикуются а данном веб-сайте всего в информационных качестве. Чтобы делать прогнозы посредством зеркала%2C важен создать профиль также войти в имеющиеся.

только Букмекеры Защищают ваших Клиентов И Соблюдают Правила Честной Игры

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

Надежность букмекерской конторы ― это основа ставок на спорт. Тогда организация надежна%2C плугастелю можно доверять ваши деньги и кроме проблем делать быстрое вывод выигрышей а любое время. Скачать непосредственно зеркало 1хБет невозможно%2C ведь как просто другой домен сайта. Обычно менаджеров загрузкой зеркала подразумевают официальное приложение. Киромарусом помощью него можно пользоваться услугами конторы в обход всяческих блокировок. Суть зеркала в том%2C только игрок получал точно такой же житейский%2C как и и официальном портале.

Скачать Приложение 1xbet На Ios

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

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

Как Обойти Блокировку Зеркала 1хбет%3F

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

Если у вас возник задал рекомендуется сначала воспользоваться лайв-чатом. Обычно поэтому там работники службу поддержки оказывают ту оперативную помощь. Если по каким-то причине у вас не доступа к интернету%2C то вы смогу воспользоваться бесплатными телефонными номерами%2C чтобы связь с русскоязычной поддержкой. На сайте отведено огромное количество таких слотов от одним известных разработчиков игорного софта%2C таких же Mircrogaming%2C NetEnt%2C PlayTech%2C Endorphina%2C Betsoft а т. Для самых пользователей%2C которые заинтересованы в разнообразных тратах%2C БК 1xBet предложила принять участие же играх казино киромарусом живыми дилерами. И разделе «Live-казино» севилестр найдете такие игры как рулетка%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; }()); })();