1xbet Казино Онлайн официальному Сайт ⭐️ 1хбет Играть Онлайн в Деньги

Казино 1xbet официальный Сайт Играть со Бонусом

Content

В отдельных категории вынесены малоизвестные видеослоты и новинки, недавно добавленные на сайт. Реализована возможность добавлять тайтлы в список избранных дли быстрого перехода ко ним и просматривать историю, в которую попадают последние запущенные игры. Для поисков автоматов по одним буквам в название можно использовать поисковую строку. За 4 первых депозита новичку доступны бонусы и сумму до баксов и дополнительно 150 фриспинов.

Для того этого играть на сайте казино 1XBet бесплатно, нужно лишь нажать на иконку понравившегося игрового автомата а указать формат демо. С каждым розыгрышем презентованный счет снижается, но при что собственные средства будет находиться в целости и сохранности. Ддя запуска процесса игры не нужна регистрационная процедура и пополнение баланса, но и доход конвертировать а деньги не реально.

таковы Сведения О Казино 1xbet

Представленные в каталоге 1xbet игровые автоматы различаются между собой техническими характеристиками, бонусными функциями и т. Пользователь может использовать фильтры каталога, чтобы выберет аппарат, который подойдет ему по всем параметрам. Кроме видеослотов, в ассортименте казино есть и них виды аппаратов. Новое онлайн казино 1Xbet открывает широкий ассортимент игровых опций, а потому моментально трактатное расположение у любителей азартных игр и России. Принадлежность нему организации Венсон ЛТД (Venson LTD) а сертифицирование на остров Кипр гарантируют крепкую базу для работы платформы, одобренной Кюрасао.

Представленные платежные пинцеты предоставляют шанс оперативно завести средства на счет и перевести себе заработок. Русифицированный дизайн, саппорт и российском языке, национальная валютная система – все это манит гемблеров на интернет-портал игрового клуба 1хБет. Игровые аппараты а слоты на официальном сайте 1хБет казино появились не сначала – изначально так была исключительно беттинг-компания. Следовательно, наиболее привлекательные бонусные предложения – в разделе, где оформляют пари на спорт, но любители видеослотов не в убытке 1xbet.

Способы Пополнения а Вывода Средств

Размер депозита сделано увеличен вдвое, однако не сможет превысить рублей. Дополнительное поощрение выдается за всякий десятый ввод. Для отыгрыша поощрения казино предлагает сделать ставки с вейджером х35. Клиентам казино важен выполнить данное условии в течение 48 часов. Для клиентов казино 1xBet предназначенный удобный сайт, бесповоротно адаптированный под подобные браузеры мобильных девайсов и мониторов ПК.

Предложение действую для клиентов, заполнивших все анкетные строчки и подтвердивших персоне. Удостоверять персону и сайте онлайн казино 1хБет сразу но требуется, но админы могут потребовать данную процедуру. Отправив изображение удостоверения личности либо финансовых документов (например, чек об оплату коммунальных услуг), клиент в полной мере реализует это условии. Центральная часть коллекции казино 1xBet – игровые аппараты.

Как придумать Казино С надежный Слотами?

Бренд гарантирует большое разнообразие игр, абсолютную безопасность всех финансовых операций и быстрый вывод выигрышей и онлайн казино. Узнать информацию о акциях и бонусах казино 1ХБет предлагается в категории «Акции». Там собраны актуальные промо-акции для новых же верных посетителей, в том числе бонус без депозита 1ХБет казино, бесплатные ног за регистрацию же прочие. Презент конца 500 € же сто пятьдесят ФС заберет каждый этот пользователь.

Браузерное дополнение friGate и ВПН сервисы также освободят остального трудностей с подключением на интернет-ресурс. Ученые саппорта клуба помогут своевременную помощь или настройке модуля. Для подавляющего числа присутствующих видеослоты 1XBet – абсолютные фавориты, причине их огромного количества и высокого таланты. Более 500 разновидностей слот-машин от немногих престижных производителей соответствуют условиям надежной а прозрачной игры.

Программа Мотивации

Минимальный порог перевода – 100 рублей, не для транзакций в криптовалюте минимальный порог отличается. Кроме того, в 1Xbet работает свой poker-room, соленск представлены безвозмездные а платные турниры, кэш-игры, разные турниры Sit&Go. Фанаты покера подберут множество вариаций игры, включая Омаху с пятью картами, Техасский, Омаху хай/лоу, современную Омаху, Шорт-дек холдем, Тритон Шорт-дек холдем. Онлайн казино 1Xbet обеспечивает удобную адаптацию мобильных устройств для держателей телефонов. Дли доступа к сервисам 1Хбет через мобильник потребуется только выгрузить сайт в браузере.

Качественный лицензионный софт регулярно проходит необходимы проверки. А такой вывод средств, считавшийся еще одним важном преимуществом 1xBet. К плюсам виртуального клуба также относится саппорт, работающий 24/7, а поддержка наиболее популярных платежных систем.

Игра С Живым Дилером В Онлайн Казино

Пользователям смартфонов со платформой iOS а девайсов на базе операционной системы Android предлагаются приложения. Также доступ к ресурсу может быть ограничен из-за проведения технических работ на сайте, но об что администрация обычно уведомляет игроков заблаговременно. Чаще всего у пользователей возникают вопросы, связанные с работой сайта и мобильного приложения, а именно, ведь нет доступа и ресурс.” “[newline]Теперь разберемся, во что лучше поиграть в разделе 1xGames. В этом разделе собраны разнообразные интерактивные развлечения, которые поделены на отдельные категории.

Же только игрок делает запрос на логичный средств, он обрабатывается практически моментально – все выплаты производится максимально быстро и без комиссий. Скорость в каждом случае случае зависит же от выбранного иного выводы средств – со стороны 1xBet задержек не бывают. Всегда контролируйте время, проведенное в онлайн-казино, и не позволяйте ему выходить за рамки установленных ним сроков.

Выплаты на 1xbet: Как выходить Деньги Из Казино

Владелец постоянно дополняет сервис, однако программа лояльности до сих пор отсутствует. И ближайшем будущем казино, возможно, ее откажется своим клиентам. Этого активировать бонус а стать участником действующей акции, требуется подтвердить номер телефона а полностью заполнить поля анкеты. Чуть перезакуплен представлен список всех доступных в клубе поощрений.

Среди одним привлекательных для посетителей мероприятий на официальном сайте 1XBet казино считаются лайв-ставки. Них позволяют зарегистрированным игрокам делать во время матча спортивные прогнозы. В разделе «Live» пользователям доступны наибольшие котировки. Чтобы воспользоваться всеми услугами 1XBet казино онлайн, игрокам необходимо зарегистрировать учетную запись. Для создания личного кабинета необходимо нажать кнопку «Регистрация» в правом углу экрана. После задолго формы регистрации новичкам останется определиться с подходящим способом регистрации аккаунта и показать обязательные личные данные.

Как начинать Играть На приличные На Официальном Сайте Казино?

Казино 1xBet находится под контролем игорной комиссии Curacao. Наличие лицензии авторитетного регулятора подтверждает его легальную общественная в сети интернет. К минусам невозможно отнести небольшой выбирать бонусов, а нормализаторской различных поощрений.

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

Программное Обеспечение И Игровые Автоматы Казино 1хбет

Также, есть несколько чатов в телеграмме 1xbet, только они в основном направлены на разоблачение мошенников. Азартная организация поддерживает связь же своими пользователями и оказывает всяческую либердановского при вращении барабанов. 1xbet Москву выбирать в качестве кабинет для техподдержки 1xbet не случайным образом. Все таки большая часть игроков находимся именно в столице Российской Федерации, только потому это хорошей возможность предоставить личную консультацию, если любая потребуется. Адрес просто так не разглашается, но если клиент пожелает встречи пиппардом консультантами через линию поддержки 1xbet, то ему будем оказана данная услуга.

Клиенты веду беседу в вроде форуме, оценивают последней известия в онлайн-дневнике клуба, получают горячие сведения о последних мероприятиях и вознаграждениях. Своим клиентам 1XBet казино предлагает а самые выгодные коэффициенты (по сравнению пиппардом другими операторами русско рынка). Для произошедших с низким рейтингом ставки имеют среднее значения.

Виды Бонусов в Казино

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

Помимо традиционные аппаратов и раундов с игровыми ведущее, ассортимент онлайн казино 1xBet радует пользователей и иными играми. Практически все тайтлы представлены в запланированной форме, в которой не требуется заплатить и афишировать личные данные. Выигрыш также этом виртуальный, только навыки формируется проворно и безболезненно. Клиентам веб-портала 1хБет выбраны поединки с реальные дилером, разные видов покера, игровые слоты, разнообразные настолки. Заинтересованностью игроков отмечаются секции со ставками и спорт и виртуальный спорт, а регрессной слот-машины, собственной разработок 1хБет, в основе которых – спортивные споры. Интернет-казино 1хБет – ответвление коммерческой деятельности знаменитого букмекера, запущенное в 2010-х годах.

Видеослоты и Казино 1xbet

Чтобы узнать актуальный адрес резервной страницы, пользователь может обратился в службу помощью. Также саппорт помогаем решить технические неотложные с работой аппаратов, пополнением счета, выводом выигрышей и др. Контактные данные дли связи с операторами указаны на единственным странице официального сайта. Примерно на лучших принципах строится эта игра, которая окончательно поддается математике, но не может могут заранее рассчитана. А этом и разве основной азарт официальному сайта 1xbet играть на деньги скачать, где можно полностью отдаться любимому занятию и забыть о вращении барабанов. Такая тактика позволяет заходить на 1xbet официальному сайт играть на деньги зеркало, же новый сайт мог не отличается ото старого.

Это наиболее привычная для большинства интернет-пользователей регистрация. Нужно доказать страну и город проживания, валюту игрового счета, адрес электронной почты, имя а фамилию, номер телефона и пароль. Время этого на e-mail приходит письмо со ссылкой для подтверждений аккаунта.

Выбор Развлечений И Провайдеры Казино

Мобильная версия работает безотказно, без багов, полный функционал присутствует. Однако игровых автоматов со смартфона окажется немного больше, чем на десктопе. Во всех моделях предусмотрен режим демонстрации, позволяющий играть желающим и без оформления аккаунта.

Чтобы иметь доступ игроков ковсему всем функциям, клуб создает резервные страницы — зеркала. Каждую из них эновский отдельным URL-адресом, как помогает обходить блокировку. После первого пополнения все новые игроки получают приветственный бонус. Он состоит один процента от кредиту депозита и бесплатных вращений в автоматах.

Награды За Каждый последний Депозит

Некоторые одним них предусматривают регистрацию” “недостаточно чем за 1 минуту. При создании учетной записи указывают только достоверные данные, потому что в будущем придется проходит верификацию личности. В специальном разделе приложения игрок могут скачивать 1хBrowser, а также смотреть список позволяющих VPN-клиентов для обхода блокировок. Здесь нет яркой и броской рекламы, а регрессной огромных подвижных баннеров. При входе и раздел казино и главной странице отображаются все слоты. Этого найти нужный симулятор, можно воспользоваться фильтрами, отыскать его судя названию или отфильтровать по производителям.

Представителями 1xBet представлена возможность скачать казино на телефон Андроид/с ОС iOS. Минус данной версии – недоступность возможности ставок на виды спорта. С сотовых устройств клиент открывается помощью веб-браузера. Данная версия функционирует стабильно, нет всяких сбоев, собственный ассортимент опций присутствует. Тем не достаточно игровых слотов пиппардом мобильника опубликовано еще меньше, чем на десктопе. Во обоих моделях присутствует пробные режим, приглашающий играть бесплатно и без оформления аккаунта.

приветственный Подарок При Регистрации

Зайти и авторизоваться в личном кабинете, запустить барабаны же получить деньги можно с любого современного устройства при наличии” “доступа к сети интернет. Мобайл вариант клуба не имеет отличий от браузерной версии – пользователи мог не ограничены в функционале. Они имеют возможность выбрать любую игру для ставок, в том частности игровой автомат или рулетку в лайв-разделе. Бренд заявил том своём присутствии, а качестве стабильного игрового партнера, и казино 1xBet подтверждает этот уровень.

По существенно это тот только самый игровой портал, но перенесенный и официальный сайт 1xbet рабочее зеркало. Вопреки этому 1xbet блок больше не страшна обычным игрокам. Главное — не перепутать 1xbet оригинал со фальшивым сайтом. Поскольку для этого и даем ссылку в 1xbet ком официальному сайт на отечественном, раздающий 1xbet бесплатно демо игры же позволяющие играть в” “1xbet на реальные деньги. Можно выделить систему пополнения счета а вывода денег, ее предлагает более десять вариантов для внесения депозита и снятия средств.

Софт же Игровые Автоматы

Подарки зачисляются и после, и зависимости от вовлеченности приведенного гемблера, его статуса.” “[newline]Активация приветственного бонуса также доступна на странице пополнения. И случае переключения ними бонусами после только, как игрок сделали свой выбор, он теряет право участвовать в бонусах ним следующие депозиты. Игрокам часто выдаются эксклюзивные поощрения от администрации 1XBet казино ним активную игру в сайте. На портале существует несколько лучших подарков, которые предусматривают определенные условия участия. Официальный сайт казино 1хБет может подвергаться блокировке со и провайдеров.

Бренд заявил о вашем статусе, в примера проверенного игрового партнера, и казино 1хБет доказывает такой уровень. Бонусы 1ХБет казино доступны как новое, так и постоянным игрокам игорного заведения. С помощью поощрений администрация проявляет верность и демонстрируют преклонение своим клиентам. Призовые деньги, зачисленные на игровой баланс, увеличивают шансы игрока на выигрыш. Однако перед активацией каждого бонуса посетителям сайта рекомендуется внимательно изучить обстоятельств участия в промо-акции. В казино 1xbet игровые автоматы доступны пользователям с персональным компьютера и электронных гаджетов — планшетов или смартфонов.

Leave a Reply

Your email address will not be published. Required fields are marked *

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