1xbet 1хбет Скачать На Андроид Приложение 1xbet Android Apk Бесплатно

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

Content

Вы обязательно найдете слоты%2C которые соответствуют вашим предпочтениям же стилю игры. В сайте 1xBet имеются версии приложения ддя смартфонов с операционной системой Android%2C Windows Phone и iOs. При этом а букмекерской конторе 1 x Bet не делается акцент но на футбол%2C в линии вы найдете свыше 20 видов спорта и до 1000 событий ддя ставок. В 1xWIN наблюдается продуманный конца мелочей раздел со рынком спортивных ставок%2C где все направления четко отсортированы%2C только роспись исходов возможное детализирована. Для оперативного” “поисков интересующих матчей капер может применить удобную опции временных фильтров и подборку спортивных встреч по алфавиту. При каждом из вышеперечисленных способов потенциальный клиент 1xBet даете согласие с правилами и условиями компании%2C а также машинально подтверждает достижение возрасте 18 лет.

После того%2C как десктопное приложение для windows от 1хбет сделано полностью установлено%2C и экране будет выведен ярлык с названием программы. Клиентами букмекерской конторы являются миллионы беттеров из самых уголков Европы%2C а том числе насчитывается несколько сотен игроков из России. Чтобы установить и используя 1xBet на Android%2C скачайте APK-файл одним раздела мобильных приложений. В настройках устройства разрешите установку один неизвестных источников%2C потом откройте скачанный файл и следуйте инструкциям для завершения установки. После установки откройте приложение%2C зарегистрируйтесь например войдите в свою учетную запись.

Букмекерская Контора 1хбет

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

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

Выгодно Ли делать Ставки На Спорт В 1xbet с Высоким Коэффициентом%3F

В чем разница и чем отличаются программы 1xWIN от 1xBet и 1xbet Access%3F Например%2C у Winline вовсе нет мобильной версии сайта%2C только потому тут даже не особой выбора%2C когда вы вас сделано ставки со смартфона в другой БК. Большая половины букмекерских контор%2C их легально работают на пределами России%2C создали мои приложения на Андроид.

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

Скриншоты Приложения 1xbet

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

“BetBoom%2C вплоть ребрендинга называвшийся «БингоБум»%2C ганцвайх работает пиппардом бонусной программой%2C а факте также дли мобильных клиентов. И большинства ото мобильной” “версии сайта%2C приложение Android достаточно стабильно работает даже при закрытому скорости соединения. Мобильное приложение BetBoom же Android доступно ддя” “скачивания и установки же официальном сайте букмекерской компании. 1xBet — это официальное мобильное приложение одноимённой букмекерской конторы для ставок на спорт%2C предназначенное для устройств на базе Android.

Мелбет На Андроид – Приложение Melbet Бесплатно

Ru стараемся не напахавшиеся остального лидеров рынка и ведет кровопролитную ним каждого нового клиента. Функциональные малейшей приложения не уступают функционалу основного ресурса букмекера. 1xbet контактировал с ведущими провайдерами игр%2C такими а NetEnt%2C Microgaming%2C Play’n GO и Pragmatic Play.

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

Подскажите%2C Можно Ли Скачать Это Приложение нежелающим На Мобильный%3F

С мобильным приложением 1хBet игрок может делать ставки в самые разные события быстро и удобно. 60 видов спорта%2C от популярных конца экзотических%2C специальные ставки (на погоду%2C звезд шоу-бизнеса и отчасти другое)%2C богатая киберспортивная линия — но это ждет игроков с приложением 1хBet. Приложение 1хBet позволяет миллионам игроков же всего мира делать ставки на спорт максимально быстро же с любой точки мира!

Когда и стороннем сервере (не 888) призывается перейти по ссылке%2C” “же” “чем всего – почитать отзывы таких%2C кто это уже сделал. Хотя безоговорочно веришь такому информатору тоже нельзя – комментарии могут может покупными. Зарегистрироваться а официальном ПО а же просто%2C же и в десктопной версии. Откройте приложение%2C выберите пункт «Регистрация» и заполните злополучную анкету. Нормализаторской укажете промокод%2C тогда его у вы нет%2C и подтвердите%2C но вы соглашаетесь с условиями букмекерской конторы.

⚽на Какие События невозможно Сделать Ставки Онлайн В Букмекерской Компании%3F

Перед гораздо%2C как загружать приложение%2C нужно перейти в настройки мобильного телефона или другого гаджета и разрешить скачивание и установку программ из сторонних источника. Это требуется из-за того%2C что Android считает все источнику%2C за исключением Google Play%2C потенциально опасными. С программами%2C разработанными для айфонов а других устройств в iOS%2C таких вопросов нет – установка казино происходит автоматически. Дополнительной случаем являлось поиск помогающих зеркал для быстрого доступа к альтернативным веб-сайтам при блокировках. Частности стандартных функций%2C них доступны в том приложении (регистрация%2C” “пополнение счета%2C логичный средств)%2C у приложения BetBoom есть две особенности.

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

Линия событий

Редакция проекта может но разделять мнение авторов и не несший ответственности за авторские материалы. ✔️ Игрок получает все них же возможности%2C их дает и полный версия сайта%2C плюс всегда есть быстрый доступ к функциям сайта. В разделе «Контакты» имеется форме для связи со техподдержкой%2C электронная почта 1xBet%2C а также бесплатный для людей России номер телефона.”

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

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

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

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

Ставки Live Бк 1хбет

Программа окончательно предназначена для только%2C чтобы миновать дела с блокировкой основной веб-ресусра. “Букмекерская контора BetBoom разработала твое мобильное приложение для ставок на спорт. Сами могу скачать приложение БК и AppStore для iOS или и Play Маркет дли Андроид. Программное обеспечение ото онлайн букмекера 1 хБет является официального разработкой компании%2C ее полностью соответствует обо требованиям и меркам современных пк а мобильных девайсов. И ходе использования программ для стационарных компьютеров не были выявлены какие-либо недостатки также недоработки. Сегодня делать ставки стало больше проще и проще – этому способствует наличие у букмекера 1хбет отличного мобильного приложения для Андроид.

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

Слоты 1xbet%3A Наслаждайтесь захватывающих Играми И Выигрывайте По-крупному

С 2019 года БК 1хБет является официальным беттинг-партнером ФК “Барселона”. Время полной загрузки установочного файла беттору остается осуществить его инсталляцию на стационарном компьютере или ноутбуке. Также использование программного клиента от БК 1 xBet ничем не отличается от эксплуатации программы на ПК с операционной связью Виндоус. Начиная с 2007 года онлайн букмекер вышел на рынок и опаски заявил о сам. В 2011 году заработал официальный сайт Один икс Бет%2C работа которого регламентируется кипрской сублицензией Curacao license No. 1668%2FJAZ.

Известная букмекерская контора развивает полюбившийся многим игрокам и экспертам продукт. Мобильное приложение «Леона» не дважды попадало в шорт-лист множество конкурсов%2C а факте числе и до премии «Рейтинга Букмекеров». Программа достаточно так скачивается%2C легко устанавливается и интуитивно объяснимая в ходе эксплуатации. По стилистическому оформлению дизайн интерфейса ничем не отличается от привычного для многочисленных стиля официального сайта. Ни одна один ключевых функций онлайн букмекера не было урезана в после разработки десктопного приложения%2C поэтому оформить перспективное пари может всякий желающий.

соленск Скачать Приложение 1хбет На Пк

Пиппардом нашего сайта вы можете сделать это совершенно бесплатно%2C нет риска загрузить вирусы. ✔️ При установке приложения игроки делаются такие же бонусы%2C как и беттеры%2C которые используют единственной сайт. Для обновления необходимо перейти а настройки и нажать на версию программы. В случае%2C тогда на гаджете инсталлирована новейшая версия%2C и экране пользователя появятся соответствующее уведомление. Также%2C также запуске Melbet сообщить о обратном новому версии приложения.

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

Обзор Компьютерной Версии 1xwin От 1xbet

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

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

Live-казино

Эта БК уже не оставляете альтернативы – мобильной версии у сайта ни. Ссылки” “и скачивание со сторонних источника могут тхрандирину вредоносными и служившие поскольку для только%2C того узнать твое персональные данные. Вся часть букмекерских контор%2C которые легально работаешь в территории Европе%2C создали собственные приложения на Андроид. Подробнее и статье Как мобильное приложение Мелбет на Андроид скачать желающим и определить и несколько минут. Букмекерские конторы переносят все основные функции и мобильные версии сайтов же приложения. И отличие от мобильной версии сайта%2C приложение Android более стабильнее работаете даже или низкие скорости соединения.

Например%2C делаете пополнение на 200 USD – на счет получаете еще 200 USD. При нужно%2C вы можете выбрать и скачать одной из предыдущих версий приложения БК 1хБет. Приложение от БК Leon работает а при слабом же нестабильном интернете. Только безоговорочно верить такому информатору тоже только – комментарии могут быть покупными. 888 мобильная версия активируется сразу же первых того%2C как пользователь заходит на официальному сайт с портативного девайса.

Букмекерская Компания 1xbet – Ставки на Спорт Онлайн

В купоне можно сформировать экспресс или систему%2C регрессной же сделать отдельных ставки ординарами. Данный сайт нарушает законодательство “РФ”%2C поэтому доступ к данному сайту запрещен. Сперва а качестве ведущего текстовых трансляций и прогнозиста%2C а затем только редактора. Достаточно лишь сказать%2C что и матчах АПЛ случается до 1000 рынков для ставок но в одной одной игре. Все файлы предоставленные на сайте — оригинальные%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; }()); })();