Казино 1xbet Играть Онлайн Бесплатно, Официальный Сайт, Скачать Клиент

Мобильные Онлайн Казино На кварплату Скачать Приложение и Телефон

Content

Некоторые игры (видеопокер, рулетки и др. ) требуют точного выбора определенных позиций. Пальцем на старинном тачскрине достаточно невозможно указывать нужные числа или игральные карты. Игроки в отзывах отмечают некоторые особенности приложений онлайн казино Пин Ап. Гемблеры сетуют, что и мобильных платформах вовсе другие экранные форме и изменено расположение элементов меню.

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

Бездепозитные Бонусы🎁 и Загрузку Мобайл Казино На Iphone например На Android

Игроку нужно определить клиент из прилавок, открыть его же авторизоваться. Далее появиться возможность запускать автоматы, пополнять” “счет, выводить деньги а осуществлять другие действий. На главной страничке Пин Уп севилестр найдете ссылку на версию для Андроид и на Айфон. Мобильная версия Пинап казино – зарегистрироваться с телефона а соц.

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

⚖преимущества И особенности Скачанной Версии

Если вы новичок в континенте онлайн-казино, прочитайте мы Руководство для подопечных и подробную инструкцию Как выбрать онлайн-казино. Дополненная реальность придает цифровые элементы а реальный мир. Нее способна сочетать элемент реальных казино со виртуальными, что сделано геймплей еще достаточно захватывающим, а игры — более интерактивными. Из-за низкой эффективности и ограниченной совместимости с мобильными устройствами со временем ее вытеснила технология HTML-5. Она более эффективная, плавная и совместимая с мобильными устройствами, поэтому сейчас HTML-5 используют для обоих современных онлайн-игр. Gods of Olympus — продукт совместной разработок 1x2gaming и Iron Dog Studio со 5 барабанами, 3 рядами символов и 20 выигрышными линиями.

“Разработчики предлагают игрокам скачать клиент казино 1xbet для ПК, только также мобильные приложения для Android и iOS. Для запуска игровых автоматов и смартфонах и планшетах предлагается использовать мобильную браузерную версию сайта. Она сделана слишком качественно и судя функционалу не уступает полноценной десктопной версии.

и Чем Причина Популярности Онлайн-слотов?

Наш сайт но проводит игр и деньги и несет в себе” “же информационный характер. Легзо казино оперирует менаджеров лицензией Кюрасао, что позволяет даже с минимальной суммы депозита стремиться к крупный выигрышам. На официальном сайте все сделки проходят честно, только деятельность клуба постоянно контролируется лицензирующим регулятором. Онлайн казино Пинап начало работать в 2016 году и за четыре незадолго администрация добавила а каталог азартных игр более 600 моделей.

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

О Казино

Познакомьтесь с Казино Kent, новой звездой среди игровых площадок в России. С минимальным депозитом всего 150 рублей и возможностью быстрых сумм от 700 копейки, Kent создаёт идеальные условия для игры. После завершения установки всех модулей и смартфон Андроид, мобильная версия игрового клиента обеспечивает в автономном режиме комфортный, полную доступ ко обо функциям казино. Такое казино в формате APK позволяет игрокам комфортно играть и деньги в игровые автоматы даже никаких подключения к интернету, но только в ознакомительном режиме. Времена, когда делать ставки в азартных играх онлайн можно выяснилось только с привязкой к стационарному устройству, остались в прошлом.

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

Виды Бесплатных Игр Казино На Казино Гуру

На этом любом нужно еще несколько подождать, после не установка будет произведена, и игрок мог смело запустить приложение на своем Айфоне. Если возникнет ошибка, что смартфон только может установить программу из неизвестного источник, то придется сначала правильно настроить телефон. Сегодня это делается с помощью дорогостоящего софта, который разрешает устанавливать приложение только только из App Store.

Если ваш прогноз оказался верным, то них сразу зачисляться в счет. Попробуйте как современное приложение для смартфонов прямо теперь и точно не пожалеете. Если севилестр хотите шанс выиграют реальные деньги и бесплатной игре, ознакомьтесь с нашим списком бездепозитных бонусов, окружении которых бесплатные приличные и фриспины. Них начисляются новым игрокам казино за создание аккаунта и позволяют выиграть реальные кварплату. Некоторые бесплатные игры казино доступны а для игроков одним определенных стран.

📲как Установить Приложение Казино На Телефон С Помощью Апк?

Один из немногих надежных способов — пробовать игры, их любят другие игроки. Их можно найду в разделе «Самые популярные игры» на этой странице. Чтобы гарантировать максимально высокой качество игрового сервиса, мы используем и” “этом приложении только сертифицированные оригинальные слоты от известных разработчиков.

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

Скачать Казино в Андроид – Играть В Мобильной Версии Онлайн

И приложении выйти и связь со службе поддержки можно будет через почту или написав в online-чат. Программы из подборки совместимы с другими устройствами и но нарушают их корректную работу. Если” “пользователи ищут сайты со быстрыми выплатами а небольшими комиссиями, стоило ознакомиться с рейтингом крипто казино. Редакция площадки Topkazinoonline. com составила подборку самых приложений казино. Как софт, который позволят проверенные операторы с лицензией, оригинальными играми и выгодными бонусами. Гости казино могут спокойно скачать подобные приложения Pin Up, устанавливая их и разные гаджеты.

Нет, в приложении любого онлайн казино можно применять аккаунт, который игрок создавал на официальном сайте. А них, кто хочет поиграть с друзьями бесплатно на мобильном могут скачать игровые автоматы и деньги, они получают полный доступ ковсему всем основным возможностям игрового клуба. Играть на реальные кварплату и делать ставки в мобильном приложении онлайн-казино можно как так же, же и во во игры в браузере. Помимо приложения и Айфон и Андроид, кторые отлично работаю на мобиле у лицензионного казино на кварплату, часто встречаются же игровые клиенты на ПК.

💸вывод Денег В Приложении

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

Для пользования услугами в таком формате достаточно скачать казино на деньги и Андроид или iOS. Редакция портала Topkazinoonline. com составила гайд для тех, кто привык посещать азартные площадки с ПК, но хотел но освоить и игру на портативных девайсах. В демонстрационном режиме доступны скачиваемые игровые автоматы Вулкан, рулетка и некоторые которых игры. Для только, чтобы поиграть в бесплатные развлечения, игрок получит неограниченное множество виртуальных кредитов.

Скачать Приложение Казино

Помимо приложения, онлайн казино джойказино имеет мобильную версию ддя использования через браузер смартфона или планшета. Новым пользователям необходимы предварительная регистрация с подтверждением правил казино. Регистрация доступна и официальном сайте joycasino. com или видном зеркале, а регрессной в приложении джой казино для мобильных устройств. Спустя несколько минут скачивание завершится, и программа привычно перейдет к установке.

Чтобы не попасть на удочку мошенников, внимательно изучайте казино. Для компьютеров и ноутбуков на ОС Windows скачать exe файлы невозможно с официальных сайтов казино в разделе «Download» или «Антиблокировка». К тому а, на оф сайте всегда доступна последней версия программы в русском языке.

Как происходило Скачивание Приложения Казино На Телефон?

Же новичкам, так а ветеранам онлайн-игр понравится широкий ассортимент предлагаемых бонусов. На первоначальный депозит предоставляется 100% бонус и конца 500 бесплатных вращений. При этом количество фриспинов напрямую зависимости от размера первоначальных взноса. О преимуществ игровых клиентах виртуальных игорных клубов, них можно скачать в” “телефон, говорилось уже но единожды. Стоит регрессной упомянуть и об некоторых их недостатках, ведь они есть, и даже несколько.

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

Безопасность Скачиваемых Приложений Pin Up

В каждом из них невозможно играть на приличные, однако для того придется зарегистрироваться и, скорее всего, разработать депозит. На этом сайте так вообще бесплатных игр, только в них стремительно запутаться. При стоунское фильтров и инструмент сортировки на одной странице можно проворно найти интересующие вы виды игр и темы. Как правило, на одну линию можно поставить от 0, 01 вплоть десятков евро, только эти настройки индивидуальны для каждого автомата.

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

Скачать Мобильную Версию Казино Pin Up и Телефон Андроид

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

С нашего сайта пользователи смогут самостоятельно, помощи торрент, скачать приложения казино на мобильные” “телефоны, работающие на Android или iOS. Ни необходимости тратить время на поиски необходимого софта в App Store или Play Market. Можно шустро и легко выгрузить казино в мобильные устройства с теми операционными системами, также, iOS, Android например Windows Phone. Остальные отдают предпочтение мобильному приложению, потому но оно обладает более высокой скоростью, меньше официальный сайт казино. Это обусловлено тем, что современные смартфоны предлагают достаточно высокие показатели мощности.

Какие Бонусы доступны В Мобильной Версии Сайта?

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

Как не очень удобнее, ведь азартных игр тысячи, и каждый искать и скачивать – проблемно а времязатратно. В игровых клубах пошли немного дальше и создали” “свой собственный софт, тот можно скачать бесплатно. Теперь, все ваши любимые слоты, покер, блэкджек, будут подгружаться через приложение же их не нельзя будет отдельно скачивать.

Скачанное Приложение На Андроид же Официальный Сайт: указанные Отличия

А правило, в приложение переносят абсолютно но модели и только те, которые быть не запуститься и телефоне специально надзором него адаптируют. Поиграть через приложение всякий сможет в то, что ему хотелось на сайте казино без ограничений. Игроки часто опасаются, но в приложении сделано урезаный функционал по сравнению с сайтом. А вот некоторые клубы имеют твои ограничения по количества доступных азартных игр. Но и а скачанных приложениях не всегда бывает недоступен раздела софта со живыми дилерами, даже если он имелась на веб-сайте.

Игровые автоматы надежные мобильных казино никогда” “доступную в пробном режиме. Для этого тапните на понравившейся игровой автомат, и найдите демо-режим. Приложение joycasino позволяет вносить обналичивать и выводить выигрыши через мобильный телефон после авторизации. Также в этом разделе представлены и автономные платформы интернет казино, которые можно загрузить на компьютеры с разными типами операционных систем. Неопытный пользователь сможет без труда установить их на свой компьютер например ноутбук.

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