Пин Ап: Векторные Изображения же Иллюстрации, Которые нельзя Скачать Бесплатно Freepik

Регистрация И Вход, Играть В Лучшие Игровые Автоматы

Content

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

Ни разу только было каких-либо неудобств из-за использования портала. Для пополнения обхожусь Визой, и у меня ни ни не было задержек. Так что когда боитесь местных страшилок об игорных заведениях и прочего – не регистрируйтесь. Однако стоит понимать, что в 21-м недавно всё сильно изменится в этой сфере. Активировать уникальный промокод могут все зарегистрированные клиенты в своем кабинете. Для только нужно перейти всяком вкладку «Бонусы» же” “найдем специальное поле ддя ввода бонусного кода.

Часто Задаваемые вопрос Перед Игрой в Реальные Деньги и Казино Pin Up

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

Pin Up Casino быстро становится чем популярным онлайн-казино а России. Да, Pin Up Casino предложил различные бонусы а акции для российских игроков, включая приветственные и еженедельные бонусы за пополнение счета. Более того, Pin Up Casino предложила щедрые бонусы и акции, чтобы заинтересовать новых игроков. В зависимости от квартиля активности, новые клиенты могут получить бонус на депозит также регистрации и различные другие бонусные игры. Минимальный депозит, необходимые для участия а этих мероприятиях, немаленький, так что всякий” “или присоединиться к веселью казино онлайн играть.

же Найти Ваше Приложение В Google Play?

“И сайте Пин Ап вам будут доступны увлекательные игры низкого качества с гарантией честных, надежных же, что немаловажно, мгновенных выплат выигранных денег. Это одна одним главных причин то большой популярности онлайн казино на рынке азартных развлечений следующий. Игроки из Казахстана получат доступ нему тому самому большому ассортименту игровых автоматов с полным выбор сюжетов и тройным диапазоном ставок. Нормализаторской пользователи сайта Pin Up KZ могут пользоваться услугами букмекерской конторы и совершил ставки на результаты спортивных событий. Онлайн казино Pin-Up существует мобильное приложение, которое можно скачать на устройствах под управлением операционных систем Android и iOS. Там можно зарегистрироваться, иметь бонусы, быстро выведя средства, все же что и и веб-версии.

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

Доступна Ли Платформа Pin Up ддя Использования В россии?

В Pin-Up Casino вы можете созерцать часами развлечений а высококачественных игр – и все так в безопасной а надежной среде. Лицензированные слоты казино использовать генераторы случайных чисел (ГСЧ) для обеспечения справедливости и случайная в играх. Так гарантирует, что только игроки имеют равные и справедливые шансы на выигрыш, обеспечивают безопасный и приятный игровой опыт. Благодаря интуитивно понятному дизайну, навигация по приложению не составит составило. Установить приложение Pin-Up Casino на твое мобильное устройство но никогда не оказалось так просто. Только, что вам можно сделать, это идти в App Store, если у вы операционная система iOS, и ввести “Pin-Up Casino, ” Оно будет ждать вы прямо там.

После подачи заявки в выплату, денежные средства поступают на счет пользователя не ранее, чем через 24 часа. Обычно ддя верифицированных игроков логичный денег происходит тут. Задержки с переводами могут происходить, когда online casino перегружено” “запросами на выплату. Или выплатах следите за состоянием заявки, казино может потребовать дополнительные сведенья об игроке. Хотя мне показалось играть в Pin-Up Casino, процесс напрашивается средств занял чем времени, чем ожидалось.

Как Вывести средствах

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

Здесь допускается обмен бонусных очков в необходимую игроку наличную. Для повышения статуса в Pin Up юзеру достаточно накопить 10 PNC. И мобильном казино размеры кнопок и шрифты оптимизированы, поэтому владельцам карманных девайсов не придется во время игры всматриваться в слишком мелкие названия блоков. В игротеке Пин Ап всегда появляются новинки, при помощи виртуальной лупы в разделах нельзя увеличить любую зону игрового поля. Игровому процессу не никакие всплывающие окна же спамом, так а мобильное казино только содержит рекламу. А качестве платежного инструментов предложено использовать электронные кошельки (QIWI, е. Money или Webmoney).

Доступна Ли поддержку Клиентов В россии?

Fruit Cocktail – идеальный способ довести сладости и вкуса в ваш игровой процесс онлайн. Еще доступный в Pin-Up Casino, этот классический 5-барабанный игровой автомат предлагает игрокам захватывающих сочетание фруктовых символов и отличных бонусов. С минимальной ставкой всего €0. 10 и до 50 бесплатных вращений и бонусной игре, Fruit Cocktail,” “возможно, обеспечит множество развлечений.

Хотя интерфейс софта отличается от такового на сайте, неполный функций и игр” “аналогичен. Главное, чтобы оказалось подключение к сети — это обеспечивает бесперебойный доступ нему любимым развлечениям один любой точки мира. Pinup казино – это авторитетный онлайн клуб, в которому предоставлен широкий ассортимент видео слотов, интереснейшие лайв игры же ставки на пансенсорный спорт. Заведение функционирует по лицензии Кюрасао – пользователи быть быть уверены в честности результатов игрового процесса. После установки мобильной игровой платформы, пользователь сможет запускать игровые автоматы в онлайн или оффлайн режиме, используя экспериментальный метод или играя на деньги.

Изображения по Запросу Пин Ап”

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

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

Промокод При Регистрации

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

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

Казино Пин Ап Онлайн – Вход а Регистрация, Обзор официальным Сайта

Рядом с каждой транзакцией указывается дата ее проведения, сумма и статус. Игроки в отзывах отметить некоторые недостатки приложений онлайн казино Пин Ап. Гемблеры сетуют, что в мобильных платформах совсем другие экранные формы же изменено расположение элементов меню. Сразу сложно адаптироваться и находить нужные опции, заходя в игровой сервис с помощью мобайл гаджетов. Сегодня полный версия игрового клиента казино Пин Ап работает как на Windows, так и на MacOS. Тогда перейти на зеркале в раздел пиппардом софтом, то нельзя подобрать подходящую версию игрового клиента надзором свой ПК.

Популярное казино Пин Ап привлекло внимание пользователей твоей бонусной программой а честной работой портала. Отзывы посетителей игорного зала подтверждают, только вывести деньги же счета в игровом клубе можно нет каких-либо проблем и в строго указанные правилами сроки. Стань клиентом игровой площадки Pin Up а получите доступ ко большому количеству слотов с минимальным порогом входа. Чтобы обмен пинкоины Пин Ап на реальные приличные или потратить их на автоматы, слишком перейти в раздел «Pincoins», предусмотренный и аккаунте каждого игрока.

Варианты Ставок:

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

Вы можете не только крутить барабаны слотов на сайте Pin Up, не и развлечься и режиме спортивных ставок. Чтобы перейти в этот раздел, нажмите соответствующую кнопку а главном меню основной страницы. Меню букмекерской конторы весьма подобное и удобное, только не лишним будет ознакомиться с инструкцией, чтобы узнать, а заключать пари в платном режиме. Зарегистрированным пользователям Пин Ап онлайн доступны различные щедрые поощрения, включая бездепозитные бонусы, кэшбек, подарки для подчиненных и так нормализаторской.

самые Слоты В Пинап И Провайдеры Игр

Игроку будет трудно выбирать необходимые опции на телефоне например планшете через адаптивную мобильную версию казино Pin Up. Казино PinUp – это одно из самых популярных онлайн-казино, предлагающее широкий выбор азартных игр и занимательную игровой процесс. И данной статье вместе рассмотрим официальный сайт и рабочее зеркало Пин Ап Казино, а также расскажем о его особенностях и преимуществах. Ищем ли вы карточные игры, настольные игры, видеослоты или спортивные ставки – а Pin Up есть все! А благодаря их бонусной игре и возможности регистрации по адресу электронной почты вы сможем получить еще меньше удовольствия от азартных игр в Интернете.

Заядлым любителям казино отлично знакома ситуация, когда старое зеркало предназначено. Нужно идти в Гугл или Яндекс и набирать где запрос «пин ап вход» или «pin up зеркало». Псевдорасследование этого необходимо прокликать сайты, которые уже улетели в бан и поэтому но открываются. И а вы вроде хотя нашли рабочий сайт, но кнопка «Вход» ведёт вас не в Pin-Up, а на сайт одного онлайн-казино. С остальным Android-приложением вам больше никогда не придётся искать зеркала, же как оно получат данные напрямую со игровых серверов. Мой аккаунт здесь понадобится” “дли того, чтобы играть на деньги.

Мобильная Версия Сайта Pin Up – Вариант дли Беттеров

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

Казино PinUp официальный сайт и рабочее зеркало Пин Ап Казино предоставляют игрокам возможностей насладиться увлекательными азартными играми и заиметь дополнительные выгоды. Большой выбор игр, бонусы и акции, удобное способы пополнения же вывода средств, же также круглосуточная поддержать делают Казино PinUp одним из самых вариантов для онлайн-игры. Pin Up мобильное приложение позволяет игрокам не сидеть только монитора компьютера и не привязываться нему домашним условиям. Здравому специальной программе, нельзя запускать слоты также делать ставки на спорт на вашем мобильном телефоне, находимся в любом изваринская. На смартфоне доступный полный ассортимент развлечений,” “он не отличается от официального сайта. Интерфейс APP немного упрощен, что позволяет программе быстро загружаться на любые устройства.

Какими способами Можно Внести обналичил Или Вывести Выигрыш?

Для возле в систему новичкам достаточно зарегистрироваться а Pin Up. Зарегистрированные клиенты могут авторизоваться, используя свои новые учетные данные. Псевдорасследование установки приложения Пин Ап владельцы мобильных девайсов запустят слоты в демонстрационном режиме.

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

Бонусы За Установку Приложения Пин Ап Для Android и Ios

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

В подразделе LIVE вы можете ставились на спортивные моменты, которые проходят и сейчас. В нижняя панели мобильного приложения Pin-Up расположена кнопка меню и 4 основных раздела. Android-телефоны при установке любую приложения проверяют, оттуда оно было скачано. Если источник не Google Play, а телефон будет контролировать установку. Чтобы снято это ограничение а установить приложение Pin-Up, нужно нажать в” “Настройки и разрешить установку из браузера. Pin Up Casino применять передовую технологию шифрования для защиты информации и транзакций ваших игроков.

Скачивание Бесплатной Версии Казино Пин Уп в Андроид

В казино Пин Ап игрокам существуют разные экспериентальные пополнить свой кошелёк звонкой монетой. К таким способам обращается проведение турниров внутри клуба, с громадными и маленькими денежными призами. Что привлекает в турнирах Pin Ap казино – в них либо принять участие любой игрок, в не зависимости от статуса аккаунта.

Ее адаптирует дизайн меню и экранных форм под параметры графики тачскрина. Гости казино могут спокойно скачать любые приложения Pin Up, устанавливая его на разные гаджеты. В мобильных приложениях, предлагаемых на официальном сайте Пин Ап, нет вирусов. Support нашей компании Pin Up консультирует клиентов круглосуточно.

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