“1xbet ᐉ Ставки а Спорт Онлайн ᐉ Букмекерская Контора 1хбет ᐉ 1xbet Com

Букмекерская Контора 1хбет 1xbet Регистрация%2C Бонусы%2C Вход На официальным Сайт

Content

Уведомление семряуи получении кода придет через СМС-сообщение и в личный кабинет. Например%2C на топовые футбольные события (еврокубки%2C крупные чемпионаты) маржа составляет около 5% до стартового свистка. Эта дает коэффициенты около 1. 9 в оба вплоть двух равносильных исходов (1Х%2F2Х%2C ТБ%2FТМ только так далее). Недостаточно кассовые матчи только чемпионаты котируются с маржой порядка 6-7%. Традиционно лучшие котировки идут на советские крупные лиги — NBA%2C NHL%2C MBL.

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

Что Такое Ставки Live%3F

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

Изначально игроки из Узбекистана скачивают с официального сайта оператора 1xBet мобильное ПО%2C которое работает по умолчанию а русском. Для поудобнее использования приложения тот беттер имеет чудесную возможность выбирать он язык%2C на который ему комфортно контролировать программой. В рабочем кабинете в меню настроек игрок может выбрать языковую стенную и перейти а режим работы софта на узбекском языке. Загружать фирменное мобильнее приложение” “остального онлайн оператора лучше на официальном сайте компании Один икс бет https://kimmeria.com/.

Bet — Скачать Приложение Для Android же Іos

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

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

Трансляции же Ставки 1xbet Live

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

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

Линия И Роспись 1 Х Бет

Наш портал стабильно работает а компьютерах%2C планшетах%2C ноутбуках%2C нетбуках и телефонах. Общее оформление строк остается неизменным%2C зависимости от устройства. В главной навигационной панели располагаются опции%2C их ведут к букмекерской конторе%2C разделу «Live»%2C различным продуктам%2C разделу «Promo» и разделу «Больше». Если сами наведете курсор а раздел «Больше»%2C вы сможете получить доступ к разделам веб-сайта «Результаты» и «Статистика».

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

💎в не Заключаются Преимущества Букмекерской Компании 1xbet%3F

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

Новые игроки могут приобрести прибавку в 100% к первому депозиту или фрибет. Тот день букмекер даете экспресс с повышенного коэффициентом. Кроме того активным игрокам предназначенная программа лояльности пиппардом кэшбэком%2C бонусы на депозиты%2C различные турниры и промо-акции.

На которые События Можно делается Ставки%3F

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

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

Пополнение Счета и Выведение Выигрышей и 1хбет

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

Приложение 1хBet позволяет десяткам игроков со всего мира делать ставки на спорт возможный быстро и со любой точки окружающего! Скачать 1xBet App можно как пользователям Android%2C так же владельцам устройств и iOS. ✔️ Же называется стандартная версия сайта БК%2C в который игрок заходит с ПК.

знак Бонус 1 Икс Бет

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

В разделе меню ЛК «Разное» беттер также может загрузить тотализатор%2C биржу ставок%2C бет-конструктор%2C составить индивидуальные настройки ддя оптимизации программы же управления учетной записью. Если игрок пожелает указать свой номер мобильного%2C то надо быстро зарегистрироваться таким «По телефону». Регрессной в анкете нужно отметить тип валюты для транзакций а игровом счету а стандартные поля активации промокода и иного стартового бонуса. Всегда многие беттеры задаю вопрос – невозможно ли скачать приложение от БК 1xBet на Google Play market. Недавно корпорация Гугл перестала предложит своим пользователям программное обеспечение%2C работа его связана с азартными играми. В отличие от App Store%2C такой контент считается неприемлемым политикой Гугл%2C потому ПО дли ставок в БК Один икс Бет найти не смогут.

есть Ли Возможность сделать Ставки В Режиме Live%3F

Самое главное преимущества ставок лайф — это возможность очень быстро сорвать внушительный куш. В разделе «Контакты» имеется формы для связи с техподдержкой%2C электронная почта 1xBet%2C а регрессной бесплатный для людей России номер телефона. Альтернативный вариант — 1xbet вход по номеру телефона%2C который подтверждается кодом из СМС. Материалы сайта предназначены для бипатрида старше 21 году (21 ). Участие в азартных играх может вызвать игровую зависимость. ✔️ Промокод необходимо использовать учитывавшимися регистрации на четвертом этапе и установить в необходимое поле.

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

“live-казино

Госле закачки приложения а телефон%2C установка произойти в автоматическом режиме. Фанаты оформлять ставки в режиме реальные времени могут проще запускать просмотр онлайн трансляций спортивных матчей при помощи указанных Андроид-приложения от БК 1 хбет. Дли этого вначале нельзя авторизоваться и перейти в раздел «Live»%2C после чего оператор предоставляет клавишу же значком «Play».

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

Промо предложениями И Бонусы Компании

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

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

Мнение Пользователей семряуи Бк Xbet

Чем выше показатель%2C тем больше либо выиграть пользователь. Это тотализатор с тремя спортивными событиями%2C они букмекер предлагает спрогнозировать. За 8 правильной ответов будет начислено 100 баллов%2C а 9 – 250%2C за 10 – 1000%2C за 11 – 5000%2C ним 12 – бонусных баллов. Ставки нельзя делать только киромарусом основного счета%2C промокод 1xBet в зачет не идет. И среду букмекер проводит” “сопряженную акцию со “Счастливой пятницей”.

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

💰как Можно заработать С 1xbet%3F Прогнозы На Спортивные кульминационные

Ото футбола%2C тенниса%2C хоккея до дартса%2C борьбы сумо и киберспорта — все виды соревнования будут доступной в линии букмекера. БК 1xBet было основана в 2007 году и ним прошедший период стала одним из активнейших букмекерского бизнеса первых всем мире. Так подтверждает ряд престижный наград и премий%2C победителем и номинантом которых становился букмекер — SBC Awards%2C Global Gaming Awards и International Gaming Awards. С 2019 года БК 1хБет является официальным беттинг-партнером ФК “Барселона”.

Нет необходимо долго думать а сомневаться%2C делайте ставки по ходу матча! Опытные беттеры на ставках live должно зарабатывать очень лучше%2C в то всяком как%2C новички%2C же правило%2C рассчитывают всего на собственное подфартило. Чтобы обезопасить себе от действий мошенников%2C пополнять депозит важнее только на 1xbet официальном сайте одноиз в приложении. Со стороны нашей компании никаких комиссий а платежи нет%2C но платежные сервисы клиента могут брать сумма. Как и пользователи приложения 1xBet Андроид%2C владельцы iOS-устройств должно зайти с мобильного телефона на сайт 1хBet%2C пролистать самого футера сайта же перейти в раздел “Мобильные приложения”.

Bet Apk – Скачать Приложение Для Андроид

В целом%2C только гаджет соответствует системным требованиям софта же ПО смартфона даже конфликтует с приложением%2C процесс установки прошло максимально просто же быстро. В немногих случаях пользователям рекомендуем в настройках телефона дать разрешение на установку программ ото неизвестных источников. В сайте 1xBet имеются версии приложения усовершенство смартфонов с операционной системой Android%2C Windows Phone и iOs.

Каждый утром букмекер случайным тем определяет 100 победителейю Их можно потратили на покупку бесплатных ставок%2C бесплатных прокруток и многое это. Топовый спортивный оператор Один” “икс Бет радует ваших поклонников щедрыми бонусными предложениями и акциям. Сегодня практически раз игрок понимает%2C не благодаря доступу второму интернету стало гораздо легче наблюдать а изменением фор только коэффициентов в кубуров. Контора обычно выводит деньги тем образом%2C каким пополняли. В конторе имеется 6 различных тотализаторов%2C от классической «пятнашки»%2C вплоть тотализатора на кибер-футбол. Джек-пот самого крупного тотализатора уже превысил 80 миллионов копеечки%2C пул же неизменно собирает 2-5 миллиона.

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