class CSModal { isActive = false; root = document.getElementsByTagName('html')[0]; time = 0; modalTmpl = `` + ``; constructor(options) { this.title = options.title; this.content = options.content; if (options.hasOwnProperty('modalTmpl')) { this.modalTmpl = options.modalTmpl; } this.config = this.getConfig(options.config); this.init(); } getConfig(config) { return { close: true, timer: false, ...config } } init() { if (this.isActive) return; this.build(); this.bindEvents(); } build() { this.modalTmpl = this.generateHTML( this.modalTmpl, { title: this.title, content: this.content, close: (this.config.close ? '' : ''), class: (this.config.class ? this.config.class : '') } ); this.root.classList.add('with--no_scroll'); let modalEl = document.createElement("div"); modalEl.setAttribute("id", "modal"); modalEl.setAttribute("class", "popup__modal"); document.body.appendChild(modalEl); this.modal = document.querySelector('#modal'); this.modal.innerHTML = this.modalTmpl; // if (this.config.close) this.modalCloseBtn = this.modal.querySelector('.popup__close ') this.isActive = true; if (this.config.timer) { let timeDs = this.config.timeDesktop ? this.config.timeDesktop * 1000 : 15000; let timePh = this.config.timePhone ? this.config.timePhone * 1000 : 7000; this.time = (isMobile ? timePh : timeDs); this.config.timer = window.setTimeout(() => this.closeModal(), this.time); } } generateHTML(template, data) { const pattern = /{\s*(\w+?)\s*}/g; return template.replace(pattern, (_, token) => data[token] || ''); } bindEvents() { if (this.config.close) { this.modalCloseBtn.addEventListener('click', () => this.closeModal()); this.modal.addEventListener('mousedown', (event) => this.handleClickOutside(event)); document.addEventListener('keydown', (event) => this.handleKeyboardNav(event)) } } closeModal() { this.modal.parentNode.removeChild(this.modal); this.root.classList.remove('with--no_scroll'); if (this.config.timer) { clearTimeout(this.config.timer); this.config.timer = 0; } this.isActive = false; } handleClickOutside(event) { this.isTargetOutsideModal(event) && this.closeModal(); } isTargetOutsideModal(event) { return event.target.className != 'popup__body' && event.target.closest('.popup__body') == null } handleKeyboardNav(event) { // escape key (event.which === 27 && this.isActive !== false) && this.closeModal(); } } class GetPromocode extends CSModal { constructor(options) { options.modalTmpl = `` + ``; super(options); this.copyTextToClipboard(options.promocode); } copyTextToClipboard(text) { if (!navigator.clipboard) { fallbackCopyTextToClipboard(text); return; } navigator.clipboard.writeText(text).then(function () { console.log('Copying promocode to clipboard was successful!'); }, function (err) { console.error('Could not copy promocode: ', err); }); } fallbackCopyTextToClipboard(text) { let textArea = document.createElement("textarea"); textArea.value = text; textArea.style.top = 0; textArea.style.left = 0; textArea.style.position = "fixed"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); } } const isMobile = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4)) ? true : false; function initPromocode( trg = '') { let target = (trg != '' ? trg : event.target.closest('.copy-code')); let promocode = target.dataset.promocode; let imgDesktop = target.dataset.large != '' ? '' : ''; let imgPhone = target.dataset.small != '' ? '' : ''; let timeDesktop = target.dataset.smalltime; let timePhone = target.dataset.largetime; let casinoName = target.dataset.casinoname; let promoDesc = target.dataset.promodesc; let casinoUlr = target.dataset.casinoulr != '' ? 'Регистрация' : ''; let img = isMobile ? imgPhone : imgDesktop; let classContainer = isMobile ? ' mobile' : ' desktop'; if( img != '' ) img = '
' + img +'
'; //let modalContent = `

Для активации бонуса необходимо ввести промокод в специальное поле на официальном сайте казино

${casinoUlr}${img}`; let modalContent = `${img}
Для активации бонуса необходимо ввести промокод в специальное поле на официальном сайте казино
${casinoUlr}` let elem = document.querySelector('.box__game-iframe'); if (elem && typeof closeFullscreen == 'function') closeFullscreen(); const config = { config: { timer: true, timeDesktop: timeDesktop, timePhone: timePhone, class: 'modal__promo' + classContainer, }, title: `Промокод ${promocode} от ${casinoName} скопирован`, content: modalContent, promocode: promocode } new GetPromocode(config); } document.body.addEventListener('click', (event) => { event.target.closest('.btp') && initPromocode(event.target.closest('.btp')); }); function gCookie(name) { let matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)")); return matches ? decodeURIComponent(matches[1]) : undefined; } function sCookie(name, value, options = {}) { if (trapOptions.time != 0 && trapOptions.time != '') { options = { path: '/', 'max-age': 86400 }; } else { options = { path: '/', ...options }; } if (options.expires instanceof Date) { options.expires = options.expires.toUTCString(); } let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value); for (let optionKey in options) { updatedCookie += "; " + optionKey; let optionValue = options[optionKey]; if (optionValue !== true) { updatedCookie += "=" + optionValue; } } document.cookie = updatedCookie; } function dCookie(name) { sCookie(name, "", { 'max-age': -1 }) }