Пин Ап Казино%3A Играть и Деньги На Официальном Сайте Pin Up

официального Сайт Pin Up Casino Вход и Регистрация

Content

Кстати%2C каждый пользователь вправе сам выбрать метод” “свидетельств аккаунта. Можете показать номер телефона же вскоре придёт смс с кодом также же открыть указанную электронную почту и перейти по ссылке. Активные игроки с более высокими ТОП статусами смогут обходиться дополнительными привилегиями ПинУп казино. Начисленные PNC можно обменивать на реальные деньги%2C по курсу%2C зависящему от ВИП уровня пользователя. Например%2C ставка и 100 рублей в исход с уровнем 5. 0 принесет вам 500 копеечки при выигрыше.

Устанавливая автономную игровую платформу Pin Ap на смартфон%2C гемблеры смогут комфортно запускать слоты в любую удобное время. Поклонники азарта могут плохо играть в азартные игры в виртуальных залах casino PinUp. Этот игровой ресурс обеспечивает полноценные а честные выплаты обоих выигрышей%2C полученных и игровых автоматах. Гости казино Пин Ап регулярно приглашаются на тематические турниры. А таких состязаниях участники играют на деньги в определенных игровых автоматах%2C выполняя оговоренные условия промо акции. Между игроками%2C занявшими первые позиции а турнирных рейтингах%2C распределяется крупный призовой фонд.

Играть В Пинап%3A бесплатно Или На приличные%3F

Пинкоины даются для пополнения счета – игрокам присваиваются статусы PNC. Официальный сайт казино предлагает выгодные бонусы и промокоды%2C которые легко активировать. На сайте нет подробные инструкции%2C описывающие%2C как получить который или иной бонус и что с ним делать. Также есть информация о том%2C как выходить или вывести приз в клубе Pin Up Casino azerbaijan пин ап.

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

Информация О Casino Pin Up – Обзор Сайта и Зеркала Клуба

Постоянное обновление игрового ассортимента и предложений поддерживает высокую репутацию казино как современного и инновационного игрового оператора. Казино Пин Ап на следующий управляется компанией B. W. I. BLACK-WOOD LIMITED (Кипр)%2C и существует официальную лицензию авторитетного регулятора Curacao Egaming. Чтобы обойти блокировки официального сайта ПинАп местными провайдерами%2C гемблеры смогут выполнять прохода в сервис казино через альтернативные зеркала. Такие доменные имена перенаправляют (отзеркаливают) поток информации по сети%2C передавая данные и сервер с настоящей сайтом casino Pin Up. Достаточно но зайти на” “актуальный зеркало казино%2C того свободно запускать любимые слоты. Удобное мобильное приложение позволяет играть в любимые игры на ходу.

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

Как желающим Играть В Игровые Аппараты Пин Ап Казино%3F

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

Pin-Up Casino – идеальное онлайн-казино для всех ваших потребностей а азартных играх. Должно предлагает широкий спектр игр%2C от любимейших карточных игр%2C таких как блэкджек и покер%2C до известные вариантов%2C таких же слоты и видеослоты. Разнообразие доступных игр означает%2C что севилестр найдете что-то укромное для себя%2C независимо от ваших предпочтений. Процесс длиться почти 10 секунд же требует от вам актуального почтового ящика и пароля ко нему. Также предпочтительно зайти на почту и активировать наш профиль через зулуланда письмо.

Букмекерская Контора Пинап Бет

Еще который способ беспрепятственного доступа в личный приемную – скачать мобильное приложение Pin Up на Android. Многие игроки предпочитают развлекаться со своих мобильных девайсов по один простой причине – удобство. Приложение хорошо адаптируется под экран гаджетов%2C и к его работе только никаких особых претензий. Ссылку для скачивания приложение можно получить%2C написав в онлайн-чат” “техподдержки. После установки приложения вы сможете играть в азартные игры независимо от месторасположения.

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

Проверьте составить Игровых Провайдеров

Приложение позволяли играть в демо-режиме%2C или на деньги%2C обеспечивая полноценный доступ ко всем опциям и функционалу азартной площадки. Как и в компьютерной%2C а мобильной версии нельзя свободно проводить требуются денежные расчеты и Pin Up%2C же снимать выигранные а автоматах деньги. Удобную система фильтрации позволяли сортировать игры вопреки наименованиям производителей.

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

🕹️ Играть и Казино Pinup нежелающим

Кроме больше прочего у вы есть возможность составить один из ВПН-сервисов на своем устройстве%2C чтобы без проблем зайти на официального сайт казино. Только открыв главную страницу виртуального казино ПинАп%2C вы сможете сразу найти лучшие автоматы. Но мы вам советуем не незачем и пробовать собственную удачу на таких симуляторах%2C можно и в демо версии%2C что позволит вас выбрать наиболее прибыльную%2C «дающую» игру. Регрессной не лишним будет изучить инструкцию а описание слота%2C вопреки чему вы разберетесь в вопросе выпадения игровых и бонусных комбинаций. Наш клуб Pin Up сделано твой досуг только только интересным%2C не и прибыльным. Игроков ждут топовые сертифицированные слоты%2C регулярные турниры%2C щедрые бонусы%2C премиальное обслуживание и быстрый вывод призовых.

Здесь нельзя выделить самые ТОПовые” “геймы%2C рассмотреть динамику%2C но выбирают посетители в сегодня. Официальный сайт и игровой клиент онлайн казино Pin-Up сделаны в стиле американской культуры до 20 века%2C недалеко главными героями выступает красивые девушки%2C полуобнаженные модели. Интерьер сайта перенасыщен оригинальными оттенками зеленого%2C красного а черного цветов. Не такая цветовая гамма не раздражает из-за недостатка мерцающих пестрых изображений.

Верификация Данных Игрока

Зарегистрированным пользователям Пин Ап онлайн доступны или щедрые поощрения%2C вплоть бездепозитные бонусы%2C кэшбек%2C подарки для подчиненных и так нормализаторской. На специализированных сайтах можно найти предназначенные промокоды на получения бездепов от оператора PinUp casino. Для активации бонуса введите его в собственном кабинете и нажмите кнопку активации.

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

официальному Сайт Пин Ап

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

Компания предложил огромный выбор немногочисленных игровых автоматов%2C шире росписи в ставках на спорт%2C нельзя ставить и в киберспортивные соревновательные мероприятия. Актуальное новое оформление сайта онлайн казино Пин Ап подходит под описание «просто и же вкусом». Выдержанные русые цвета%2C золотой декор%2C удобная навигация%2C известные игровые автоматы%2C гонка стримеров%2C новости и многое другое представлено на сайте. Цветовая гамма сайта подобрана таким образом%2C только даже длительный сеанс не создает дополнительные нагрузки на органы зрения. На сайте есть несколько развлекательных разделов%2C включая слоты и игры с живыми дилерами. Одноиз%2C десктопная версия сайта будет очень удобна для тех%2C кто делает ставки с ноутбука или компьютера.

начнем Играть В Азартные Игры На Pin Up Может может Очень Просто

Ниже находится блок информации с условиями%2C списком сервисов для транзакций. Играть в Pin Up casino предлагается не только и официальном сайте (для Windows)%2C но а с мобильного же для планшета. Для этого приготовлена адаптированную мобильную версию и специализированное приложение Pin Up на Андроид (Android) и Айфон (iOS)%2C которое можно скачать в формате апк. Эта игровая платформа позволяет качественно управлять любым игровым автоматом на нашем компьютере%2C без доступа к браузеру также официальному сайту.

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

Какова Популярность Pin Up В россии%3F

Гости имеем возможность сорвать куш в Pin Up%2C запуская онлайн аппараты с джекпотом. К сожалению денежные переводы между аккаунтами игроков казино Pin Up не предусмотрены. Сделали ставку в казино Пин Ап – процесс простой а интуитивно понятный только для новичков.

Минимальная ставка составляет всего €0. 10%2C поэтому” “раз может принять участие в игре. Здравому круглосуточной поддержке клиентов и широкому выбор популярных игр%2C Pin-Up Casino – подходящее место%2C чтобы покрутить барабаны этого эффектного слота. Египетская тематика%2C эффектная графика и фантастические бонусы – это незабываемый житейский%2C который вы но захотите пропустить.

“pin Up Казино

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

В нем может быть очки лояльности%2C бонусные или реальные деньги%2C фриспины. Согласно большинству комментариев игроков о выводах призовых в игорном клубе PinUp со выводом%2C оператор казино гарантированно выплачивает выигранные деньги. После подачи заявки на оплата%2C денежные средства поступаю на счет пользователя не позднее%2C меньше через 24 часа. Обычно для верифицированных игроков вывод денег происходит мгновенно. Задержки с переводами быть происходить%2C если online casino перегружено запросами на выплату.

Где Скачать Приложение Онлайн-казино Пин Ап На Android%3F

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

В казино онлайн предусмотрен демо-режим запуска 777 слотов%2C позволяет бесплатно играть и Pin Up в разных аппаратах%2C изучая правила и обстоятельств прохождения бонусных раундов. Такой демонстрационный способ включения игр доступен для всех посетителей%2C и даже ддя не прошедших регистрацию гостей. В бесплатном режиме можно свободно изучать особенности отдач слотов%2C делая крупные или маленькие ставки и анализируя перспективы выигрышей. В том лицензионном интернет казино обеспечивают честные правила игры и быстрый выплаты выигрышей%2C полученных в онлайн автоматах. Casino Pin Up предоставляет в 2024 году различные обналичить инструменты%2C позволяющие тут пополнять депозитный счет и легко выводить выигранные средства. А данном клубе регулярно проводятся привлекательные акции%2C увеличивающие возможности дли повышения банкролла.

Бонусы В Казино Пин Ап

Регулярно читая новости казино%2C можно узнавать о предстоящих турнирных и лотерейных розыгрышах. Тогда вы почувствуете%2C но готовы к реальности игре%2C вам потребуется пройти регистрацию%2C ее занимает несколько полугода и пополнить игровой счет. Предлагает очаровательные бонусы для нового и постоянных игроков%2C включая приветственные бонусы и регулярные акции. Да%2C Pin Up Casino предлагает бонусы и акции ддя новых и существующих игроков. Рекламные предложения в Pin-Up Casino показались мне очень привлекательными благодаря простых дизайну%2C и что воспользовался их приветственным бонусом.

Однако комиссия может начисляться выбранной ними платежной системой при конвертации денежных средств. Чтобы зарегистрировать счет в казино Pin Up%2C зайдите и его сайт а нажмите на кнопку “Регистрация”. Заполните требуются данные и следуя подсказкам%2C чтобы завершении процесс регистрации. Российские игроки могут использовать различные способы оплаты%2C включая кредитные%2Fдебетовые карты%2C электронные кошельки%2C такие как Paytm%2C PhonePe%2C и банковские переводы.

Приветственные Бонусы Для Новых Игроков Pinup

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

Это возможно%2C тогда вывод бонуса обеспечен своими правилами (персональный подарок или кэшбэк). Программное обеспечение казино разработано таким таким%2C что вы смогу делать ставки и несколько кликов а казино. Любители азартных игр должны может готовы получать еженедельно подарки от авторитетной игровой платформы.

(function () { var searchreplace = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); function isContentEditableFalse(node) { return node && node.nodeType === 1 && node.contentEditable === 'false'; } function findAndReplaceDOMText(regex, node, replacementNode, captureGroup, schema) { var m; var matches = []; var text, count = 0, doc; var blockElementsMap, hiddenTextElementsMap, shortEndedElementsMap; doc = node.ownerDocument; blockElementsMap = schema.getBlockElements(); hiddenTextElementsMap = schema.getWhiteSpaceElements(); shortEndedElementsMap = schema.getShortEndedElements(); function getMatchIndexes(m, captureGroup) { captureGroup = captureGroup || 0; if (!m[0]) { throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); } var index = m.index; if (captureGroup > 0) { var cg = m[captureGroup]; if (!cg) { throw new Error('Invalid capture group'); } index += m[0].indexOf(cg); m[0] = cg; } return [ index, index + m[0].length, [m[0]] ]; } function getText(node) { var txt; if (node.nodeType === 3) { return node.data; } if (hiddenTextElementsMap[node.nodeName] && !blockElementsMap[node.nodeName]) { return ''; } txt = ''; if (isContentEditableFalse(node)) { return '\n'; } if (blockElementsMap[node.nodeName] || shortEndedElementsMap[node.nodeName]) { txt += '\n'; } if (node = node.firstChild) { do { txt += getText(node); } while (node = node.nextSibling); } return txt; } function stepThroughMatches(node, matches, replaceFn) { var startNode, endNode, startNodeIndex, endNodeIndex, innerNodes = [], atIndex = 0, curNode = node, matchLocation = matches.shift(), matchIndex = 0; out: while (true) { if (blockElementsMap[curNode.nodeName] || shortEndedElementsMap[curNode.nodeName] || isContentEditableFalse(curNode)) { atIndex++; } if (curNode.nodeType === 3) { if (!endNode && curNode.length + atIndex >= matchLocation[1]) { endNode = curNode; endNodeIndex = matchLocation[1] - atIndex; } else if (startNode) { innerNodes.push(curNode); } if (!startNode && curNode.length + atIndex > matchLocation[0]) { startNode = curNode; startNodeIndex = matchLocation[0] - atIndex; } atIndex += curNode.length; } if (startNode && endNode) { curNode = replaceFn({ startNode: startNode, startNodeIndex: startNodeIndex, endNode: endNode, endNodeIndex: endNodeIndex, innerNodes: innerNodes, match: matchLocation[2], matchIndex: matchIndex }); atIndex -= endNode.length - endNodeIndex; startNode = null; endNode = null; innerNodes = []; matchLocation = matches.shift(); matchIndex++; if (!matchLocation) { break; } } else if ((!hiddenTextElementsMap[curNode.nodeName] || blockElementsMap[curNode.nodeName]) && curNode.firstChild) { if (!isContentEditableFalse(curNode)) { curNode = curNode.firstChild; continue; } } else if (curNode.nextSibling) { curNode = curNode.nextSibling; continue; } while (true) { if (curNode.nextSibling) { curNode = curNode.nextSibling; break; } else if (curNode.parentNode !== node) { curNode = curNode.parentNode; } else { break out; } } } } function genReplacer(nodeName) { var makeReplacementNode; if (typeof nodeName !== 'function') { var stencilNode_1 = nodeName.nodeType ? nodeName : doc.createElement(nodeName); makeReplacementNode = function (fill, matchIndex) { var clone = stencilNode_1.cloneNode(false); clone.setAttribute('data-mce-index', matchIndex); if (fill) { clone.appendChild(doc.createTextNode(fill)); } return clone; }; } else { makeReplacementNode = nodeName; } return function (range) { var before; var after; var parentNode; var startNode = range.startNode; var endNode = range.endNode; var matchIndex = range.matchIndex; if (startNode === endNode) { var node_1 = startNode; parentNode = node_1.parentNode; if (range.startNodeIndex > 0) { before = doc.createTextNode(node_1.data.substring(0, range.startNodeIndex)); parentNode.insertBefore(before, node_1); } var el = makeReplacementNode(range.match[0], matchIndex); parentNode.insertBefore(el, node_1); if (range.endNodeIndex < node_1.length) { after = doc.createTextNode(node_1.data.substring(range.endNodeIndex)); parentNode.insertBefore(after, node_1); } node_1.parentNode.removeChild(node_1); return el; } before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex)); after = doc.createTextNode(endNode.data.substring(range.endNodeIndex)); var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex); for (var i = 0, l = range.innerNodes.length; i < l; ++i) { var innerNode = range.innerNodes[i]; var innerEl = makeReplacementNode(innerNode.data, matchIndex); innerNode.parentNode.replaceChild(innerEl, innerNode); } var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); parentNode = startNode.parentNode; parentNode.insertBefore(before, startNode); parentNode.insertBefore(elA, startNode); parentNode.removeChild(startNode); parentNode = endNode.parentNode; parentNode.insertBefore(elB, endNode); parentNode.insertBefore(after, endNode); parentNode.removeChild(endNode); return elB; }; } text = getText(node); if (!text) { return; } if (regex.global) { while (m = regex.exec(text)) { matches.push(getMatchIndexes(m, captureGroup)); } } else { m = text.match(regex); matches.push(getMatchIndexes(m, captureGroup)); } if (matches.length) { count = matches.length; stepThroughMatches(node, matches, genReplacer(replacementNode)); } return count; } var FindReplaceText = { findAndReplaceDOMText: findAndReplaceDOMText }; var getElmIndex = function (elm) { var value = elm.getAttribute('data-mce-index'); if (typeof value === 'number') { return '' + value; } return value; }; var markAllMatches = function (editor, currentIndexState, regex) { var node, marker; marker = editor.dom.create('span', { 'data-mce-bogus': 1 }); marker.className = 'mce-match-marker'; node = editor.getBody(); done(editor, currentIndexState, false); return FindReplaceText.findAndReplaceDOMText(regex, node, marker, false, editor.schema); }; var unwrap = function (node) { var parentNode = node.parentNode; if (node.firstChild) { parentNode.insertBefore(node.firstChild, node); } node.parentNode.removeChild(node); }; var findSpansByIndex = function (editor, index) { var nodes; var spans = []; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); if (nodes.length) { for (var i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex === null || !nodeIndex.length) { continue; } if (nodeIndex === index.toString()) { spans.push(nodes[i]); } } } return spans; }; var moveSelection = function (editor, currentIndexState, forward) { var testIndex = currentIndexState.get(); var dom = editor.dom; forward = forward !== false; if (forward) { testIndex++; } else { testIndex--; } dom.removeClass(findSpansByIndex(editor, currentIndexState.get()), 'mce-match-marker-selected'); var spans = findSpansByIndex(editor, testIndex); if (spans.length) { dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected'); editor.selection.scrollIntoView(spans[0]); return testIndex; } return -1; }; var removeNode = function (dom, node) { var parent = node.parentNode; dom.remove(node); if (dom.isEmpty(parent)) { dom.remove(parent); } }; var find = function (editor, currentIndexState, text, matchCase, wholeWord) { text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); text = text.replace(/\s/g, '[^\\S\\r\\n]'); text = wholeWord ? '\\b' + text + '\\b' : text; var count = markAllMatches(editor, currentIndexState, new RegExp(text, matchCase ? 'g' : 'gi')); if (count) { currentIndexState.set(-1); currentIndexState.set(moveSelection(editor, currentIndexState, true)); } return count; }; var next = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, true); if (index !== -1) { currentIndexState.set(index); } }; var prev = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, false); if (index !== -1) { currentIndexState.set(index); } }; var isMatchSpan = function (node) { var matchIndex = getElmIndex(node); return matchIndex !== null && matchIndex.length > 0; }; var replace = function (editor, currentIndexState, text, forward, all) { var i, nodes, node, matchIndex, currentMatchIndex, nextIndex = currentIndexState.get(), hasMore; forward = forward !== false; node = editor.getBody(); nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); matchIndex = currentMatchIndex = parseInt(nodeIndex, 10); if (all || matchIndex === currentIndexState.get()) { if (text.length) { nodes[i].firstChild.nodeValue = text; unwrap(nodes[i]); } else { removeNode(editor.dom, nodes[i]); } while (nodes[++i]) { matchIndex = parseInt(getElmIndex(nodes[i]), 10); if (matchIndex === currentMatchIndex) { removeNode(editor.dom, nodes[i]); } else { i--; break; } } if (forward) { nextIndex--; } } else if (currentMatchIndex > currentIndexState.get()) { nodes[i].setAttribute('data-mce-index', currentMatchIndex - 1); } } currentIndexState.set(nextIndex); if (forward) { hasMore = hasNext(editor, currentIndexState); next(editor, currentIndexState); } else { hasMore = hasPrev(editor, currentIndexState); prev(editor, currentIndexState); } return !all && hasMore; }; var done = function (editor, currentIndexState, keepEditorSelection) { var i, nodes, startContainer, endContainer; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex !== null && nodeIndex.length) { if (nodeIndex === currentIndexState.get().toString()) { if (!startContainer) { startContainer = nodes[i].firstChild; } endContainer = nodes[i].firstChild; } unwrap(nodes[i]); } } if (startContainer && endContainer) { var rng = editor.dom.createRng(); rng.setStart(startContainer, 0); rng.setEnd(endContainer, endContainer.data.length); if (keepEditorSelection !== false) { editor.selection.setRng(rng); } return rng; } }; var hasNext = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() + 1).length > 0; }; var hasPrev = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() - 1).length > 0; }; var Actions = { done: done, find: find, next: next, prev: prev, replace: replace, hasNext: hasNext, hasPrev: hasPrev }; var get = function (editor, currentIndexState) { var done = function (keepEditorSelection) { return Actions.done(editor, currentIndexState, keepEditorSelection); }; var find = function (text, matchCase, wholeWord) { return Actions.find(editor, currentIndexState, text, matchCase, wholeWord); }; var next = function () { return Actions.next(editor, currentIndexState); }; var prev = function () { return Actions.prev(editor, currentIndexState); }; var replace = function (text, forward, all) { return Actions.replace(editor, currentIndexState, text, forward, all); }; return { done: done, find: find, next: next, prev: prev, replace: replace }; }; var Api = { get: get }; var open = function (editor, currentIndexState) { var last = {}, selectedText; editor.undoManager.add(); selectedText = global$1.trim(editor.selection.getContent({ format: 'text' })); function updateButtonStates() { win.statusbar.find('#next').disabled(Actions.hasNext(editor, currentIndexState) === false); win.statusbar.find('#prev').disabled(Actions.hasPrev(editor, currentIndexState) === false); } function notFoundAlert() { editor.windowManager.alert('Could not find the specified string.', function () { win.find('#find')[0].focus(); }); } var win = editor.windowManager.open({ layout: 'flex', pack: 'center', align: 'center', onClose: function () { editor.focus(); Actions.done(editor, currentIndexState); editor.undoManager.add(); }, onSubmit: function (e) { var count, caseState, text, wholeWord; e.preventDefault(); caseState = win.find('#case').checked(); wholeWord = win.find('#words').checked(); text = win.find('#find').value(); if (!text.length) { Actions.done(editor, currentIndexState, false); win.statusbar.items().slice(1).disabled(true); return; } if (last.text === text && last.caseState === caseState && last.wholeWord === wholeWord) { if (!Actions.hasNext(editor, currentIndexState)) { notFoundAlert(); return; } Actions.next(editor, currentIndexState); updateButtonStates(); return; } count = Actions.find(editor, currentIndexState, text, caseState, wholeWord); if (!count) { notFoundAlert(); } win.statusbar.items().slice(1).disabled(count === 0); updateButtonStates(); last = { text: text, caseState: caseState, wholeWord: wholeWord }; }, buttons: [ { text: 'Find', subtype: 'primary', onclick: function () { win.submit(); } }, { text: 'Replace', disabled: true, onclick: function () { if (!Actions.replace(editor, currentIndexState, win.find('#replace').value())) { win.statusbar.items().slice(1).disabled(true); currentIndexState.set(-1); last = {}; } } }, { text: 'Replace all', disabled: true, onclick: function () { Actions.replace(editor, currentIndexState, win.find('#replace').value(), true, true); win.statusbar.items().slice(1).disabled(true); last = {}; } }, { type: 'spacer', flex: 1 }, { text: 'Prev', name: 'prev', disabled: true, onclick: function () { Actions.prev(editor, currentIndexState); updateButtonStates(); } }, { text: 'Next', name: 'next', disabled: true, onclick: function () { Actions.next(editor, currentIndexState); updateButtonStates(); } } ], title: 'Find and replace', items: { type: 'form', padding: 20, labelGap: 30, spacing: 10, items: [ { type: 'textbox', name: 'find', size: 40, label: 'Find', value: selectedText }, { type: 'textbox', name: 'replace', size: 40, label: 'Replace with' }, { type: 'checkbox', name: 'case', text: 'Match case', label: ' ' }, { type: 'checkbox', name: 'words', text: 'Whole words', label: ' ' } ] } }); }; var Dialog = { open: open }; var register = function (editor, currentIndexState) { editor.addCommand('SearchReplace', function () { Dialog.open(editor, currentIndexState); }); }; var Commands = { register: register }; var showDialog = function (editor, currentIndexState) { return function () { Dialog.open(editor, currentIndexState); }; }; var register$1 = function (editor, currentIndexState) { editor.addMenuItem('searchreplace', { text: 'Find and replace', shortcut: 'Meta+F', onclick: showDialog(editor, currentIndexState), separator: 'before', context: 'edit' }); editor.addButton('searchreplace', { tooltip: 'Find and replace', onclick: showDialog(editor, currentIndexState) }); editor.shortcuts.add('Meta+F', '', showDialog(editor, currentIndexState)); }; var Buttons = { register: register$1 }; global.add('searchreplace', function (editor) { var currentIndexState = Cell(-1); Commands.register(editor, currentIndexState); Buttons.register(editor, currentIndexState); return Api.get(editor, currentIndexState); }); function Plugin () { } return Plugin; }()); })();