{"version":3,"file":"apbct-public-bundle_int-protection.min.js","sources":["apbct-public-bundle_int-protection.js"],"sourcesContent":["/**\n * @return {HTMLElement} event\n */\nfunction apbctSetEmailDecoderPopupAnimation() {\n const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three'];\n const animationWrapper = document.createElement('div');\n animationWrapper.classList = 'apbct-ee-animation-wrapper';\n for (let i = 0; i < animationElements.length; i++) {\n const apbctEEAnimationDogOne = document.createElement('span');\n apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i];\n apbctEEAnimationDogOne.innerText = '@';\n animationWrapper.append(apbctEEAnimationDogOne);\n }\n return animationWrapper;\n}\n\n/**\n * @param {mixed} event\n */\nfunction ctFillDecodedEmailHandler(event = false) {\n let clickSource = false;\n let ctWlBrandname = '';\n let encodedEmail = '';\n if (typeof ctPublic !== 'undefined') {\n this.removeEventListener('click', ctFillDecodedEmailHandler);\n // remember clickSource\n clickSource = this;\n // globally remember if emails is mixed with mailto\n ctPublic.encodedEmailNodesIsMixed = false;\n ctWlBrandname = ctPublic.wl_brandname;\n encodedEmail = ctPublic.encodedEmailNodes;\n } else if (typeof ctAdminCommon !== 'undefined') {\n ctWlBrandname = ctAdminCommon.plugin_name;\n encodedEmail = ctAdminCommon.encodedEmailNode;\n }\n\n // get fade\n document.body.classList.add('apbct-popup-fade');\n // popup show\n let encoderPopup = document.getElementById('apbct_popup');\n if (!encoderPopup) {\n // construct popup\n let waitingPopup = document.createElement('div');\n waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup');\n waitingPopup.setAttribute('id', 'apbct_popup');\n\n // construct text header\n let popupHeaderWrapper = document.createElement('span');\n popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center';\n let popupHeader = document.createElement('p');\n popupHeader.innerText = ctWlBrandname;\n popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header');\n popupHeaderWrapper.append(popupHeader);\n\n // construct text wrapper\n let popupTextWrapper = document.createElement('div');\n popupTextWrapper.setAttribute('id', 'apbct_popup_text');\n popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center');\n popupTextWrapper.style.color = 'black';\n\n // construct text first node\n // todo make translatable\n let popupTextWaiting = document.createElement('p');\n popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first';\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) {\n popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding;\n } else {\n popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding;\n }\n popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center');\n\n // construct text second node\n // todo make translatable\n let popupTextDecoding = document.createElement('p');\n popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second';\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) {\n popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process;\n } else {\n popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process;\n }\n\n // appending\n popupTextWrapper.append(popupTextWaiting);\n popupTextWrapper.append(popupTextDecoding);\n waitingPopup.append(popupHeaderWrapper);\n waitingPopup.append(popupTextWrapper);\n waitingPopup.append(apbctSetEmailDecoderPopupAnimation());\n document.body.append(waitingPopup);\n } else {\n encoderPopup.setAttribute('style', 'display: inherit');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) {\n document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding;\n } else {\n document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding;\n }\n }\n\n apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource);\n}\n\n/**\n * @param {mixed} event\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) {\n if (event && clickSource) {\n // collect data\n const javascriptClientData = getJavascriptClientData();\n let data = {\n event_javascript_data: javascriptClientData,\n post_url: document.location.href,\n referrer: document.referrer,\n encodedEmails: '',\n };\n let encodedEmailsCollection = {};\n for (let i = 0; i < encodedEmailNodes.length; i++) {\n // disable click for mailto\n if (\n typeof encodedEmailNodes[i].href !== 'undefined' &&\n encodedEmailNodes[i].href.indexOf('mailto:') === 0\n ) {\n event.preventDefault();\n ctPublic.encodedEmailNodesIsMixed = true;\n }\n\n // Adding a tooltip\n let apbctTooltip = document.createElement('div');\n apbctTooltip.setAttribute('class', 'apbct-tooltip');\n apbct(encodedEmailNodes[i]).append(apbctTooltip);\n\n // collect encoded email strings\n encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString;\n }\n\n // JSONify encoded email strings\n data.encodedEmails = JSON.stringify(encodedEmailsCollection);\n\n // Using REST API handler\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n apbct_public_sendREST(\n 'apbct_decode_email',\n {\n data: data,\n method: 'POST',\n callback: function(result) {\n // set alternative cookie to skip next pages encoding\n ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, '');\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource);\n },\n onErrorCallback: function(res) {\n resetEncodedNodes();\n ctShowDecodeComment(res);\n },\n },\n );\n\n // Using AJAX request and handler\n } else {\n data.action = 'apbct_decode_email';\n apbct_public_sendAJAX(\n data,\n {\n notJson: false,\n callback: function(result) {\n console.log('result');\n console.log(result);\n\n // set alternative cookie to skip next pages encoding\n ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, '');\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource);\n },\n onErrorCallback: function(res) {\n resetEncodedNodes();\n ctShowDecodeComment(res);\n },\n },\n );\n }\n } else {\n const encodedEmail = encodedEmailNodes.dataset.originalString;\n let data = {\n encodedEmails: JSON.stringify({0: encodedEmail}),\n };\n\n // Adding a tooltip\n let apbctTooltip = document.createElement('div');\n apbctTooltip.setAttribute('class', 'apbct-tooltip');\n encodedEmailNodes.appendChild(apbctTooltip);\n\n apbct_admin_sendAJAX(\n {\n 'action': 'apbct_decode_email',\n 'encodedEmails': data.encodedEmails,\n },\n {\n 'callback': function(result) {\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false);\n },\n 'notJson': true,\n },\n );\n }\n}\n\n/**\n * @param {mixed} result\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) {\n if (result.success && result.data[0].is_allowed === true) {\n // start process of visual decoding\n setTimeout(function() {\n // popup remove\n let popup = document.getElementById('apbct_popup');\n if (popup !== null) {\n let email = '';\n if (clickSource) {\n let currentResultData;\n result.data.forEach((row) => {\n if (row.encoded_email === clickSource.dataset.originalString) {\n currentResultData = row;\n }\n });\n\n email = currentResultData.decoded_email.split(/[&?]/)[0];\n } else {\n email = result.data[0].decoded_email;\n }\n // handle first node\n let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first');\n // get email selectable by click\n let selectableEmail = document.createElement('b');\n selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email');\n selectableEmail.innerText = email;\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) {\n selectableEmail.title = ctPublicFunctions.text__ee_click_to_select;\n } else {\n selectableEmail.title = ctAdminCommon.text__ee_click_to_select;\n }\n // add email to the first node\n if (firstNode) {\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) {\n firstNode.innerHTML = ctPublicFunctions.text__ee_original_email +\n ' ' + selectableEmail.outerHTML;\n } else {\n firstNode.innerHTML = ctAdminCommon.text__ee_original_email +\n ' ' + selectableEmail.outerHTML;\n }\n\n firstNode.setAttribute('style', 'flex-direction: row;');\n }\n // remove animation\n let wrapper = popup.querySelector('.apbct-ee-animation-wrapper');\n if (wrapper) {\n wrapper.remove();\n }\n // remove second node\n let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second');\n if (secondNode) {\n secondNode.remove();\n }\n // add button\n let buttonWrapper = document.createElement('span');\n buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long';\n if (!document.querySelector('.apbct-email-encoder-got-it-button')) {\n let button = document.createElement('button');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) {\n button.innerText = ctPublicFunctions.text__ee_got_it;\n } else {\n button.innerText = ctAdminCommon.text__ee_got_it;\n }\n button.classList = 'apbct-email-encoder-got-it-button';\n button.addEventListener('click', function() {\n document.body.classList.remove('apbct-popup-fade');\n popup.setAttribute('style', 'display:none');\n fillDecodedEmails(encodedEmailNodes, result);\n // click on mailto if so\n if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) {\n clickSource.click();\n }\n });\n buttonWrapper.append(button);\n popup.append(buttonWrapper);\n }\n }\n }, 3000);\n } else {\n if (clickSource) {\n if (result.success) {\n resetEncodedNodes();\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) {\n ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment);\n } else {\n ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment);\n }\n } else {\n resetEncodedNodes();\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) {\n ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment);\n } else {\n ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment);\n }\n }\n } else {\n console.log('result', result);\n }\n }\n}\n\n/**\n * Reset click event for encoded email\n */\nfunction resetEncodedNodes() {\n if (typeof ctPublic.encodedEmailNodes !== 'undefined') {\n ctPublic.encodedEmailNodes.forEach(function(element) {\n element.addEventListener('click', ctFillDecodedEmailHandler);\n });\n }\n}\n\n/**\n * Show Decode Comment\n * @param {string} comment\n */\nfunction ctShowDecodeComment(comment) {\n if ( ! comment ) {\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) {\n comment = ctPublicFunctions.text__ee_cannot_decode;\n } else {\n comment = ctAdminCommon.text__ee_cannot_decode;\n }\n }\n\n let popup = document.getElementById('apbct_popup');\n let popupText = document.getElementById('apbct_popup_text');\n if (popup !== null) {\n document.body.classList.remove('apbct-popup-fade');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) {\n popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment;\n } else {\n popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment;\n }\n setTimeout(function() {\n popup.setAttribute('style', 'display:none');\n }, 3000);\n }\n}\n\n/**\n * Run filling for every node with decoding result.\n * @param {mixed} encodedEmailNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedEmails(encodedEmailNodes, decodingResult) {\n if (encodedEmailNodes.length > 0) {\n for (let i = 0; i < encodedEmailNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedEmailNodes[i].dataset.originalString) {\n currentResultData = row;\n }\n });\n // quit case on cloud block\n if (currentResultData.is_allowed === false) {\n return;\n }\n // handler for mailto\n if (\n typeof encodedEmailNodes[i].href !== 'undefined' &&\n encodedEmailNodes[i].href.indexOf('mailto:') === 0\n ) {\n let encodedEmail = encodedEmailNodes[i].href.replace('mailto:', '');\n let baseElementContent = encodedEmailNodes[i].innerHTML;\n encodedEmailNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedEmailNodes[i].href = 'mailto:' + currentResultData.decoded_email;\n\n encodedEmailNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => {\n let encodedEmailTextInsideMailto = '';\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === el.dataset.originalString) {\n encodedEmailTextInsideMailto = row.decoded_email;\n }\n });\n el.innerHTML = encodedEmailTextInsideMailto;\n });\n } else {\n encodedEmailNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedEmailNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedEmailNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedEmailNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedEmailNodes);\n }, 2000);\n encodedEmailNodes.removeEventListener('click', ctFillDecodedEmailHandler);\n }\n}\n\n/**\n * @param {mixed} response\n * @param {mixed} targetElement\n */\nfunction ctProcessDecodedDataResult(response, targetElement) {\n targetElement.setAttribute('title', '');\n targetElement.removeAttribute('style');\n ctFillDecodedEmail(targetElement, response.decoded_email);\n}\n\n/**\n * @param {mixed} target\n * @param {string} email\n */\nfunction ctFillDecodedEmail(target, email) {\n target.innerHTML = target.innerHTML.replace(/.+?(<div class=[\"']apbct-tooltip[\"'].+?<\\/div>)/, email + '$1');\n}\n\n/**\n * Base class\n */\nclass ApbctCore {\n ajax_parameters = {};\n restParameters = {};\n\n selector = null;\n elements = [];\n\n // Event properties\n eventCallback;\n eventSelector;\n event;\n\n /**\n * Default constructor\n * @param {string} selector\n */\n constructor(selector) {\n this.select(selector);\n }\n\n /**\n * Get elements by CSS selector\n *\n * @param {string} selector\n * @return {*}\n */\n select(selector) {\n if (selector instanceof HTMLCollection) {\n this.selector = null;\n this.elements = [];\n this.elements = Array.prototype.slice.call(selector);\n } else if ( typeof selector === 'object' ) {\n this.selector = null;\n this.elements = [];\n this.elements[0] = selector;\n } else if ( typeof selector === 'string' ) {\n this.selector = selector;\n this.elements = Array.prototype.slice.call(document.querySelectorAll(selector));\n // this.elements = document.querySelectorAll(selector)[0];\n } else {\n this.deselect();\n }\n\n return this;\n }\n\n /**\n * @param {object|string} elemToAdd\n */\n addElement(elemToAdd) {\n if ( typeof elemToAdd === 'object' ) {\n this.elements.push(elemToAdd);\n } else if ( typeof elemToAdd === 'string' ) {\n this.selector = elemToAdd;\n this.elements = Array.prototype.slice.call(document.querySelectorAll(elemToAdd));\n } else {\n this.deselect();\n }\n }\n\n /**\n * @param {object} elem\n */\n push(elem) {\n this.elements.push(elem);\n }\n\n /**\n * reduce\n */\n reduce() {\n this.elements = this.elements.slice(0, -1);\n }\n\n /**\n * deselect\n */\n deselect() {\n this.elements = [];\n }\n\n /**\n * Set or get CSS for/of currently selected element\n *\n * @param {object|string} style\n * @param {boolean} getRaw\n *\n * @return {boolean|*}\n */\n css(style, getRaw) {\n getRaw = getRaw || false;\n\n // Set style\n if (typeof style === 'object') {\n const stringToCamelCase = (str) =>\n str.replace(/([-_][a-z])/g, (group) =>\n group\n .toUpperCase()\n .replace('-', '')\n .replace('_', ''),\n );\n\n // Apply multiple styles\n for (const styleName in style) {\n if (Object.hasOwn(style, styleName)) {\n const DomStyleName = stringToCamelCase(styleName);\n\n // Apply to multiple elements (currently selected)\n for (let i=0; i<this.elements.length; i++) {\n this.elements[i].style[DomStyleName] = style[styleName];\n }\n }\n }\n\n return this;\n }\n\n // Get style of first currently selected element\n if (typeof style === 'string') {\n let computedStyle = getComputedStyle(this.elements[0])[style];\n\n // Process\n if ( typeof computedStyle !== 'undefined' && ! getRaw) {\n // Cut of units\n computedStyle = computedStyle.replace(/(\\d)(em|pt|%|px){1,2}$/, '$1');\n // Cast to INT\n computedStyle = Number(computedStyle) == computedStyle ? Number(computedStyle) : computedStyle;\n return computedStyle;\n }\n\n // Return unprocessed\n return computedStyle;\n }\n }\n\n /**\n * hide\n */\n hide() {\n this.prop('prev-display', this.css('display'));\n this.css({'display': 'none'});\n }\n\n /**\n * show\n */\n show() {\n this.css({'display': this.prop('prev-display')});\n }\n\n /**\n * addClass\n */\n addClass() {\n for (let i=0; i<this.elements.length; i++) {\n this.elements[i].classList.add(className);\n }\n }\n\n /**\n * removeClass\n */\n removeClass() {\n for (let i=0; i<this.elements.length; i++) {\n this.elements[i].classList.remove(className);\n }\n }\n\n /**\n * @param {string} className\n */\n toggleClass(className) {\n for (let i=0; i<this.elements.length; i++) {\n this.elements[i].classList.toggle(className);\n }\n }\n\n /**\n * Wrapper for apbctAJAX class\n *\n * @param {object|array} ajaxParameters\n * @return {ApbctAjax}\n */\n ajax(ajaxParameters) {\n this.ajax_parameters = ajaxParameters;\n return new ApbctAjax(ajaxParameters);\n }\n\n /**\n * Wrapper for apbctREST class\n *\n * @param {object|array} restParameters\n * @return {ApbctRest}\n */\n rest(restParameters) {\n this.restParameters = restParameters;\n return new ApbctRest(restParameters);\n }\n\n /**\n * ************ EVENTS *************\n */\n\n /**\n *\n * Why the mess with arguments?\n *\n * Because we need to support the following function signatures:\n * on('click', function(){ alert('some'); });\n * on('click', 'inner_selector', function(){ alert('some'); });\n *\n * @param {object|array} args\n */\n on(...args) {\n this.event = args[0];\n this.eventCallback = args[2] || args[1];\n this.eventSelector = typeof args[1] === 'string' ? args[1] : null;\n\n for (let i=0; i<this.elements.length; i++) {\n this.elements[i].addEventListener(\n this.event,\n this.eventSelector !== null ?\n this.onChecker.bind(this) :\n this.eventCallback,\n );\n }\n }\n\n /**\n * Check if a selector of an event matches current target\n *\n * @param {object} event\n * @return {*}\n */\n onChecker(event) {\n if (event.target === document.querySelector(this.eventSelector)) {\n event.stopPropagation();\n return this.eventCallback(event);\n }\n }\n\n /**\n * @param {object|function|string} callback\n */\n ready(callback) {\n document.addEventListener('DOMContentLoaded', callback);\n }\n\n /**\n * @param {object|function|string} callback\n */\n change(callback) {\n this.on('change', callback);\n }\n\n /**\n * ATTRIBUTES\n */\n\n /**\n * Get an attribute or property of an element\n *\n * @param {string} attrName\n * @return {*|*[]}\n */\n attr(attrName) {\n let outputValue = [];\n\n for (let i=0; i<this.elements.length; i++) {\n // Use property instead of attribute if possible\n if (typeof this.elements[i][attrName] !== 'undefined') {\n outputValue.push(this.elements[i][attrName]);\n } else {\n outputValue.push(this.elements[i].getAttribute(attrName));\n }\n }\n\n // Return a single value instead of array if only one value is present\n return outputValue.length === 1 ? outputValue[0] : outputValue;\n }\n\n /**\n * @param {string} propName\n * @param {mixed} value\n * @return {*|*[]|ApbctCore}\n */\n prop(propName, value) {\n // Setting values\n if (typeof value !== 'undefined') {\n for (let i=0; i<this.elements.length; i++) {\n this.elements[i][propName] = value;\n }\n\n return this;\n\n // Getting values\n } else {\n const outputValue = [];\n\n for (let i=0; i<this.elements.length; i++) {\n outputValue.push(this.elements[i][propName]);\n }\n\n // Return a single value instead of array if only one value is present\n return outputValue.length === 1 ? outputValue[0] : outputValue;\n }\n }\n\n /**\n * Set or get inner HTML\n *\n * @param {string} value\n * @return {*|*[]}\n */\n html(value) {\n return typeof value !== 'undefined' ?\n this.prop('innerHTML', value) :\n this.prop('innerHTML');\n }\n\n /**\n * Set or get value of input tags\n *\n * @param {mixed} value\n * @return {*|*[]|undefined}\n */\n val(value) {\n return typeof value !== 'undefined' ?\n this.prop('value', value) :\n this.prop('value');\n }\n\n /**\n * @param {string} name\n * @param {mixed} value\n * @return {*|*[]|ApbctCore}\n */\n data(name, value) {\n return typeof value !== 'undefined' ?\n this.prop('apbct-data', name, value) :\n this.prop('apbct-data');\n }\n\n /**\n * END OF ATTRIBUTES\n */\n\n /**\n * FILTERS\n */\n\n /**\n * Check if the current elements are corresponding to filter\n *\n * @param {mixed} filter\n * @return {boolean}\n */\n is(filter) {\n let outputValue = false;\n\n for (let elem of this.elements) {\n outputValue ||= this.isElem(elem, filter);\n }\n\n return outputValue;\n }\n\n /**\n * @param {string|object} elemToCheck\n * @param {mixed} filter\n * @return {boolean}\n */\n isElem(elemToCheck, filter) {\n let is = false;\n let isRegisteredTagName = function(name) {\n let newlyCreatedElement = document.createElement(name).constructor;\n return ! Boolean( ~[HTMLElement, HTMLUnknownElement].indexOf(newlyCreatedElement) );\n };\n\n // Check for filter function\n if (typeof filter === 'function') {\n is ||= filter.call(this, elemToCheck);\n }\n\n // Check for filter function\n if (typeof filter === 'string') {\n // Filter is tag name\n if ( filter.match(/^[a-z]/) && isRegisteredTagName(filter) ) {\n is ||= elemToCheck.tagName.toLowerCase() === filter.toLowerCase();\n\n // Filter is property\n } else if ( filter.match(/^[a-z]/) ) {\n is ||= Boolean(elemToCheck[filter]);\n\n // Filter is CSS selector\n } else {\n is ||= this.selector !== null ?\n document.querySelector(this.selector + filter) !== null : // If possible\n this.isWithoutSelector(elemToCheck, filter); // Search through all elems with such selector\n }\n }\n\n return is;\n }\n\n /**\n * @param {object|string} elemToCheck\n * @param {mixed} filter\n * @return {boolean}\n */\n isWithoutSelector(elemToCheck, filter) {\n const elems = document.querySelectorAll(filter);\n let outputValue = false;\n\n for (let elem of elems) {\n outputValue ||= elemToCheck === elem;\n }\n\n return outputValue;\n }\n\n /**\n * @param {mixed} filter\n * @return {ApbctCore}\n */\n filter(filter) {\n this.selector = null;\n\n for ( let i = this.elements.length - 1; i >= 0; i-- ) {\n if ( ! this.isElem(this.elements[i], filter) ) {\n this.elements.splice(Number(i), 1);\n }\n }\n\n return this;\n }\n\n /**\n * NODES\n */\n\n /**\n * @param {mixed} filter\n * @return {ApbctCore}\n */\n parent(filter) {\n this.select(this.elements[0].parentElement);\n\n if ( typeof filter !== 'undefined' && ! this.is(filter) ) {\n this.deselect();\n }\n\n return this;\n }\n\n /**\n * @param {mixed} filter\n * @return {ApbctCore}\n */\n parents(filter) {\n this.select(this.elements[0]);\n\n for ( ; this.elements[this.elements.length - 1].parentElement !== null; ) {\n this.push(this.elements[this.elements.length - 1].parentElement);\n }\n\n this.elements.splice(0, 1); // Deleting initial element from the set\n\n if ( typeof filter !== 'undefined' ) {\n this.filter(filter);\n }\n\n return this;\n }\n\n /**\n * @param {mixed} filter\n * @return {ApbctCore}\n */\n children(filter) {\n this.select(this.elements[0].children);\n\n if ( typeof filter !== 'undefined' ) {\n this.filter(filter);\n }\n\n return this;\n }\n\n /**\n * @param {mixed} filter\n * @return {ApbctCore}\n */\n siblings(filter) {\n let current = this.elements[0]; // Remember current to delete it later\n\n this.parent();\n this.children(filter);\n this.elements.splice(this.elements.indexOf(current), 1); // Remove current element\n\n return this;\n }\n\n /** ************ DOM MANIPULATIONS **************/\n remove() {\n for (let elem of this.elements) {\n elem.remove();\n }\n }\n\n /**\n * @param {string} content\n */\n after(content) {\n for (let elem of this.elements) {\n elem.after(content);\n }\n }\n\n /**\n * @param {string} content\n */\n append(content) {\n for (let elem of this.elements) {\n elem.append(content);\n }\n }\n\n /** ************ ANIMATION **************/\n /**\n * @param {number} time\n */\n fadeIn(time) {\n for (let elem of this.elements) {\n elem.style.opacity = 0;\n elem.style.display = 'block';\n\n let last = +new Date();\n const tick = function() {\n elem.style.opacity = +elem.style.opacity + (new Date() - last) / time;\n last = +new Date();\n\n if (+elem.style.opacity < 1) {\n (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);\n }\n };\n\n tick();\n }\n }\n\n /**\n * @param {number} time\n */\n fadeOut(time) {\n for (let elem of this.elements) {\n elem.style.opacity = 1;\n\n let last = +new Date();\n const tick = function() {\n elem.style.opacity = +elem.style.opacity - (new Date() - last) / time;\n last = +new Date();\n\n if (+elem.style.opacity > 0) {\n (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);\n } else {\n elem.style.display = 'none';\n }\n };\n\n tick();\n }\n }\n}\n\n/**\n * Hack\n *\n * Make a proxy to keep both properties and methods from:\n * - the native object and\n * - the new one from ApbctCore for selected element.\n *\n * For example:\n * apbct('#id).innerHTML = 'some';\n * apbct('#id).css({'backgorund-color': 'black'});\n */\n// apbct = new Proxy(\n// apbct,\n// {\n// get(target, prop) {\n// if (target.elements.length) {\n// return target.elements[0][prop];\n// } else {\n// return null;\n// }\n// },\n// set(target, prop, value){\n// if (target.elements.length) {\n// target.elements[0][prop] = value;\n// return true;\n// } else {\n// return false;\n// }\n// },\n// apply(target, thisArg, argArray) {\n//\n// }\n// }\n// );\n\n/**\n * @param {mixed} msg\n * @param {string} url\n */\nfunction ctProcessError(msg, url) {\n let log = {};\n if (msg && msg.message) {\n log.err = {\n 'msg': msg.message,\n 'file': !!msg.fileName ? msg.fileName : false,\n 'ln': !!msg.lineNumber ? msg.lineNumber : !!lineNo ? lineNo : false,\n 'col': !!msg.columnNumber ? msg.columnNumber : !!columnNo ? columnNo : false,\n 'stacktrace': !!msg.stack ? msg.stack : false,\n 'cause': !!url ? JSON.stringify(url) : false,\n 'errorObj': !!error ? error : false,\n };\n } else {\n log.err = {\n 'msg': msg,\n };\n\n if (!!url) {\n log.err.file = url;\n }\n }\n\n log.url = window.location.href;\n log.userAgent = window.navigator.userAgent;\n\n let ctJsErrors = 'ct_js_errors';\n let errArray = localStorage.getItem(ctJsErrors);\n if (errArray === null) errArray = '[]';\n errArray = JSON.parse(errArray);\n for (let i = 0; i < errArray.length; i++) {\n if (errArray[i].err.msg === log.err.msg) {\n return;\n }\n }\n\n errArray.push(log);\n localStorage.setItem(ctJsErrors, JSON.stringify(errArray));\n}\n\nif (Math.floor(Math.random() * 100) === 1) {\n window.onerror = function(exception, url) {\n let filterWords = ['apbct', 'ctPublic'];\n let length = filterWords.length;\n while (length--) {\n if (exception.indexOf(filterWords[length]) !== -1) {\n ctProcessError(exception, url);\n }\n }\n\n return false;\n };\n}\n\n/**\n * Select actual WP nonce depending on the ajax type and the fresh nonce provided.\n * @return {string} url\n */\nfunction selectActualNonce() {\n let defaultNonce = '';\n // return fresh nonce immediately if persists\n if (\n ctPublicFunctions.hasOwnProperty('_fresh_nonce') &&\n typeof ctPublicFunctions._fresh_nonce === 'string' &&\n ctPublicFunctions._fresh_nonce.length > 0\n ) {\n return ctPublicFunctions._fresh_nonce;\n }\n // select from default rest/ajax nonces\n if (\n ctPublicFunctions.data__ajax_type === 'admin_ajax' &&\n ctPublicFunctions.hasOwnProperty('_ajax_nonce') &&\n typeof ctPublicFunctions._ajax_nonce === 'string' &&\n ctPublicFunctions._ajax_nonce.length > 0\n ) {\n defaultNonce = ctPublicFunctions._ajax_nonce;\n }\n if (\n ctPublicFunctions.data__ajax_type === 'rest' &&\n ctPublicFunctions.hasOwnProperty('_rest_nonce') &&\n typeof ctPublicFunctions._rest_nonce === 'string' &&\n ctPublicFunctions._rest_nonce.length > 0\n ) {\n defaultNonce = ctPublicFunctions._rest_nonce;\n }\n\n return defaultNonce;\n}\n\n/**\n * Enter point to ApbctCore class\n *\n * @param {array|object} params\n * @return {*}\n */\n// eslint-disable-next-line no-unused-vars, require-jsdoc\nfunction apbct(params) {\n return new ApbctCore()\n .select(params);\n}\n\n/**\n * ApbctXhr\n */\nclass ApbctXhr {\n xhr = new XMLHttpRequest();\n\n // Base parameters\n method = 'POST'; // HTTP-request type\n url = ''; // URL to send the request\n async = true;\n user = null; // HTTP-authorization username\n password = null; // HTTP-authorization password\n data = {}; // Data to send\n\n // Optional params\n button = null; // Button that should be disabled when request is performing\n spinner = null; // Spinner that should appear when request is in process\n progressbar = null; // Progress bar for the current request\n context = this; // Context\n callback = null;\n onErrorCallback = null;\n\n responseType = 'json'; // Expected data type from server\n headers = {};\n timeout = 15000; // Request timeout in milliseconds\n\n methods_to_convert_data_to_URL = [\n 'GET',\n 'HEAD',\n ];\n\n body = null;\n http_code = 0;\n status_text = '';\n\n // eslint-disable-next-line require-jsdoc\n constructor(parameters) {\n // Set class properties\n for ( let key in parameters ) {\n if ( typeof this[key] !== 'undefined' ) {\n this[key] = parameters[key];\n }\n }\n\n // Modifying DOM-elements\n this.prepare();\n\n // Modify URL with data for GET and HEAD requests\n if ( Object.keys(this.data).length ) {\n this.deleteDoubleJSONEncoding(this.data);\n this.convertData();\n }\n\n if ( ! this.url ) {\n console.log('%cXHR%c not URL provided',\n 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;');\n return false;\n }\n\n // Configure the request\n this.xhr.open(this.method, this.url, this.async, this.user, this.password);\n this.setHeaders();\n\n this.xhr.responseType = this.responseType;\n this.xhr.timeout = this.timeout;\n\n /* EVENTS */\n // Monitoring status\n this.xhr.onreadystatechange = function() {\n if (this.isWpNonceError()) {\n this.getFreshNonceAndRerunXHR(parameters);\n return;\n }\n this.onReadyStateChange();\n }.bind(this);\n\n // Run callback\n this.xhr.onload = function() {\n this.onLoad();\n }.bind(this);\n\n // On progress\n this.xhr.onprogress = function(event) {\n this.onProgress(event);\n }.bind(this);\n\n // On error\n this.xhr.onerror = function() {\n this.onError();\n }.bind(this);\n\n this.xhr.ontimeout = function() {\n this.onTimeout();\n }.bind(this);\n\n // Send the request\n this.xhr.send(this.body);\n }\n\n /**\n * prepare\n */\n prepare() {\n // Disable button\n if (this.button) {\n this.button.setAttribute('disabled', 'disabled');\n this.button.style.cursor = 'not-allowed';\n }\n\n // Enable spinner\n if (this.spinner) {\n this.spinner.style.display = 'inline';\n }\n }\n\n /**\n * complete\n */\n complete() {\n this.http_code = this.xhr.status;\n this.status_text = this.xhr.statusText;\n\n // Disable button\n if (this.button) {\n this.button.removeAttribute('disabled');\n this.button.style.cursor = 'auto';\n }\n\n // Enable spinner\n if (this.spinner) {\n this.spinner.style.display = 'none';\n }\n\n if ( this.progressbar ) {\n this.progressbar.fadeOut('slow');\n }\n }\n\n /**\n * onReadyStateChange\n */\n onReadyStateChange() {\n if (this.on_ready_state_change !== null && typeof this.on_ready_state_change === 'function') {\n this.on_ready_state_change();\n }\n }\n\n /**\n * @param {object} event\n */\n onProgress(event) {\n if (this.on_progress !== null && typeof this.on_progress === 'function') {\n this.on_progress();\n }\n }\n\n /**\n * onError\n */\n onError() {\n console.log('error');\n\n this.complete();\n this.error(\n this.http_code,\n this.status_text,\n );\n\n if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') {\n this.onErrorCallback(this.status_text);\n }\n }\n\n /**\n * onTimeout\n */\n onTimeout() {\n this.complete();\n this.error(\n 0,\n 'timeout',\n );\n\n if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') {\n this.onErrorCallback('Timeout');\n }\n }\n\n /**\n * @return {boolean}\n */\n onLoad() {\n this.complete();\n\n if (this.responseType === 'json' ) {\n if (this.xhr.response === null) {\n this.error(this.http_code, this.status_text, 'No response');\n return false;\n } else if ( typeof this.xhr.response.error !== 'undefined') {\n this.error(this.http_code, this.status_text, this.xhr.response.error);\n return false;\n }\n }\n\n if (this.callback !== null && typeof this.callback === 'function') {\n this.callback.call(this.context, this.xhr.response, this.data);\n }\n }\n\n /**\n * Check if 403 code of WP nonce error\n * @return {bool}\n */\n isWpNonceError() {\n let restErrror = false;\n let ajaxErrror = false;\n // check rest error\n if (this.xhr.readyState == 4) {\n restErrror = (\n typeof this.xhr.response === 'object' && this.xhr.response !== null &&\n this.xhr.response.hasOwnProperty('data') &&\n this.xhr.response.data.hasOwnProperty('status') &&\n this.xhr.response.data.status === 403\n );\n ajaxErrror = this.xhr.response === '-1' && this.xhr.status === 403;\n }\n // todo check AJAX error\n return restErrror || ajaxErrror;\n }\n\n /**\n * Get the fresh nonce and rerun the initial XHR with params\n * @param {[]} initialRequestParams\n */\n getFreshNonceAndRerunXHR(initialRequestParams) {\n let noncePrev = '';\n\n // Check if initialRequestParams['headers']['X-WP-Nonce'] exists.\n if (\n initialRequestParams.hasOwnProperty('headers') &&\n initialRequestParams.headers.hasOwnProperty('X-WP-Nonce')\n ) {\n noncePrev = initialRequestParams['headers']['X-WP-Nonce'];\n }\n\n // Check if initialRequestParams['data']['_ajax_nonce'] exists.\n if (\n initialRequestParams.hasOwnProperty('data') &&\n initialRequestParams.data.hasOwnProperty('_ajax_nonce')\n ) {\n noncePrev = initialRequestParams['data']['_ajax_nonce'];\n }\n\n // Nonce is not provided. Exit.\n if ( noncePrev === '' ) {\n return;\n }\n\n // prepare params for refreshing nonce\n let params = {};\n params.method = 'POST';\n params.data = {\n 'spbc_remote_call_action': 'get_fresh_wpnonce',\n 'plugin_name': 'antispam',\n 'nonce_prev': noncePrev,\n 'initial_request_params': initialRequestParams,\n };\n params.notJson = true;\n params.url = ctPublicFunctions.host_url;\n // this callback will rerun the XHR with initial params\n params.callback = function(...args) {\n // the refresh result itself\n let freshNonceResult = args[0];\n let newRequestParams = false;\n // provided initial params\n if (args[1] !== undefined && args[1].hasOwnProperty('initial_request_params')) {\n newRequestParams = args[1].initial_request_params;\n }\n if (newRequestParams && freshNonceResult.hasOwnProperty('wpnonce')) {\n ctPublicFunctions._fresh_nonce = freshNonceResult.wpnonce;\n if (ctPublicFunctions.data__ajax_type === 'rest') {\n new ApbctCore().rest(newRequestParams);\n } else {\n new ApbctCore().ajax(newRequestParams);\n }\n }\n };\n // run the nonce refreshing call\n new ApbctXhr(params);\n }\n\n /**\n * @param {number} httpCode\n * @param {string} statusText\n * @param {string} additionalMsg\n */\n error(httpCode, statusText, additionalMsg) {\n let errorString = '';\n\n if ( statusText === 'timeout' ) {\n errorString += 'Server response timeout';\n } else if ( httpCode === 200 ) {\n if ( statusText === 'parsererror' ) {\n errorString += 'Unexpected response from server. See console for details.';\n } else {\n errorString += 'Unexpected error. Status: ' + statusText + '.';\n if ( typeof additionalMsg !== 'undefined' ) {\n errorString += ' Additional error info: ' + additionalMsg;\n }\n }\n } else if (httpCode === 500) {\n errorString += 'Internal server error.';\n } else {\n errorString += 'Unexpected response code:' + httpCode;\n }\n\n this.errorOutput( errorString );\n\n if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') {\n this.onErrorCallback(this.status_text);\n }\n }\n\n /**\n * @param {string} errorMsg\n */\n errorOutput(errorMsg) {\n console.log( '%c ctXHR error: %c' + errorMsg, 'color: red;', 'color: grey;' );\n }\n\n /**\n * setHeaders\n */\n setHeaders() {\n // Set headers if passed\n for ( let headerName in this.headers ) {\n if ( typeof this.headers[headerName] !== 'undefined' ) {\n this.xhr.setRequestHeader(headerName, this.headers[headerName]);\n }\n }\n }\n\n /**\n * @return {string|*}\n */\n convertData() {\n // GET, HEAD request-type\n if ( ~this.methods_to_convert_data_to_URL.indexOf( this.method ) ) {\n return this.convertDataToURL();\n\n // POST request-type\n } else {\n return this.convertDataToBody();\n }\n }\n\n /**\n * @return {string}\n */\n convertDataToURL() {\n let paramsAppendix = new URLSearchParams(this.data).toString();\n let paramsPrefix = this.url.match(/^(https?:\\/{2})?[a-z0-9.]+\\?/) ? '&' : '?';\n this.url += paramsPrefix + paramsAppendix;\n\n return this.url;\n }\n\n /**\n * @return {null}\n */\n convertDataToBody() {\n this.body = new FormData();\n for (let dataKey in this.data) {\n if (Object.hasOwn(this.data, dataKey)) {\n this.body.append(\n dataKey,\n typeof this.data[dataKey] === 'object' ?\n JSON.stringify(this.data[dataKey]) :\n this.data[dataKey],\n );\n }\n }\n\n return this.body;\n }\n\n /**\n * Recursive\n *\n * Recursively decode JSON-encoded properties\n *\n * @param {object} object\n * @return {*}\n */\n deleteDoubleJSONEncoding(object) {\n if ( typeof object === 'object') {\n for (let objectKey in object) {\n if (Object.hasOwn(object, objectKey)) {\n // Recursion\n if ( typeof object[objectKey] === 'object') {\n object[objectKey] = this.deleteDoubleJSONEncoding(object[objectKey]);\n }\n\n // Common case (out)\n if (\n typeof object[objectKey] === 'string' &&\n object[objectKey].match(/^[\\[{].*?[\\]}]$/) !== null // is like JSON\n ) {\n let parsedValue = JSON.parse(object[objectKey]);\n if ( typeof parsedValue === 'object' ) {\n object[objectKey] = parsedValue;\n }\n }\n }\n }\n }\n\n return object;\n }\n}\n// eslint-disable-next-line require-jsdoc\nclass ApbctAjax extends ApbctXhr {\n // eslint-disable-next-line require-jsdoc\n constructor(...args) {\n args = args[0];\n args.data._ajax_nonce = selectActualNonce();\n super(args);\n }\n}\n// eslint-disable-next-line require-jsdoc\nclass ApbctRest extends ApbctXhr {\n static default_route = ctPublicFunctions._rest_url + 'cleantalk-antispam/v1/';\n route = '';\n\n // eslint-disable-next-line require-jsdoc\n constructor(...args) {\n args = args[0];\n const nonce = selectActualNonce();\n args.url = ApbctRest.default_route + args.route;\n args.headers = {\n 'X-WP-Nonce': nonce,\n };\n super(args);\n }\n}\n\n// add hasOwn\nif (!Object.prototype.hasOwn) {\n Object.defineProperty(Object.prototype, 'hasOwn', { // eslint-disable-line\n value: function(property) {\n return Object.prototype.hasOwnProperty.call(this, property);\n },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n}\n\n/**\n * Class collecting user activity data\n *\n */\n// eslint-disable-next-line no-unused-vars, require-jsdoc\nclass ApbctCollectingUserActivity {\n elementBody = document.querySelector('body');\n collectionForms = document.forms;\n /**\n * Constructor\n */\n constructor() {\n this.setListeners();\n }\n\n /**\n * Set listeners\n */\n setListeners() {\n this.elementBody.addEventListener('click', (event) => {\n this.checkElementInForms(event, 'addClicks');\n });\n\n this.elementBody.addEventListener('mouseup', (event) => {\n const selectedType = document.getSelection().type.toString();\n if (selectedType == 'Range') {\n this.addSelected();\n }\n });\n\n this.elementBody.addEventListener('mousemove', (event) => {\n this.checkElementInForms(event, 'trackMouseMovement');\n });\n }\n\n /**\n * Checking if there is an element in the form\n * @param {object} event\n * @param {string} addTarget\n */\n checkElementInForms(event, addTarget) {\n let resultCheck;\n for (let i = 0; i < this.collectionForms.length; i++) {\n if (\n event.target.outerHTML.length > 0 &&\n this.collectionForms[i].innerHTML.length > 0\n ) {\n resultCheck = this.collectionForms[i].innerHTML.indexOf(event.target.outerHTML);\n } else {\n resultCheck = -1;\n }\n }\n\n switch (addTarget) {\n case 'addClicks':\n if (resultCheck < 0) {\n this.addClicks();\n }\n break;\n case 'trackMouseMovement':\n if (resultCheck > -1) {\n this.trackMouseMovement();\n }\n break;\n default:\n break;\n }\n }\n\n /**\n * Add clicks\n */\n addClicks() {\n if (document.ctCollectingUserActivityData) {\n if (document.ctCollectingUserActivityData.clicks) {\n document.ctCollectingUserActivityData.clicks++;\n } else {\n document.ctCollectingUserActivityData.clicks = 1;\n }\n return;\n }\n\n document.ctCollectingUserActivityData = {clicks: 1};\n }\n\n /**\n * Add selected\n */\n addSelected() {\n if (document.ctCollectingUserActivityData) {\n if (document.ctCollectingUserActivityData.selected) {\n document.ctCollectingUserActivityData.selected++;\n } else {\n document.ctCollectingUserActivityData.selected = 1;\n }\n return;\n }\n\n document.ctCollectingUserActivityData = {selected: 1};\n }\n\n /**\n * Track mouse movement\n */\n trackMouseMovement() {\n if (!document.ctCollectingUserActivityData) {\n document.ctCollectingUserActivityData = {};\n }\n if (!document.ctCollectingUserActivityData.mouseMovementsInsideForm) {\n document.ctCollectingUserActivityData.mouseMovementsInsideForm = false;\n }\n\n document.ctCollectingUserActivityData.mouseMovementsInsideForm = true;\n }\n}\n\n/**\n * @param {object|array|string} cookies\n * @param {object|array|string} value\n * @param {string|number} expires\n */\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nfunction ctSetCookie( cookies, value, expires ) {\n let listOfCookieNamesToForceAlt = [\n 'ct_sfw_pass_key',\n 'ct_sfw_passed',\n 'wordpress_apbct_antibot',\n 'apbct_anticrawler_passed',\n 'apbct_bot_detector_exist',\n 'apbct_antiflood_passed',\n 'apbct_email_encoder_passed',\n ];\n\n let skipAlt = false;\n\n if ( typeof cookies === 'string') {\n skipAlt = cookies === 'ct_pointer_data';\n if ( typeof value === 'string' || typeof value === 'number' ) {\n cookies = [[cookies, value, expires]];\n }\n }\n\n // Cookies disabled\n if ( ctPublicFunctions.data__cookies_type === 'none' ) {\n let forcedAltCookiesSet = [];\n cookies.forEach( function(item) {\n if (listOfCookieNamesToForceAlt.indexOf(item[0]) !== -1) {\n forcedAltCookiesSet.push(item);\n } else {\n apbctLocalStorage.set(item[0], item[1]);\n }\n });\n\n // if cookies from list found use alt cookies for this selection set\n if ( forcedAltCookiesSet.length > 0 ) {\n ctSetAlternativeCookie(forcedAltCookiesSet);\n }\n\n // If problem integration forms detected use alt cookies for whole cookies set\n if ( ctPublic.force_alt_cookies && !skipAlt) {\n // do it just once\n ctSetAlternativeCookie(cookies, {forceAltCookies: true});\n } else {\n ctNoCookieAttachHiddenFieldsToForms();\n }\n\n // Using traditional cookies\n } else if ( ctPublicFunctions.data__cookies_type === 'native' ) {\n // If problem integration forms detected use alt cookies for whole cookies set\n if ( ctPublic.force_alt_cookies && !skipAlt) {\n // do it just once\n ctSetAlternativeCookie(cookies, {forceAltCookies: true});\n }\n cookies.forEach( function(item) {\n const _expires = typeof item[2] !== 'undefined' ? 'expires=' + expires + '; ' : '';\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = ctPublicFunctions.cookiePrefix +\n item[0] +\n '=' +\n encodeURIComponent(item[1]) +\n '; ' +\n _expires +\n 'path=/; samesite=lax' +\n ctSecure;\n });\n\n // Using alternative cookies\n } else if ( ctPublicFunctions.data__cookies_type === 'alternative' && !skipAlt ) {\n ctSetAlternativeCookie(cookies);\n }\n}\n\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nfunction ctDetectForcedAltCookiesForms() {\n let ninjaFormsSign = document.querySelectorAll('#tmpl-nf-layout').length > 0;\n let elementorUltimateAddonsRegister = document.querySelectorAll('.uael-registration-form-wrapper').length > 0;\n let smartFormsSign = document.querySelectorAll('script[id*=\"smart-forms\"]').length > 0;\n let jetpackCommentsForm = document.querySelectorAll('iframe[name=\"jetpack_remote_comment\"]').length > 0;\n let cwginstockForm = document.querySelectorAll('.cwginstock-subscribe-form').length > 0;\n let userRegistrationProForm = document.querySelectorAll('div[id^=\"user-registration-form\"]').length > 0;\n let etPbDiviSubscriptionForm = document.querySelectorAll('div[class^=\"et_pb_newsletter_form\"]').length > 0;\n let fluentBookingApp = document.querySelectorAll('div[class^=\"fluent_booking_app\"]').length > 0;\n let bloomPopup = document.querySelectorAll('div[class^=\"et_bloom_form_container\"]').length > 0;\n let pafeFormsFormElementor = document.querySelectorAll('div[class*=\"pafe-form\"]').length > 0;\n let otterForm = document.querySelectorAll('div [class*=\"otter-form\"]').length > 0;\n ctPublic.force_alt_cookies = smartFormsSign ||\n ninjaFormsSign ||\n jetpackCommentsForm ||\n elementorUltimateAddonsRegister ||\n cwginstockForm ||\n userRegistrationProForm ||\n etPbDiviSubscriptionForm ||\n fluentBookingApp ||\n pafeFormsFormElementor ||\n bloomPopup ||\n otterForm;\n\n setTimeout(function() {\n if (!ctPublic.force_alt_cookies) {\n let bookingPress = document.querySelectorAll('main[id^=\"bookingpress_booking_form\"]').length > 0;\n ctPublic.force_alt_cookies = bookingPress;\n }\n }, 1000);\n}\n\n// eslint-disable-next-line require-jsdoc\nfunction ctSetAlternativeCookie(cookies, params) {\n if (typeof (getJavascriptClientData) === 'function' ) {\n // reprocess already gained cookies data\n if (Array.isArray(cookies)) {\n cookies = getJavascriptClientData(cookies);\n }\n } else {\n console.log('APBCT ERROR: getJavascriptClientData() is not loaded');\n }\n\n try {\n cookies = JSON.parse(cookies);\n } catch (e) {\n console.log('APBCT ERROR: JSON parse error:' + e);\n return;\n }\n\n if (!cookies.apbct_site_referer) {\n cookies.apbct_site_referer = location.href;\n }\n\n const callback = params && params.callback || null;\n const onErrorCallback = params && params.onErrorCallback || null;\n\n if ( params && params.forceAltCookies ) {\n cookies.apbct_force_alt_cookies = true;\n }\n\n // Using REST API handler\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n // fix for url encoded cookie apbct_pixel_url on REST route\n if (typeof cookies.apbct_pixel_url === 'string' &&\n cookies.apbct_pixel_url.indexOf('%3A') !== -1\n ) {\n cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url);\n }\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n\n // Using AJAX request and handler\n } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) {\n apbct_public_sendAJAX(\n {\n action: 'apbct_alt_session__save__AJAX',\n cookies: cookies,\n },\n {\n notJson: 1,\n callback: callback,\n onErrorCallback: onErrorCallback,\n beforeSend: function(xhr) {\n xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow');\n },\n },\n );\n }\n}\n\n/**\n * Get cookie by name\n * @param name\n * @return {string|undefined}\n */\n// eslint-disable-next-line require-jsdoc,no-unused-vars\nfunction ctGetCookie(name) {\n let matches = document.cookie.match(new RegExp(\n '(?:^|; )' + name.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g, '\\\\$1') + '=([^;]*)',\n ));\n return matches ? decodeURIComponent(matches[1]) : undefined;\n}\n\n// eslint-disable-next-line require-jsdoc,no-unused-vars\nfunction ctDeleteCookie(cookieName) {\n // Cookies disabled\n if ( ctPublicFunctions.data__cookies_type === 'none' ) {\n return;\n\n // Using traditional cookies\n } else if ( ctPublicFunctions.data__cookies_type === 'native' ) {\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = cookieName + '=\"\"; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax' + ctSecure;\n\n // Using alternative cookies\n } else if ( ctPublicFunctions.data__cookies_type === 'alternative' ) {\n // @ToDo implement this logic\n }\n}\n\n// eslint-disable-next-line require-jsdoc,camelcase\nfunction apbct_public_sendAJAX(data, params, obj) {\n // Default params\n let _params = [];\n _params['callback'] = params.callback || null;\n _params['onErrorCallback'] = params.onErrorCallback || null;\n _params['callback_context'] = params.callback_context || null;\n _params['callback_params'] = params.callback_params || null;\n _params['async'] = params.async || true;\n _params['notJson'] = params.notJson || null;\n _params['responseType']= params.notJson ? 'text' : 'json';\n _params['timeout'] = params.timeout || 15000;\n _params['obj'] = obj || null;\n _params['button'] = params.button || null;\n _params['spinner'] = params.spinner || null;\n _params['progressbar'] = params.progressbar || null;\n _params['silent'] = params.silent || null;\n _params['no_nonce'] = params.no_nonce || null;\n _params['data'] = data;\n _params['url'] = ctPublicFunctions._ajax_url;\n const nonce = selectActualNonce();\n\n if (typeof (data) === 'string') {\n if ( ! _params['no_nonce'] ) {\n _params['data'] = _params['data'] + '&_ajax_nonce=' + nonce;\n }\n _params['data'] = _params['data'] + '&no_cache=' + Math.random();\n } else {\n if ( ! _params['no_nonce'] ) {\n _params['data']._ajax_nonce = nonce;\n }\n _params['data'].no_cache = Math.random();\n }\n\n new ApbctCore().ajax(_params);\n}\n\n// eslint-disable-next-line require-jsdoc,camelcase\nfunction apbct_public_sendREST( route, params ) {\n let _params = [];\n _params['route'] = route;\n _params['callback'] = params.callback || null;\n _params['onErrorCallback'] = params.onErrorCallback || null;\n _params['data'] = params.data || [];\n _params['method'] = params.method || 'POST';\n\n new ApbctCore().rest(_params);\n}\n\n/**\n * Generate unique ID\n * @return {string}\n */\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nfunction apbctGenerateUniqueID() {\n return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10);\n}\n\nlet apbctLocalStorage = {\n get: function(key, property) {\n if ( typeof property === 'undefined' ) {\n property = 'value';\n }\n const storageValue = localStorage.getItem(key);\n if ( storageValue !== null ) {\n try {\n const json = JSON.parse(storageValue);\n if ( json.hasOwnProperty(property) ) {\n try {\n // if property can be parsed as JSON - do it\n return JSON.parse( json[property] );\n } catch (e) {\n // if not - return string of value\n return json[property].toString();\n }\n } else {\n return json;\n }\n } catch (e) {\n return storageValue;\n }\n }\n return false;\n },\n set: function(key, value, isJson = true) {\n if (isJson) {\n let objToSave = {'value': JSON.stringify(value), 'timestamp': Math.floor(new Date().getTime() / 1000)};\n localStorage.setItem(key, JSON.stringify(objToSave));\n } else {\n localStorage.setItem(key, value);\n }\n },\n isAlive: function(key, maxLifetime) {\n if ( typeof maxLifetime === 'undefined' ) {\n maxLifetime = 86400;\n }\n const keyTimestamp = this.get(key, 'timestamp');\n return keyTimestamp + maxLifetime > Math.floor(new Date().getTime() / 1000);\n },\n isSet: function(key) {\n return localStorage.getItem(key) !== null;\n },\n delete: function(key) {\n localStorage.removeItem(key);\n },\n getCleanTalkData: function() {\n let data = {};\n for (let i=0; i<localStorage.length; i++) {\n let key = localStorage.key(i);\n if (key.indexOf('ct_') !==-1 || key.indexOf('apbct_') !==-1) {\n data[key.toString()] = apbctLocalStorage.get(key);\n }\n }\n return data;\n },\n\n};\n\nlet apbctSessionStorage = {\n get: function(key, property) {\n if ( typeof property === 'undefined' ) {\n property = 'value';\n }\n const storageValue = sessionStorage.getItem(key);\n if ( storageValue !== null ) {\n try {\n const json = JSON.parse(storageValue);\n return json.hasOwnProperty(property) ? JSON.parse(json[property]) : json;\n } catch (e) {\n return storageValue;\n }\n }\n return false;\n },\n set: function(key, value, isJson = true) {\n if (isJson) {\n let objToSave = {'value': JSON.stringify(value), 'timestamp': Math.floor(new Date().getTime() / 1000)};\n sessionStorage.setItem(key, JSON.stringify(objToSave));\n } else {\n sessionStorage.setItem(key, value);\n }\n },\n isSet: function(key) {\n return sessionStorage.getItem(key) !== null;\n },\n delete: function(key) {\n sessionStorage.removeItem(key);\n },\n getCleanTalkData: function() {\n let data = {};\n for (let i=0; i<sessionStorage.length; i++) {\n let key = sessionStorage.key(i);\n if (key.indexOf('ct_') !==-1 || key.indexOf('apbct_') !==-1) {\n data[key.toString()] = apbctSessionStorage.get(key);\n }\n }\n return data;\n },\n};\n\n/**\n * Handler for -webkit based browser that listen for a custom\n * animation create using the :pseudo-selector in the stylesheet.\n * Works with Chrome, Safari\n *\n * @param {AnimationEvent} event\n */\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nfunction apbctOnAnimationStart(event) {\n ('onautofillstart' === event.animationName) ?\n apbctAutocomplete(event.target) : apbctCancelAutocomplete(event.target);\n}\n\n/**\n * Handler for non-webkit based browser that listen for input\n * event to trigger the autocomplete-cancel process.\n * Works with Firefox, Edge, IE11\n *\n * @param {InputEvent} event\n */\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nfunction apbctOnInput(event) {\n ('insertReplacementText' === event.inputType || !('data' in event)) ?\n apbctAutocomplete(event.target) : apbctCancelAutocomplete(event.target);\n}\n\n/**\n * Manage an input element when its value is autocompleted\n * by the browser in the following steps:\n * - add [autocompleted] attribute from event.target\n * - create 'onautocomplete' cancelable CustomEvent\n * - dispatch the Event\n *\n * @param {HtmlInputElement} element\n */\nfunction apbctAutocomplete(element) {\n if (element.hasAttribute('autocompleted')) return;\n element.setAttribute('autocompleted', '');\n\n let event = new window.CustomEvent('onautocomplete', {\n bubbles: true, cancelable: true, detail: null,\n });\n\n // no autofill if preventDefault is called\n if (!element.dispatchEvent(event)) {\n element.value = '';\n }\n}\n\n/**\n * Manage an input element when its autocompleted value is\n * removed by the browser in the following steps:\n * - remove [autocompleted] attribute from event.target\n * - create 'onautocomplete' non-cancelable CustomEvent\n * - dispatch the Event\n *\n * @param {HtmlInputElement} element\n */\nfunction apbctCancelAutocomplete(element) {\n if (!element.hasAttribute('autocompleted')) return;\n element.removeAttribute('autocompleted');\n\n // dispatch event\n element.dispatchEvent(new window.CustomEvent('onautocomplete', {\n bubbles: true, cancelable: false, detail: null,\n }));\n}\n\n/**\n * ApbctForceProtection\n */\nclass ApbctForceProtection {\n wrappers = [];\n\n /**\n * Constructor\n */\n constructor() {\n this.wrappers = this.findWrappers();\n\n if (this.wrappers.length < 1) {\n return;\n }\n\n this.checkBot();\n }\n\n /**\n * Find wrappers\n * @return {HTMLElement[]}\n */\n findWrappers() {\n return document.querySelectorAll('div.ct-encoded-form-wrapper');\n }\n\n /**\n * Check bot\n * @return {void}\n */\n checkBot() {\n let data = {\n event_javascript_data: getJavascriptClientData(),\n post_url: document.location.href,\n referrer: document.referrer,\n };\n\n if (ctPublicFunctions.data__ajax_type === 'rest') {\n apbct_public_sendREST('force_protection_check_bot', {\n data,\n method: 'POST',\n callback: (result) => this.checkBotCallback(result),\n });\n } else if (ctPublicFunctions.data__ajax_type === 'admin_ajax') {\n data.action = 'apbct_force_protection_check_bot';\n apbct_public_sendAJAX(data, {callback: (result) => this.checkBotCallback(result)});\n }\n }\n\n /**\n * Check bot callback\n * @param {Object} result\n * @return {void}\n */\n checkBotCallback(result) {\n // if error occurred\n if (result.data && result.data.status && result.data.status !== 200) {\n console.log('ApbctForceProtection connection error occurred');\n this.decodeForms();\n return;\n }\n\n if (typeof result === 'string') {\n try {\n result = JSON.parse(result);\n } catch (e) {\n console.log('ApbctForceProtection decodeForms error', e);\n this.decodeForms();\n return;\n }\n }\n\n if (typeof result === 'object' && result.allow && result.allow === 1) {\n this.decodeForms();\n } else {\n this.showMessageForBot(result.message);\n }\n }\n\n /**\n * Decode forms\n * @return {void}\n */\n decodeForms() {\n let form;\n\n this.wrappers.forEach((wrapper) => {\n form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm;\n\n try {\n if (form && typeof(form) == 'string') {\n wrapper.outerHTML = atob(form);\n }\n } catch (error) {\n console.log(error);\n }\n });\n }\n\n /**\n * Show message for bot\n * @param {string} message\n * @return {void}\n */\n showMessageForBot(message) {\n let form;\n\n this.wrappers.forEach((wrapper) => {\n form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm;\n if (form) {\n wrapper.outerHTML = '<div class=\"ct-encoded-form-forbidden\">' + message + '</div>';\n }\n });\n }\n}\n\n/**\n * Force protection\n */\nfunction apbctForceProtect() {\n if (ctPublic.settings__forms__force_protection && typeof ApbctForceProtection !== 'undefined') {\n new ApbctForceProtection();\n }\n}\n\nif (ctPublic.data__key_is_ok) {\n if (document.readyState !== 'loading') {\n apbctForceProtect();\n } else {\n apbct_attach_event_handler(document, 'DOMContentLoaded', apbctForceProtect);\n }\n}\n\n/**\n * Class for gathering data about user typing.\n *\n * ==============================\n * isAutoFill - only person can use auto fill\n * isUseBuffer - use buffer for fill current field\n * ==============================\n * lastKeyTimestamp - timestamp of last key press in current field\n * speedDelta - change for each key press in current field,\n * as difference between current and previous key press timestamps,\n * robots in general have constant speed of typing.\n * If speedDelta is constant for each key press in current field,\n * so, speedDelta will be roughly to 0, then it is robot.\n * ==============================\n */\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nclass CTTypoData {\n fieldData = {\n isAutoFill: false,\n isUseBuffer: false,\n speedDelta: 0,\n firstKeyTimestamp: 0,\n lastKeyTimestamp: 0,\n lastDelta: 0,\n countOfKey: 0,\n };\n\n fields = document.querySelectorAll('textarea[name=comment]');\n\n data = [];\n\n /**\n * Gather fields.\n */\n gatheringFields() {\n let fieldSet = Array.prototype.slice.call(this.fields);\n fieldSet.forEach((field, i) => {\n this.data.push(Object.assign({}, this.fieldData));\n });\n }\n\n /**\n * Set listeners.\n */\n setListeners() {\n this.fields.forEach((field, i) => {\n field.addEventListener('paste', () => {\n this.data[i].isUseBuffer = true;\n });\n });\n\n this.fields.forEach((field, i) => {\n field.addEventListener('onautocomplete', () => {\n this.data[i].isAutoFill = true;\n });\n });\n\n this.fields.forEach((field, i) => {\n field.addEventListener('input', () => {\n this.data[i].countOfKey++;\n let time = + new Date();\n let currentDelta = 0;\n\n if (this.data[i].countOfKey === 1) {\n this.data[i].lastKeyTimestamp = time;\n this.data[i].firstKeyTimestamp = time;\n return;\n }\n\n currentDelta = time - this.data[i].lastKeyTimestamp;\n if (this.data[i].countOfKey === 2) {\n this.data[i].lastKeyTimestamp = time;\n this.data[i].lastDelta = currentDelta;\n return;\n }\n\n if (this.data[i].countOfKey > 2) {\n this.data[i].speedDelta += Math.abs(this.data[i].lastDelta - currentDelta);\n this.data[i].lastKeyTimestamp = time;\n this.data[i].lastDelta = currentDelta;\n }\n });\n });\n }\n}\n\n// eslint-disable-next-line camelcase\nconst ctDate = new Date();\nconst ctTimeMs = new Date().getTime();\nlet ctMouseEventTimerFlag = true; // Reading interval flag\nlet ctMouseData = [];\nlet ctMouseDataCounter = 0;\nlet ctCheckedEmails = {};\nlet ctCheckedEmailsExist = {};\nlet ctMouseReadInterval;\nlet ctMouseWriteDataInterval;\nlet tokenCheckerIntervalId;\nlet botDetectorLogLastUpdate = 0;\nlet botDetectorLogEventTypesCollected = [];\n\n// eslint-disable-next-line require-jsdoc,camelcase\nfunction apbct_attach_event_handler(elem, event, callback) {\n if (typeof window.addEventListener === 'function') elem.addEventListener(event, callback);\n else elem.attachEvent(event, callback);\n}\n// eslint-disable-next-line require-jsdoc,camelcase\nfunction apbct_remove_event_handler(elem, event, callback) {\n if (typeof window.removeEventListener === 'function') elem.removeEventListener(event, callback);\n else elem.detachEvent(event, callback);\n}\n\n// Writing first key press timestamp\nconst ctFunctionFirstKey = function output(event) {\n let KeyTimestamp = Math.floor(new Date().getTime() / 1000);\n ctSetCookie('ct_fkp_timestamp', KeyTimestamp);\n ctKeyStopStopListening();\n};\n\n/**\n * Run cron jobs\n */\n// forms handler cron\ncronFormsHandler(2000);\n\n// bot_detector frontend_data log alt session saving cron\nif (\n ctPublicFunctions.hasOwnProperty('data__bot_detector_enabled') &&\n ctPublicFunctions.data__bot_detector_enabled == 1 &&\n ctPublicFunctions.hasOwnProperty('data__frontend_data_log_enabled') &&\n ctPublicFunctions.data__frontend_data_log_enabled == 1\n) {\n sendBotDetectorLogToAltSessions(1000);\n}\n/**\n * Cron jobs end.\n */\n\n// mouse read\nif (ctPublic.data__key_is_ok) {\n // Reading interval\n ctMouseReadInterval = setInterval(function() {\n ctMouseEventTimerFlag = true;\n }, 150);\n\n // Writting interval\n ctMouseWriteDataInterval = setInterval(function() {\n ctSetCookie('ct_pointer_data', JSON.stringify(ctMouseData));\n }, 1200);\n}\n\n// Logging mouse position each 150 ms\nconst ctFunctionMouseMove = function output(event) {\n ctSetMouseMoved();\n if (ctMouseEventTimerFlag === true) {\n ctMouseData.push([\n Math.round(event.clientY),\n Math.round(event.clientX),\n Math.round(new Date().getTime() - ctTimeMs),\n ]);\n\n ctMouseDataCounter++;\n ctMouseEventTimerFlag = false;\n if (ctMouseDataCounter >= 50) {\n ctMouseStopData();\n }\n }\n};\n\n/**\n * Do handle periodical actions.\n * @param {int} cronStartTimeout Time to go before cron start.\n */\nfunction cronFormsHandler(cronStartTimeout = 2000) {\n setTimeout(function() {\n setInterval(function() {\n restartFieldsListening();\n restartBotDetectorEventTokenAttach();\n }, 2000);\n }, cronStartTimeout);\n}\n\n/**\n * Send BotDetector logs data to alternative sessions.\n * If log_last_update has changed and log contains new event types, the log will be sent to the alternative sessions.\n * @param {int} cronStartTimeout delay before cron start\n * @param {int} interval check fires on interval\n */\nfunction sendBotDetectorLogToAltSessions(cronStartTimeout = 3000, interval = 1000) {\n setTimeout(function() {\n setInterval(function() {\n const currentLog = apbctLocalStorage.get('ct_bot_detector_frontend_data_log');\n if (needsSaveLogToAltSessions(currentLog)) {\n botDetectorLogLastUpdate = currentLog.log_last_update;\n // the log will be taken from javascriptclientdata\n ctSetAlternativeCookie([], {forceAltCookies: true});\n }\n }, interval);\n }, cronStartTimeout);\n}\n\n/**\n * Check if the log needs to be saved to the alt sessions. If the log has new event types, it will be saved.\n * @param {object} currentLog\n * @return {boolean}\n */\nfunction needsSaveLogToAltSessions(currentLog) {\n if (\n currentLog && currentLog.hasOwnProperty('log_last_update') &&\n botDetectorLogLastUpdate !== currentLog.log_last_update\n ) {\n try {\n for (let i = 0; i < currentLog.records.length; i++) {\n const currentType = currentLog.records[i].frontend_data.js_event;\n // check if this event type was already collected\n if (currentType !== undefined && botDetectorLogEventTypesCollected.includes(currentType)) {\n continue;\n }\n // add new event type to collection, this type will be sent to the alt sessions further\n botDetectorLogEventTypesCollected.push(currentType);\n return true;\n }\n } catch (e) {\n console.log('APBCT: bot detector log collection error: ' . e.toString());\n }\n }\n return false;\n}\n\n/**\n * Restart event_token attachment if some forms load after document ready.\n */\nfunction restartBotDetectorEventTokenAttach() {\n // List there any new conditions, right now it works only for LatePoint forms.\n // Probably, we can remove this condition at all, because setEventTokenField()\n // checks all the forms without the field\n const doAttach = (\n document.getElementsByClassName('latepoint-form').length > 0 ||\n document.getElementsByClassName('mec-booking-form-container').length > 0 ||\n document.getElementById('login-form-popup') !== null\n );\n\n try {\n if ( doAttach ) {\n // get token from LS\n const token = apbctLocalStorage.get('bot_detector_event_token');\n if (typeof setEventTokenField === 'function' && token !== undefined && token.length === 64) {\n setEventTokenField(token);\n }\n // probably there we could use a new botDetectorInit if token is not found\n }\n } catch (e) {\n console.log(e.toString());\n }\n}\n\n/**\n * Stop mouse observing function\n */\nfunction ctMouseStopData() {\n apbct_remove_event_handler(document, 'mousemove', ctFunctionMouseMove);\n clearInterval(ctMouseReadInterval);\n clearInterval(ctMouseWriteDataInterval);\n}\n\n/**\n * Stop key listening function\n */\nfunction ctKeyStopStopListening() {\n apbct_remove_event_handler(document, 'mousedown', ctFunctionFirstKey);\n apbct_remove_event_handler(document, 'keydown', ctFunctionFirstKey);\n}\n\n/**\n * @param {mixed} e\n */\nfunction checkEmail(e) {\n let currentEmail = e.target.value;\n\n if (! /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(currentEmail)) {\n return;\n }\n\n if (currentEmail && !(currentEmail in ctCheckedEmails)) {\n // Using REST API handler\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n apbct_public_sendREST(\n 'check_email_before_post',\n {\n method: 'POST',\n data: {'email': currentEmail},\n callback: function(result) {\n if (result.result) {\n ctCheckedEmails[currentEmail] = {\n 'result': result.result,\n 'timestamp': Date.now() / 1000 |0,\n };\n ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails));\n }\n },\n },\n );\n // Using AJAX request and handler\n } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) {\n apbct_public_sendAJAX(\n {\n action: 'apbct_email_check_before_post',\n email: currentEmail,\n },\n {\n callback: function(result) {\n if (result.result) {\n ctCheckedEmails[currentEmail] = {\n 'result': result.result,\n 'timestamp': Date.now() / 1000 |0,\n };\n ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails));\n }\n },\n },\n );\n }\n }\n}\n\n/**\n * @param {mixed} e\n */\nfunction checkEmailExist(e) {\n let currentEmail = e.target.value;\n let result;\n\n if (!currentEmail || !currentEmail.length) {\n let envelope = document.getElementById('apbct-check_email_exist-block');\n if (envelope) {\n envelope.remove();\n }\n let hint = document.getElementById('apbct-check_email_exist-popup_description');\n if (hint) {\n hint.remove();\n }\n return;\n }\n\n if (! /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(currentEmail)) {\n return;\n }\n\n if (currentEmail in ctCheckedEmailsExist) {\n result = ctCheckedEmailsExist[currentEmail];\n getResultCheckEmailExist(e, result, currentEmail);\n\n return;\n }\n\n viewCheckEmailExist(e, 'load');\n\n // Using REST API handler\n ctPublicFunctions.data__ajax_type = 'rest';\n if (ctPublicFunctions.data__ajax_type === 'rest') {\n apbct_public_sendREST(\n 'check_email_exist_post',\n {\n method: 'POST',\n data: {'email': currentEmail},\n callback: function(result) {\n getResultCheckEmailExist(e, result, currentEmail);\n },\n },\n );\n\n return;\n }\n\n if (ctPublicFunctions.data__ajax_type === 'admin_ajax') {\n apbct_public_sendAJAX(\n {\n action: 'apbct_email_check_exist_post',\n email: currentEmail,\n },\n {\n callback: function(result) {\n getResultCheckEmailExist(e, result, currentEmail);\n },\n },\n );\n }\n}\n\n/**\n * @param {mixed} e\n * @param {mixed} result\n * @param {string} currentEmail\n */\nfunction getResultCheckEmailExist(e, result, currentEmail) {\n if (!result || !result.result) {\n return;\n }\n\n result = result.result;\n\n ctCheckedEmailsExist[currentEmail] = {\n 'result': result,\n 'timestamp': Date.now() / 1000 |0,\n };\n\n if (result.result == 'EXISTS') {\n viewCheckEmailExist(e, 'good_email', result.text_result);\n } else {\n viewCheckEmailExist(e, 'bad_email', result.text_result);\n }\n\n ctSetCookie('ct_checked_emails_exist', JSON.stringify(ctCheckedEmailsExist));\n}\n\n/**\n * @param {mixed} e\n * @param {string} state\n * @param {string} textResult\n */\nfunction viewCheckEmailExist(e, state, textResult) {\n let parentElement = e.target.parentElement;\n let inputEmail = parentElement.querySelector('[name*=\"email\"]');\n\n if (!inputEmail) {\n return;\n }\n\n let envelope;\n let hint;\n\n // envelope\n if (document.getElementById('apbct-check_email_exist-block')) {\n envelope = document.getElementById('apbct-check_email_exist-block');\n } else {\n envelope = document.createElement('div');\n envelope.setAttribute('class', 'apbct-check_email_exist-block');\n envelope.setAttribute('id', 'apbct-check_email_exist-block');\n window.addEventListener('scroll', function() {\n envelope.style.top = inputEmail.getBoundingClientRect().top + 'px';\n });\n parentElement.after(envelope);\n }\n\n // hint\n if (document.getElementById('apbct-check_email_exist-popup_description')) {\n hint = document.getElementById('apbct-check_email_exist-popup_description');\n } else {\n hint = document.createElement('div');\n hint.setAttribute('class', 'apbct-check_email_exist-popup_description');\n hint.setAttribute('id', 'apbct-check_email_exist-popup_description');\n window.addEventListener('scroll', function() {\n hint.style.top = envelope.getBoundingClientRect().top + 'px';\n });\n\n envelope.after(hint);\n }\n\n ctEmailExistSetElementsPositions();\n\n window.addEventListener('resize', function(event) {\n ctEmailExistSetElementsPositions();\n });\n\n switch (state) {\n case 'load':\n envelope.classList.remove('apbct-check_email_exist-good_email', 'apbct-check_email_exist-bad_email');\n envelope.classList.add('apbct-check_email_exist-load');\n break;\n\n case 'good_email':\n envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-bad_email');\n envelope.classList.add('apbct-check_email_exist-good_email');\n\n envelope.onmouseover = function() {\n hint.textContent = textResult;\n hint.style.display = 'block';\n hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px';\n hint.style.color = '#1C7129';\n };\n\n envelope.onmouseout = function() {\n hint.style.display = 'none';\n };\n\n break;\n\n case 'bad_email':\n envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-good_email');\n envelope.classList.add('apbct-check_email_exist-bad_email');\n\n envelope.onmouseover = function() {\n hint.textContent = textResult;\n hint.style.display = 'block';\n hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px';\n hint.style.color = '#E01111';\n };\n\n envelope.onmouseout = function() {\n hint.style.display = 'none';\n };\n\n break;\n\n default:\n break;\n }\n}\n\n/**\n * Shift the envelope to the input field on resizing the window\n * @param {object} envelope\n * @param {object} inputEmail\n */\nfunction ctEmailExistSetElementsPositions() {\n const envelopeWidth = 35;\n const inputEmail = document.querySelector('comment-form input[name*=\"email\"], input#email');\n if (!inputEmail) {\n return;\n }\n const envelope = document.getElementById('apbct-check_email_exist-block');\n if (envelope) {\n envelope.style.top = inputEmail.getBoundingClientRect().top + 'px';\n envelope.style.left = inputEmail.getBoundingClientRect().right - envelopeWidth - 10 + 'px';\n envelope.style.height = inputEmail.offsetHeight + 'px';\n envelope.style.width = envelopeWidth + 'px';\n }\n\n const hint = document.getElementById('apbct-check_email_exist-popup_description');\n if (hint) {\n hint.style.width = inputEmail.offsetWidth + 'px';\n hint.style.left = inputEmail.getBoundingClientRect().left + 'px';\n }\n}\n\n/**\n * @return {bool}\n */\nfunction ctIsDrawPixel() {\n if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') {\n return false;\n }\n\n return +ctPublic.pixel__enabled ||\n (ctPublic.data__cookies_type === 'none' && document.querySelectorAll('img#apbct_pixel').length === 0) ||\n (ctPublic.data__cookies_type === 'alternative' && document.querySelectorAll('img#apbct_pixel').length === 0);\n}\n\n/**\n * @param {string} pixelUrl\n * @return {bool}\n */\nfunction ctSetPixelImg(pixelUrl) {\n if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') {\n return false;\n }\n ctSetCookie('apbct_pixel_url', pixelUrl);\n if ( ctIsDrawPixel() ) {\n if ( ! document.getElementById('apbct_pixel') ) {\n let insertedImg = document.createElement('img');\n insertedImg.setAttribute('alt', 'CleanTalk Pixel');\n insertedImg.setAttribute('title', 'CleanTalk Pixel');\n insertedImg.setAttribute('id', 'apbct_pixel');\n insertedImg.setAttribute('style', 'display: none; left: 99999px;');\n insertedImg.setAttribute('src', pixelUrl);\n apbct('body').append(insertedImg);\n }\n }\n}\n\n/**\n * @param {string} pixelUrl\n * @return {bool}\n */\nfunction ctSetPixelImgFromLocalstorage(pixelUrl) {\n if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') {\n return false;\n }\n if ( ctIsDrawPixel() ) {\n if ( ! document.getElementById('apbct_pixel') ) {\n let insertedImg = document.createElement('img');\n insertedImg.setAttribute('alt', 'CleanTalk Pixel');\n insertedImg.setAttribute('title', 'CleanTalk Pixel');\n insertedImg.setAttribute('id', 'apbct_pixel');\n insertedImg.setAttribute('style', 'display: none; left: 99999px;');\n insertedImg.setAttribute('src', decodeURIComponent(pixelUrl));\n apbct('body').append(insertedImg);\n }\n }\n}\n\n/**\n * ctGetPixelUrl\n * @return {bool}\n */\nfunction ctGetPixelUrl() {\n if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') {\n return false;\n }\n\n // Check if pixel is already in localstorage and is not outdated\n let localStoragePixelUrl = apbctLocalStorage.get('apbct_pixel_url');\n if ( localStoragePixelUrl !== false ) {\n if ( ! apbctLocalStorage.isAlive('apbct_pixel_url', 3600 * 3) ) {\n apbctLocalStorage.delete('apbct_pixel_url');\n } else {\n // if so - load pixel from localstorage and draw it skipping AJAX\n ctSetPixelImgFromLocalstorage(localStoragePixelUrl);\n return;\n }\n }\n // Using REST API handler\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n apbct_public_sendREST(\n 'apbct_get_pixel_url',\n {\n method: 'POST',\n callback: function(result) {\n if (result &&\n (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) {\n // set pixel url to localstorage\n if ( ! apbctLocalStorage.get('apbct_pixel_url') ) {\n // set pixel to the storage\n apbctLocalStorage.set('apbct_pixel_url', result);\n // update pixel data in the hidden fields\n ctNoCookieAttachHiddenFieldsToForms();\n }\n // then run pixel drawing\n ctSetPixelImg(result);\n }\n },\n },\n );\n // Using AJAX request and handler\n } else {\n apbct_public_sendAJAX(\n {\n action: 'apbct_get_pixel_url',\n },\n {\n notJson: true,\n callback: function(result) {\n if (result &&\n (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) {\n // set pixel url to localstorage\n if ( ! apbctLocalStorage.get('apbct_pixel_url') ) {\n // set pixel to the storage\n apbctLocalStorage.set('apbct_pixel_url', result);\n // update pixel data in the hidden fields\n ctNoCookieAttachHiddenFieldsToForms();\n }\n // then run pixel drawing\n ctSetPixelImg(result);\n }\n },\n beforeSend: function(xhr) {\n xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow');\n },\n },\n );\n }\n}\n\n/**\n * ctSetHasScrolled\n */\nfunction ctSetHasScrolled() {\n if ( ! apbctLocalStorage.isSet('ct_has_scrolled') || ! apbctLocalStorage.get('ct_has_scrolled') ) {\n ctSetCookie('ct_has_scrolled', 'true');\n apbctLocalStorage.set('ct_has_scrolled', true);\n }\n if (\n ctPublic.data__cookies_type === 'native' &&\n ctGetCookie('ct_has_scrolled') === undefined\n ) {\n ctSetCookie('ct_has_scrolled', 'true');\n }\n}\n\n/**\n * ctSetMouseMoved\n */\nfunction ctSetMouseMoved() {\n if ( ! apbctLocalStorage.isSet('ct_mouse_moved') || ! apbctLocalStorage.get('ct_mouse_moved') ) {\n ctSetCookie('ct_mouse_moved', 'true');\n apbctLocalStorage.set('ct_mouse_moved', true);\n }\n if (\n ctPublic.data__cookies_type === 'native' &&\n ctGetCookie('ct_mouse_moved') === undefined\n ) {\n ctSetCookie('ct_mouse_moved', 'true');\n }\n}\n\n/**\n * Restart listen fields to set ct_has_input_focused or ct_has_key_up\n */\nfunction restartFieldsListening() {\n if (!apbctLocalStorage.isSet('ct_has_input_focused') && !apbctLocalStorage.isSet('ct_has_key_up')) {\n ctStartFieldsListening();\n }\n}\n\n/**\n * init listeners for keyup and focus events\n */\nfunction ctStartFieldsListening() {\n if (\n (apbctLocalStorage.isSet('ct_has_key_up') || apbctLocalStorage.get('ct_has_key_up')) &&\n (apbctLocalStorage.isSet('ct_has_input_focused') || apbctLocalStorage.get('ct_has_input_focused')) &&\n (\n ctPublic.data__cookies_type === 'native' &&\n ctGetCookie('ct_has_input_focused') !== undefined &&\n ctGetCookie('ct_has_key_up') !== undefined\n )\n ) {\n // already set\n return;\n }\n\n let forms = ctGetPageForms();\n ctPublic.handled_fields = [];\n\n if (forms.length > 0) {\n for (let i = 0; i < forms.length; i++) {\n // handle only inputs and textareas\n const handledFormFields = forms[i].querySelectorAll('input,textarea');\n for (let i = 0; i < handledFormFields.length; i++) {\n if (handledFormFields[i].type !== 'hidden') {\n // collect handled fields to remove handler in the future\n ctPublic.handled_fields.push(handledFormFields[i]);\n // do attach handlers\n apbct_attach_event_handler(handledFormFields[i], 'focus', ctFunctionHasInputFocused);\n apbct_attach_event_handler(handledFormFields[i], 'keyup', ctFunctionHasKeyUp);\n }\n }\n }\n }\n}\n\n/**\n * stop listening keyup and focus\n * @param {string} eventName\n * @param {string} functionName\n */\nfunction ctStopFieldsListening(eventName, functionName) {\n if (typeof ctPublic.handled_fields !== 'undefined' && ctPublic.handled_fields.length > 0) {\n for (let i = 0; i < ctPublic.handled_fields.length; i++) {\n apbct_remove_event_handler(ctPublic.handled_fields[i], eventName, functionName);\n }\n }\n}\n\nlet ctFunctionHasInputFocused = function output(event) {\n ctSetHasInputFocused();\n ctStopFieldsListening('focus', ctFunctionHasInputFocused);\n};\n\nlet ctFunctionHasKeyUp = function output(event) {\n ctSetHasKeyUp();\n ctStopFieldsListening('keyup', ctFunctionHasKeyUp);\n};\n\n/**\n * set ct_has_input_focused ct_has_key_up cookies on session period\n */\nfunction ctSetHasInputFocused() {\n if ( ! apbctLocalStorage.isSet('ct_has_input_focused') || ! apbctLocalStorage.get('ct_has_input_focused') ) {\n apbctLocalStorage.set('ct_has_input_focused', true);\n }\n if (\n (\n (\n ctPublic.data__cookies_type === 'native' &&\n ctGetCookie('ct_has_input_focused') === undefined\n ) ||\n ctPublic.data__cookies_type === 'alternative'\n ) ||\n (\n ctPublic.data__cookies_type === 'none' &&\n (\n typeof ctPublic.force_alt_cookies !== 'undefined' ||\n (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies)\n )\n )\n ) {\n ctSetCookie('ct_has_input_focused', 'true');\n }\n}\n\n/**\n * ctSetHasKeyUp\n */\nfunction ctSetHasKeyUp() {\n if ( ! apbctLocalStorage.isSet('ct_has_key_up') || ! apbctLocalStorage.get('ct_has_key_up') ) {\n apbctLocalStorage.set('ct_has_key_up', true);\n }\n if (\n (\n (\n ctPublic.data__cookies_type === 'native' &&\n ctGetCookie('ct_has_key_up') === undefined\n ) ||\n ctPublic.data__cookies_type === 'alternative'\n ) ||\n (\n ctPublic.data__cookies_type === 'none' &&\n (\n typeof ctPublic.force_alt_cookies !== 'undefined' ||\n (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies)\n )\n )\n ) {\n ctSetCookie('ct_has_key_up', 'true');\n }\n}\n\nif (ctPublic.data__key_is_ok) {\n apbct_attach_event_handler(document, 'mousemove', ctFunctionMouseMove);\n apbct_attach_event_handler(document, 'mousedown', ctFunctionFirstKey);\n apbct_attach_event_handler(document, 'keydown', ctFunctionFirstKey);\n apbct_attach_event_handler(document, 'scroll', ctSetHasScrolled);\n}\n\n/**\n * Prepare block to intercept AJAX response\n */\nfunction apbctPrepareBlockForAjaxForms() {\n // eslint-disable-next-line require-jsdoc\n function ctPrepareBlockMessage(xhr) {\n if (xhr.responseText &&\n xhr.responseText.indexOf('\"apbct') !== -1 &&\n xhr.responseText.indexOf('DOCTYPE') === -1\n ) {\n try {\n ctParseBlockMessage(JSON.parse(xhr.responseText));\n } catch (e) {\n console.log(e.toString());\n }\n }\n }\n\n if (typeof jQuery !== 'undefined') {\n // Capturing responses and output block message for unknown AJAX forms\n if (typeof jQuery(document).ajaxComplete() !== 'function') {\n jQuery(document).on('ajaxComplete', function(event, xhr, settings) {\n ctPrepareBlockMessage(xhr);\n });\n } else {\n jQuery(document).ajaxComplete( function(event, xhr, settings) {\n ctPrepareBlockMessage(xhr);\n });\n }\n } else {\n // if Jquery is not avaliable try to use xhr\n if (typeof XMLHttpRequest !== 'undefined') {\n // Capturing responses and output block message for unknown AJAX forms\n document.addEventListener('readystatechange', function(event) {\n if (event.target.readyState === 4) {\n ctPrepareBlockMessage(event.target);\n }\n });\n }\n }\n}\n\n/**\n * For forced alt cookies.\n * If token is not added to the LS on apbc_ready, check every second if so and send token to the alt sessions.\n */\nfunction startForcedAltEventTokenChecker() {\n tokenCheckerIntervalId = setInterval( function() {\n if (apbctLocalStorage.get('event_token_forced_set') === '1') {\n clearInterval(tokenCheckerIntervalId);\n return;\n }\n let eventToken = apbctLocalStorage.get('bot_detector_event_token');\n if (eventToken) {\n ctSetAlternativeCookie([['ct_bot_detector_event_token', eventToken]], {forceAltCookies: true});\n apbctLocalStorage.set('event_token_forced_set', '1');\n clearInterval(tokenCheckerIntervalId);\n } else {\n }\n }, 1000);\n}\n\n\n/**\n * Ready function\n */\n// eslint-disable-next-line camelcase,require-jsdoc\nfunction apbct_ready() {\n document.addEventListener('gform_page_loaded', function() {\n if (\n typeof ctPublic.force_alt_cookies === 'undefined' ||\n (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies)\n ) {\n ctNoCookieAttachHiddenFieldsToForms();\n if (typeof setEventTokenField === 'function' && typeof botDetectorLocalStorage === 'function') {\n setEventTokenField(botDetectorLocalStorage.get('bot_detector_event_token'));\n }\n }\n });\n if ( ! ctPublic.wc_ajax_add_to_cart ) {\n apbctCheckAddToCartByGet();\n }\n\n apbctPrepareBlockForAjaxForms();\n\n // set session ID\n if (!apbctSessionStorage.isSet('apbct_session_id')) {\n const sessionID = apbctGenerateUniqueID();\n apbctSessionStorage.set('apbct_session_id', sessionID, false);\n apbctLocalStorage.set('apbct_page_hits', 1);\n if (document.referrer) {\n let urlReferer = new URL(document.referrer);\n if (urlReferer.host !== location.host) {\n apbctSessionStorage.set('apbct_site_referer', document.referrer, false);\n }\n }\n } else {\n apbctLocalStorage.set('apbct_page_hits', Number(apbctLocalStorage.get('apbct_page_hits')) + 1);\n }\n\n apbctWriteReferrersToSessionStorage();\n\n const cookiesType = apbctLocalStorage.get('ct_cookies_type');\n if ( ! cookiesType || cookiesType !== ctPublic.data__cookies_type ) {\n apbctLocalStorage.set('ct_cookies_type', ctPublic.data__cookies_type);\n apbctLocalStorage.delete('ct_mouse_moved');\n apbctLocalStorage.delete('ct_has_scrolled');\n }\n\n if (ctPublic.data__cookies_type !== 'alternative') {\n ctStartFieldsListening();\n // 2nd try to add listeners for delayed appears forms\n setTimeout(ctStartFieldsListening, 1000);\n }\n\n window.addEventListener('animationstart', apbctOnAnimationStart, true);\n window.addEventListener('input', apbctOnInput, true);\n document.ctTypoData = new CTTypoData();\n document.ctTypoData.gatheringFields();\n document.ctTypoData.setListeners();\n\n // Collect scrolling info\n const initCookies = [\n ['ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)],\n ['ct_fkp_timestamp', '0'],\n ['ct_pointer_data', '0'],\n // eslint-disable-next-line camelcase\n ['ct_timezone', ctDate.getTimezoneOffset()/60*(-1)],\n ['ct_screen_info', apbctGetScreenInfo()],\n ['apbct_headless', navigator.webdriver],\n ];\n\n apbctLocalStorage.set('ct_ps_timestamp', Math.floor(new Date().getTime() / 1000));\n apbctLocalStorage.set('ct_fkp_timestamp', '0');\n apbctLocalStorage.set('ct_pointer_data', '0');\n // eslint-disable-next-line camelcase\n apbctLocalStorage.set('ct_timezone', ctDate.getTimezoneOffset()/60*(-1) );\n apbctLocalStorage.set('ct_screen_info', apbctGetScreenInfo());\n apbctLocalStorage.set('apbct_headless', navigator.webdriver);\n\n if ( ctPublic.data__cookies_type !== 'native' ) {\n initCookies.push(['apbct_visible_fields', '0']);\n } else {\n // Delete all visible fields cookies on load the page\n let cookiesArray = document.cookie.split(';');\n if ( cookiesArray.length !== 0 ) {\n for ( let i = 0; i < cookiesArray.length; i++ ) {\n let currentCookie = cookiesArray[i].trim();\n let cookieName = currentCookie.split('=')[0];\n if ( cookieName.indexOf('apbct_visible_fields_') === 0 ) {\n ctDeleteCookie(cookieName);\n }\n }\n }\n }\n\n if (\n +ctPublic.pixel__setting &&\n !(+ctPublic.pixel__setting == 3 && ctPublic.settings__data__bot_detector_enabled == 1)\n ) {\n if ( ctIsDrawPixel() ) {\n ctGetPixelUrl();\n } else {\n initCookies.push(['apbct_pixel_url', ctPublic.pixel__url]);\n }\n }\n\n if ( +ctPublic.data__email_check_before_post) {\n initCookies.push(['ct_checked_emails', '0']);\n apbct('input[type = \\'email\\'], #email').on('blur', checkEmail);\n }\n\n if ( +ctPublic.data__email_check_exist_post) {\n initCookies.push(['ct_checked_emails_exist', '0']);\n apbct('comment-form input[name = \\'email\\'], input#email').on('blur', checkEmailExist);\n }\n\n if (apbctLocalStorage.isSet('ct_checkjs')) {\n initCookies.push(['ct_checkjs', apbctLocalStorage.get('ct_checkjs')]);\n } else {\n initCookies.push(['ct_checkjs', 0]);\n }\n\n // detect integrated forms that need to be handled via alternative cookies\n ctDetectForcedAltCookiesForms();\n\n // send bot detector event token to alt cookies on problem forms\n let tokenForForceAlt = apbctLocalStorage.get('bot_detector_event_token');\n if (typeof ctPublic.force_alt_cookies !== 'undefined' &&\n ctPublic.force_alt_cookies &&\n ctPublic.settings__data__bot_detector_enabled\n ) {\n apbctLocalStorage.set('event_token_forced_set', '0');\n if (tokenForForceAlt) {\n initCookies.push(['ct_bot_detector_event_token', tokenForForceAlt]);\n apbctLocalStorage.set('event_token_forced_set', '1');\n } else {\n startForcedAltEventTokenChecker();\n }\n }\n\n ctSetCookie(initCookies);\n\n setTimeout(function() {\n if (\n typeof ctPublic.force_alt_cookies == 'undefined' ||\n (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies)\n ) {\n ctNoCookieAttachHiddenFieldsToForms();\n }\n\n if (\n typeof ctPublic.data__cookies_type !== 'undefined' &&\n ctPublic.data__cookies_type === 'none'\n ) {\n ctAjaxSetupAddCleanTalkDataBeforeSendAjax();\n ctAddWCMiddlewares();\n }\n\n for (let i = 0; i < document.forms.length; i++) {\n let form = document.forms[i];\n\n // Exclusion for forms\n if (ctCheckHiddenFieldsExclusions(document.forms[i], 'visible_fields')) {\n continue;\n }\n\n // The Form has hidden field like apbct_visible_fields\n if (\n document.forms[i].elements.apbct_visible_fields !== undefined &&\n document.forms[i].elements.apbct_visible_fields.length > 0\n ) {\n continue;\n }\n\n if (form.querySelector('input[name=\"apbct_visible_fields\"]')) {\n let visibleFields = form.querySelector('input[name=\"apbct_visible_fields\"]');\n form.removeChild(visibleFields);\n }\n\n let hiddenInput = document.createElement( 'input' );\n hiddenInput.setAttribute( 'type', 'hidden' );\n hiddenInput.setAttribute( 'id', 'apbct_visible_fields_' + i );\n hiddenInput.setAttribute( 'name', 'apbct_visible_fields');\n let visibleFieldsToInput = {};\n visibleFieldsToInput[0] = apbct_collect_visible_fields(form);\n hiddenInput.value = btoa(JSON.stringify(visibleFieldsToInput));\n form.append( hiddenInput );\n\n form.onsubmit_prev = form.onsubmit;\n\n form.ctFormIndex = i;\n form.onsubmit = function(event) {\n if ( ctPublic.data__cookies_type !== 'native' && typeof event.target.ctFormIndex !== 'undefined' ) {\n apbct_visible_fields_set_cookie( apbct_collect_visible_fields(this), event.target.ctFormIndex );\n }\n\n if (ctPublic.data__cookies_type === 'none' && isFormThatNeedCatchXhr(event.target)) {\n window.XMLHttpRequest.prototype.send = function(data) {\n let noCookieData = getNoCookieData();\n noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&';\n defaultSend.call(this, noCookieData + data);\n setTimeout(() => {\n window.XMLHttpRequest.prototype.send = defaultSend;\n }, 0);\n };\n }\n\n // Call previous submit action\n if (event.target.onsubmit_prev instanceof Function && !ctOnsubmitPrevCallExclude(event.target)) {\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 500);\n }\n };\n }\n }, 1000);\n\n // Listen clicks on encoded emails\n let encodedEmailNodes = document.querySelectorAll('[data-original-string]');\n ctPublic.encodedEmailNodes = encodedEmailNodes;\n if (encodedEmailNodes.length) {\n for (let i = 0; i < encodedEmailNodes.length; ++i) {\n encodedEmailNodes[i].addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n\n // WordPress Search form processing\n for (const _form of document.forms) {\n if (\n typeof ctPublic !== 'undefined' &&\n + ctPublic.settings__forms__search_test === 1 &&\n (\n _form.getAttribute('id') === 'searchform' ||\n (_form.getAttribute('class') !== null && _form.getAttribute('class').indexOf('search-form') !== -1) ||\n (_form.getAttribute('role') !== null && _form.getAttribute('role').indexOf('search') !== -1)\n )\n ) {\n // fibosearch integration\n if (_form.querySelector('input.dgwt-wcas-search-input')) {\n continue;\n }\n\n if (\n _form.getAttribute('id') === 'hero-search-form' ||\n _form.getAttribute('class') === 'hb-booking-search-form'\n ) {\n continue;\n }\n\n // this handles search forms onsubmit process\n _form.apbctSearchPrevOnsubmit = _form.onsubmit;\n _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form);\n }\n }\n\n // Check any XMLHttpRequest connections\n apbctCatchXmlHttpRequest();\n\n // Initializing the collection of user activity\n new ApbctCollectingUserActivity();\n\n // Set important paramaters via ajax if problematic cache solutions found\n // todo These AJAX calls removed untill we find a better solution, reason is a lot of requests to the server.\n // apbctAjaxSetImportantParametersOnCacheExist(ctPublic.advancedCacheExists || ctPublic.varnishCacheExists);\n\n // Checking that the bot detector has loaded and received the event token for Anti-Crawler\n if (ctPublic.settings__sfw__anti_crawler) {\n checkBotDetectorExist();\n }\n}\n\n/**\n * Checking that the bot detector has loaded and received the event token\n */\nfunction checkBotDetectorExist() {\n if (ctPublic.settings__data__bot_detector_enabled) {\n const botDetectorIntervalSearch = setInterval(() => {\n let botDetectorEventToken = localStorage.bot_detector_event_token ? true : false;\n\n if (botDetectorEventToken) {\n ctSetCookie('apbct_bot_detector_exist', '1', '3600');\n clearInterval(botDetectorIntervalSearch);\n }\n }, 500);\n }\n}\n\n/**\n * Insert no_cookies_data to rest request\n */\nfunction ctAddWCMiddlewares() {\n const ctPinDataToRequest = (options, next) => {\n if (typeof options !== 'object' || options === null ||\n !options.hasOwnProperty('data') || !options.hasOwnProperty('path')\n ) {\n return next(options);\n }\n\n // add to cart\n if (options.data.hasOwnProperty('requests') &&\n options.data.requests.length > 0 &&\n options.data.requests[0].hasOwnProperty('path') &&\n options.data.requests[0].path === '/wc/store/v1/cart/add-item'\n ) {\n options.data.requests[0].data.ct_no_cookie_hidden_field = getNoCookieData();\n options.data.requests[0].data.event_token = localStorage.getItem('bot_detector_event_token');\n }\n\n // checkout\n if (options.path === '/wc/store/v1/checkout') {\n options.data.ct_no_cookie_hidden_field = getNoCookieData();\n options.data.event_token = localStorage.getItem('bot_detector_event_token');\n }\n\n return next(options);\n };\n\n if (window.hasOwnProperty('wp') &&\n window.wp.hasOwnProperty('apiFetch') &&\n typeof window.wp.apiFetch.use === 'function'\n ) {\n window.wp.apiFetch.use(ctPinDataToRequest);\n }\n}\n\n/**\n * Insert event_token and no_cookies_data to some ajax request\n */\nfunction apbctCatchXmlHttpRequest() {\n // 1) Check the page if it needed to catch XHR\n if ( document.querySelector('div.wfu_container') !== null ) {\n const originalSend = XMLHttpRequest.prototype.send;\n XMLHttpRequest.prototype.send = function(body) {\n // 2) Check the caught request fi it needed to modify\n if (\n body &&\n typeof body === 'string' &&\n (\n body.indexOf('action=wfu_ajax_action_ask_server') !== -1\n )\n ) {\n let addidionalCleantalkData = '';\n let eventToken = localStorage.getItem('bot_detector_event_token');\n try {\n eventToken = JSON.parse(eventToken);\n } catch {\n eventToken = false;\n }\n if (\n eventToken !== null &&\n eventToken !== false &&\n eventToken.hasOwnProperty('value') &&\n eventToken.value !== ''\n ) {\n eventToken = eventToken.value;\n addidionalCleantalkData += '&' + 'data%5Bct_bot_detector_event_token%5D=' + eventToken;\n }\n\n let noCookieData = getNoCookieData();\n addidionalCleantalkData += '&' + 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData;\n\n body += addidionalCleantalkData;\n\n return originalSend.apply(this, [body]);\n }\n return originalSend.apply(this, [body]);\n };\n }\n}\n\n/**\n * Run AJAX to set important_parameters on the site backend if problematic cache solutions are defined.\n * @param {boolean} cacheExist\n */\nfunction apbctAjaxSetImportantParametersOnCacheExist(cacheExist) { // eslint-disable-line no-unused-vars\n // Set important parameters via ajax\n if ( cacheExist ) {\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n apbct_public_sendREST('apbct_set_important_parameters', {});\n } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) {\n apbct_public_sendAJAX({action: 'apbct_set_important_parameters'}, {});\n }\n }\n}\n\n/**\n * Prepare jQuery.ajaxSetup to add nocookie data to the jQuery ajax request.\n * Notes:\n * - Do it just once, the ajaxSetup.beforeSend will be overwritten for any calls.\n * - Signs of forms need to be caught will be checked during ajaxSetup.settings.data process on send.\n * - Any sign of the form HTML of the caller is insignificant in this process.\n * @return {void}\n */\nfunction ctAjaxSetupAddCleanTalkDataBeforeSendAjax() {\n // jquery ajax call intercept\n // this is the only place where we can found hard dependency on jQuery, if the form use it - the script\n // will work independing if jQuery is loaded by CleanTalk or not\n let eventToken = false;\n if ( typeof jQuery !== 'undefined' && typeof jQuery.ajaxSetup === 'function') {\n jQuery.ajaxSetup({\n beforeSend: function(xhr, settings) {\n let sourceSign = false;\n // settings data is string (important!)\n if ( typeof settings.data === 'string' ) {\n if (settings.data.indexOf('twt_cc_signup') !== -1) {\n sourceSign = 'twt_cc_signup';\n }\n\n if (settings.data.indexOf('action=mailpoet') !== -1) {\n sourceSign = 'action=mailpoet';\n }\n\n if (\n settings.data.indexOf('action=user_registration') !== -1 &&\n settings.data.indexOf('ur_frontend_form_nonce') !== -1\n ) {\n sourceSign = 'action=user_registration';\n }\n\n if (settings.data.indexOf('action=happyforms_message') !== -1) {\n sourceSign = 'action=happyforms_message';\n }\n\n if (settings.data.indexOf('action=new_activity_comment') !== -1) {\n sourceSign = 'action=new_activity_comment';\n }\n }\n if ( typeof settings.url === 'string' ) {\n if (settings.url.indexOf('wc-ajax=add_to_cart') !== -1) {\n sourceSign = 'wc-ajax=add_to_cart';\n if (localStorage.getItem('bot_detector_event_token') !== null) {\n eventToken = localStorage.getItem('bot_detector_event_token');\n try {\n eventToken = JSON.parse(eventToken);\n } catch {\n eventToken = false;\n }\n if (eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') {\n eventToken = eventToken.value;\n }\n }\n }\n }\n\n if (sourceSign) {\n let noCookieData = getNoCookieData();\n if (typeof eventToken === 'string') {\n eventToken = 'data%5Bct_bot_detector_event_token%5D=' + eventToken + '&';\n } else {\n eventToken = '';\n }\n noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&';\n\n settings.data = noCookieData + eventToken + settings.data;\n }\n },\n });\n }\n}\n\n// eslint-disable-next-line require-jsdoc\nfunction ctOnsubmitPrevCallExclude(form) {\n if (form.classList.contains('hb-booking-search-form')) {\n return true;\n }\n\n return false;\n}\n\nif (ctPublic.data__key_is_ok) {\n if (document.readyState !== 'loading') {\n apbct_ready();\n } else {\n apbct_attach_event_handler(document, 'DOMContentLoaded', apbct_ready);\n }\n\n apbctLocalStorage.set('ct_checkjs', ctPublic.ct_checkjs_key, true );\n}\n\n/**\n * @param {SubmitEvent} e\n * @param {object} targetForm\n */\nfunction ctSearchFormOnSubmitHandler(e, targetForm) {\n try {\n // get honeypot field and it's value\n const honeyPotField = targetForm.querySelector('[name*=\"apbct_email_id__\"]');\n let hpValue = null;\n if (\n honeyPotField !== null &&\n honeyPotField.value !== null\n ) {\n hpValue = honeyPotField.value;\n }\n\n // get cookie data from storages\n let cleantalkStorageDataArray = getCleanTalkStorageDataArray();\n\n // get event token from storage\n let eventTokenLocalStorage = apbctLocalStorage.get('bot_detector_event_token');\n\n // if noCookie data or honeypot data is set, proceed handling\n if ( cleantalkStorageDataArray !== null || honeyPotField !== null || eventTokenLocalStorage !== null ) {\n e.preventDefault();\n const callBack = () => {\n if (honeyPotField !== null) {\n honeyPotField.parentNode.removeChild(honeyPotField);\n }\n if (typeof targetForm.apbctSearchPrevOnsubmit === 'function') {\n targetForm.apbctSearchPrevOnsubmit();\n } else {\n HTMLFormElement.prototype.submit.call(targetForm);\n }\n };\n\n let cookiesArray = cleantalkStorageDataArray;\n\n // if honeypot data provided add the fields to the parsed data\n if ( hpValue !== null ) {\n cookiesArray.apbct_search_form__honeypot_value = hpValue;\n }\n\n // set event token\n cookiesArray.ct_bot_detector_event_token = eventTokenLocalStorage;\n\n // if the pixel needs to be decoded\n if (\n typeof cookiesArray.apbct_pixel_url === 'string' &&\n cookiesArray.apbct_pixel_url.indexOf('%3A') !== -1\n ) {\n cookiesArray.apbct_pixel_url = decodeURIComponent(cookiesArray.apbct_pixel_url);\n }\n\n // data to JSON\n const parsedCookies = JSON.stringify(cookiesArray);\n\n // if any data provided, proceed data to xhr\n if ( typeof parsedCookies !== 'undefined' && parsedCookies.length !== 0 ) {\n ctSetAlternativeCookie(\n parsedCookies,\n {callback: callBack, onErrorCallback: callBack, forceAltCookies: true},\n );\n } else {\n callBack();\n }\n }\n } catch (error) {\n console.warn('APBCT search form onsubmit handler error. ' + error);\n }\n}\n\n/**\n * @param {mixed} commonCookies\n * @return {string}\n */\nfunction getJavascriptClientData(commonCookies = []) { // eslint-disable-line no-unused-vars\n let resultDataJson = {};\n\n resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails');\n resultDataJson.ct_checked_emails_exist = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails_exist');\n resultDataJson.ct_checkjs = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checkjs');\n resultDataJson.ct_fkp_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_fkp_timestamp');\n resultDataJson.ct_pointer_data = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_pointer_data');\n resultDataJson.ct_ps_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_ps_timestamp');\n resultDataJson.ct_screen_info = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_screen_info');\n resultDataJson.ct_timezone = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_timezone');\n\n // collecting data from localstorage\n const ctMouseMovedLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved');\n const ctHasScrolledLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled');\n const ctCookiesTypeLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_cookies_type');\n const apbctPageHits = apbctLocalStorage.get('apbct_page_hits');\n const apbctPrevReferer = apbctSessionStorage.get('apbct_prev_referer');\n const apbctSiteReferer = apbctSessionStorage.get('apbct_site_referer');\n const ctJsErrorsLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_js_errors');\n const ctPixelUrl = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url');\n const apbctHeadless = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_headless');\n const ctBotDetectorFrontendDataLog = apbctLocalStorage.get(\n ctPublicFunctions.cookiePrefix + 'ct_bot_detector_frontend_data_log',\n );\n\n // collecting data from cookies\n const ctMouseMovedCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved');\n const ctHasScrolledCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled');\n const ctCookiesTypeCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_cookies_type');\n const ctCookiesPixelUrl = ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url');\n const apbctHeadlessNative = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless');\n\n\n resultDataJson.ct_mouse_moved = ctMouseMovedLocalStorage !== undefined ?\n ctMouseMovedLocalStorage : ctMouseMovedCookie;\n resultDataJson.ct_has_scrolled = ctHasScrolledLocalStorage !== undefined ?\n ctHasScrolledLocalStorage : ctHasScrolledCookie;\n resultDataJson.ct_cookies_type = ctCookiesTypeLocalStorage !== undefined ?\n ctCookiesTypeLocalStorage : ctCookiesTypeCookie;\n resultDataJson.apbct_pixel_url = ctPixelUrl !== undefined ?\n ctPixelUrl : ctCookiesPixelUrl;\n resultDataJson.apbct_headless = apbctHeadless !== undefined ?\n apbctHeadless : apbctHeadlessNative;\n resultDataJson.ct_bot_detector_frontend_data_log = ctBotDetectorFrontendDataLog !== undefined ?\n ctBotDetectorFrontendDataLog : '';\n if (resultDataJson.apbct_pixel_url && typeof(resultDataJson.apbct_pixel_url) == 'string') {\n if (resultDataJson.apbct_pixel_url.indexOf('%3A%2F')) {\n resultDataJson.apbct_pixel_url = decodeURIComponent(resultDataJson.apbct_pixel_url);\n }\n }\n\n resultDataJson.apbct_page_hits = apbctPageHits;\n resultDataJson.apbct_prev_referer = apbctPrevReferer;\n resultDataJson.apbct_site_referer = apbctSiteReferer;\n resultDataJson.apbct_ct_js_errors = ctJsErrorsLocalStorage;\n\n if (!resultDataJson.apbct_pixel_url) {\n resultDataJson.apbct_pixel_url = ctPublic.pixel__url;\n }\n\n if ( typeof (commonCookies) === 'object') {\n for (let i = 0; i < commonCookies.length; ++i) {\n if ( typeof (commonCookies[i][1]) === 'object' ) {\n // this is for handle SFW cookies\n resultDataJson[commonCookies[i][1][0]] = commonCookies[i][1][1];\n } else {\n resultDataJson[commonCookies[i][0]] = commonCookies[i][1];\n }\n }\n } else {\n console.log('APBCT JS ERROR: Collecting data type mismatch');\n }\n\n // Parse JSON properties to prevent double JSON encoding\n resultDataJson = removeDoubleJsonEncoding(resultDataJson);\n\n\n return JSON.stringify(resultDataJson);\n}\n\n/**\n * Recursive\n *\n * Recursively decode JSON-encoded properties\n *\n * @param {mixed} object\n * @return {*}\n */\nfunction removeDoubleJsonEncoding(object) {\n if ( typeof object === 'object') {\n // eslint-disable-next-line guard-for-in\n for (let objectKey in object) {\n // Recursion\n if ( typeof object[objectKey] === 'object') {\n object[objectKey] = removeDoubleJsonEncoding(object[objectKey]);\n }\n\n // Common case (out)\n if (\n typeof object[objectKey] === 'string' &&\n object[objectKey].match(/^[\\[{].*?[\\]}]$/) !== null // is like JSON\n ) {\n const parsedValue = JSON.parse(object[objectKey]);\n if ( typeof parsedValue === 'object' ) {\n object[objectKey] = parsedValue;\n }\n }\n }\n }\n\n return object;\n}\n\n// eslint-disable-next-line camelcase,require-jsdoc\nfunction apbct_collect_visible_fields( form ) {\n // Get only fields\n let inputs = [];\n let inputsVisible = '';\n let inputsVisibleCount = 0;\n let inputsInvisible = '';\n let inputsInvisibleCount = 0;\n let inputsWithDuplicateNames = [];\n\n for (let key in form.elements) {\n if (!isNaN(+key)) {\n inputs[key] = form.elements[key];\n }\n }\n\n // Filter fields\n inputs = inputs.filter(function(elem) {\n // Filter already added fields\n if ( inputsWithDuplicateNames.indexOf( elem.getAttribute('name') ) !== -1 ) {\n return false;\n }\n // Filter inputs with same names for type == radio\n if ( -1 !== ['radio', 'checkbox'].indexOf( elem.getAttribute('type') )) {\n inputsWithDuplicateNames.push( elem.getAttribute('name') );\n return false;\n }\n return true;\n });\n\n // Visible fields\n inputs.forEach(function(elem, i, elements) {\n // Unnecessary fields\n if (\n elem.getAttribute('type') === 'submit' || // type == submit\n elem.getAttribute('name') === null ||\n elem.getAttribute('name') === 'ct_checkjs'\n ) {\n return;\n }\n // Invisible fields\n if (\n getComputedStyle(elem).display === 'none' || // hidden\n getComputedStyle(elem).visibility === 'hidden' || // hidden\n getComputedStyle(elem).opacity === '0' || // hidden\n elem.getAttribute('type') === 'hidden' // type == hidden\n ) {\n if ( elem.classList.contains('wp-editor-area') ) {\n inputsVisible += ' ' + elem.getAttribute('name');\n inputsVisibleCount++;\n } else {\n inputsInvisible += ' ' + elem.getAttribute('name');\n inputsInvisibleCount++;\n }\n // eslint-disable-next-line brace-style\n }\n // Visible fields\n else {\n inputsVisible += ' ' + elem.getAttribute('name');\n inputsVisibleCount++;\n }\n });\n\n inputsInvisible = inputsInvisible.trim();\n inputsVisible = inputsVisible.trim();\n\n return {\n visible_fields: inputsVisible,\n visible_fields_count: inputsVisibleCount,\n invisible_fields: inputsInvisible,\n invisible_fields_count: inputsInvisibleCount,\n };\n}\n\n// eslint-disable-next-line camelcase,require-jsdoc\nfunction apbct_visible_fields_set_cookie( visibleFieldsCollection, formId ) {\n let collection = typeof visibleFieldsCollection === 'object' && visibleFieldsCollection !== null ?\n visibleFieldsCollection : {};\n\n if ( ctPublic.data__cookies_type === 'native' ) {\n // eslint-disable-next-line guard-for-in\n for ( let i in collection ) {\n if ( i > 10 ) {\n // Do not generate more than 10 cookies\n return;\n }\n let collectionIndex = formId !== undefined ? formId : i;\n ctSetCookie('apbct_visible_fields_' + collectionIndex, JSON.stringify( collection[i] ) );\n }\n } else {\n ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) );\n }\n}\n\n// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars\nfunction apbct_js_keys__set_input_value(result, data, params, obj) {\n if ( document.querySelectorAll('[name^=ct_checkjs]').length > 0 ) {\n let elements = document.querySelectorAll('[name^=ct_checkjs]');\n for ( let i = 0; i < elements.length; i++ ) {\n elements[i].value = result.js_key;\n }\n }\n}\n\n/**\n * @return {string}\n */\nfunction apbctGetScreenInfo() {\n return JSON.stringify({\n fullWidth: document.documentElement.scrollWidth,\n fullHeight: Math.max(\n document.body.scrollHeight, document.documentElement.scrollHeight,\n document.body.offsetHeight, document.documentElement.offsetHeight,\n document.body.clientHeight, document.documentElement.clientHeight,\n ),\n visibleWidth: document.documentElement.clientWidth,\n visibleHeight: document.documentElement.clientHeight,\n });\n}\n\n// eslint-disable-next-line require-jsdoc\nfunction ctParseBlockMessage(response) {\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: response.comment},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = response.comment;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\n }\n }\n }\n}\n\n// eslint-disable-next-line no-unused-vars,require-jsdoc\nfunction ctSetPixelUrlLocalstorage(ajaxPixelUrl) {\n // set pixel to the storage\n ctSetCookie('apbct_pixel_url', ajaxPixelUrl);\n}\n\n// eslint-disable-next-line require-jsdoc\nfunction ctNoCookieConstructHiddenField(type) {\n let inputType = 'hidden';\n if (type === 'submit') {\n inputType = 'submit';\n }\n let field = '';\n\n let noCookieData = getCleanTalkStorageDataArray();\n noCookieData = JSON.stringify(noCookieData);\n noCookieData = '_ct_no_cookie_data_' + btoa(noCookieData);\n field = document.createElement('input');\n field.setAttribute('name', 'ct_no_cookie_hidden_field');\n field.setAttribute('value', noCookieData);\n field.setAttribute('type', inputType);\n field.classList.add('apbct_special_field');\n field.classList.add('ct_no_cookie_hidden_field');\n return field;\n}\n\n/**\n * Retrieves the clentalk \"cookie\" data from starages.\n * Contains {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}.\n * @return {string}\n */\nfunction getCleanTalkStorageDataArray() {\n let noCookieDataLocal = apbctLocalStorage.getCleanTalkData();\n let noCookieDataSession = apbctSessionStorage.getCleanTalkData();\n\n let noCookieDataTypo = {typo: []};\n if (document.ctTypoData && document.ctTypoData.data) {\n noCookieDataTypo = {typo: document.ctTypoData.data};\n }\n\n let noCookieDataFromUserActivity = {collecting_user_activity_data: []};\n\n if (document.ctCollectingUserActivityData) {\n let collectingUserActivityData = JSON.parse(JSON.stringify(document.ctCollectingUserActivityData));\n noCookieDataFromUserActivity = {collecting_user_activity_data: collectingUserActivityData};\n }\n\n return {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity};\n}\n\n/**\n * @return {boolean|*}\n */\nfunction ctGetPageForms() {\n let forms = document.forms;\n if (forms) {\n return forms;\n }\n return false;\n}\n\n/**\n * Get type of the field should be excluded. Return exclusion signs via object.\n * @param {object} form Form dom object.\n * @return {object} {'no_cookie': 1|0, 'visible_fields': 1|0}\n */\nfunction ctGetHiddenFieldExclusionsType(form) {\n // visible fields\n let result = {'no_cookie': 0, 'visible_fields': 0};\n if (\n +ctPublic.data__visible_fields_required === 0 ||\n (form.method.toString().toLowerCase() === 'get' &&\n form.querySelectorAll('.nf-form-content').length === 0 &&\n form.id !== 'twt_cc_signup') ||\n form.classList.contains('slp_search_form') || // StoreLocatorPlus form\n form.parentElement.classList.contains('mec-booking') ||\n form.action.toString().indexOf('activehosted.com') !== -1 || // Active Campaign\n (form.id && form.id === 'caspioform') || // Caspio Form\n (form.classList && form.classList.contains('tinkoffPayRow')) || // TinkoffPayForm\n (form.classList && form.classList.contains('give-form')) || // GiveWP\n (form.id && form.id === 'ult-forgot-password-form') || // ult forgot password\n (form.id && form.id.toString().indexOf('calculatedfields') !== -1) || // CalculatedFieldsForm\n (form.id && form.id.toString().indexOf('sac-form') !== -1) || // Simple Ajax Chat\n (form.id &&\n form.id.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form\n (form.name &&\n form.name.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form\n form.action.toString() === 'https://epayment.epymtservice.com/epay.jhtml' || // Custom form\n (form.name && form.name.toString().indexOf('tribe-bar-form') !== -1) || // The Events Calendar\n (form.id && form.id === 'ihf-login-form') || // Optima Express login\n (form.id &&\n form.id === 'subscriberForm' &&\n form.action.toString().indexOf('actionType=update') !== -1) || // Optima Express update\n (form.id && form.id === 'ihf-main-search-form') || // Optima Express search\n (form.id && form.id === 'frmCalc') || // nobletitle-calc\n form.action.toString().indexOf('property-organizer-delete-saved-search-submit') !== -1 ||\n form.querySelector('a[name=\"login\"]') !== null // digimember login form\n ) {\n result.visible_fields = 1;\n }\n\n // ajax search pro exclusion\n let ncFieldExclusionsSign = form.parentNode;\n if (\n ncFieldExclusionsSign && ncFieldExclusionsSign.classList.contains('proinput') ||\n (form.name === 'options' && form.classList.contains('asp-fss-flex'))\n ) {\n result.no_cookie = 1;\n }\n\n // woocommerce login form\n if (\n form && form.classList.contains('woocommerce-form-login')\n ) {\n result.visible_fields = 1;\n result.no_cookie = 1;\n }\n\n return result;\n}\n\n/**\n * Check if the form should be skipped from hidden field attach.\n * Return exclusion description if it is found, false otherwise.\n * @param {object} form Form dom object.\n * @param {string} hiddenFieldType Type of hidden field that needs to be checked.\n * Possible values: 'no_cookie'|'visible_fields'.\n * @return {boolean}\n */\nfunction ctCheckHiddenFieldsExclusions(form, hiddenFieldType) {\n const formAction = typeof(form.action) == 'string' ? form.action : '';\n // Ajax Search Lite\n if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) {\n return true;\n }\n // Super WooCommerce Product Filter\n if (form.classList.contains('swpf-instant-filtering')) {\n return true;\n }\n // PayU 3-rd party service forms\n if (formAction.indexOf('secure.payu.com') !== -1 ) {\n return true;\n }\n\n if (formAction.indexOf('hsforms') !== -1 ) {\n return true;\n }\n\n if (typeof (hiddenFieldType) === 'string' &&\n ['visible_fields', 'no_cookie'].indexOf(hiddenFieldType) !== -1) {\n const exclusions = ctGetHiddenFieldExclusionsType(form);\n return exclusions[hiddenFieldType] === 1;\n }\n\n return false;\n}\n\n/**\n * ctNoCookieAttachHiddenFieldsToForms\n */\nfunction ctNoCookieAttachHiddenFieldsToForms() {\n if (ctPublic.data__cookies_type !== 'none') {\n return;\n }\n\n let forms = ctGetPageForms();\n\n if (forms) {\n for ( let i = 0; i < forms.length; i++ ) {\n if ( ctCheckHiddenFieldsExclusions(document.forms[i], 'no_cookie') ) {\n continue;\n }\n\n // ignore forms with get method @todo We need to think about this\n if (document.forms[i].getAttribute('method') === null ||\n document.forms[i].getAttribute('method').toLowerCase() === 'post') {\n // remove old sets\n let fields = forms[i].querySelectorAll('.ct_no_cookie_hidden_field');\n for ( let j = 0; j < fields.length; j++ ) {\n fields[j].outerHTML = '';\n }\n // add new set\n document.forms[i].append(ctNoCookieConstructHiddenField());\n }\n }\n }\n}\n\nconst defaultFetch = window.fetch;\nconst defaultSend = XMLHttpRequest.prototype.send;\n\nif (document.readyState !== 'loading') {\n checkFormsExistForCatching();\n} else {\n apbct_attach_event_handler(document, 'DOMContentLoaded', checkFormsExistForCatching);\n}\n\n/**\n * checkFormsExistForCatching\n */\nfunction checkFormsExistForCatching() {\n setTimeout(function() {\n if (isFormThatNeedCatch()) {\n window.fetch = function(...args) {\n if (args &&\n args[0] &&\n typeof args[0].includes === 'function' &&\n args[0].includes('/wp-json/metform/')\n ) {\n let noCookieData = getNoCookieData();\n\n if (args && args[1] && args[1].body) {\n args[1].body.append('ct_no_cookie_hidden_field', noCookieData);\n }\n }\n\n return defaultFetch.apply(window, args);\n };\n }\n }, 1000);\n}\n\n/**\n * @return {boolean}\n */\nfunction isFormThatNeedCatch() {\n const formClasses = [\n 'metform-form-content',\n ];\n let classExists = false;\n\n const forms = document.forms;\n for (let form of forms) {\n formClasses.forEach(function(classForm) {\n if (form.classList.contains(classForm)) {\n classExists = true;\n }\n });\n }\n\n return classExists;\n}\n\n/**\n * @param {HTMLElement} form\n * @return {boolean}\n */\nfunction isFormThatNeedCatchXhr(form) {\n if (document.querySelector('div.elementor-widget[title=\\'Login/Signup\\']') != null) {\n return false;\n }\n if (form && form.action && form.action.toString().indexOf('mailpoet_subscription_form') !== -1) {\n return true;\n }\n\n return false;\n}\n\n/**\n * @return {string}\n */\nfunction getNoCookieData() {\n let noCookieDataLocal = apbctLocalStorage.getCleanTalkData();\n let noCookieDataSession = apbctSessionStorage.getCleanTalkData();\n let noCookieData = {...noCookieDataLocal, ...noCookieDataSession};\n noCookieData = JSON.stringify(noCookieData);\n\n return '_ct_no_cookie_data_' + btoa(noCookieData);\n}\n\n/**\n * Set three statements to the sessions storage: apbct_session_current_page, apbct_prev_referer.\n * @return {void}\n */\nfunction apbctWriteReferrersToSessionStorage() {\n const sessionCurrentPage = apbctSessionStorage.get('apbct_session_current_page');\n\n // set session apbct_referer\n if (sessionCurrentPage!== false && document.location.href !== sessionCurrentPage) {\n apbctSessionStorage.set('apbct_prev_referer', sessionCurrentPage, false);\n }\n\n // set session current page to know referrer\n apbctSessionStorage.set('apbct_session_current_page', document.location.href, false);\n}\n\n/**\n * WooCommerce add to cart by GET request params collecting\n */\nfunction apbctCheckAddToCartByGet() {\n // 1) Collect all links with add_to_cart_button class\n document.querySelectorAll('a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)').forEach((el) => {\n el.addEventListener('click', function(e) {\n let href = el.getAttribute('href');\n // 2) Add to href attribute additional parameter ct_bot_detector_event_token gathered from apbctLocalStorage\n let eventToken = apbctLocalStorage.get('bot_detector_event_token');\n if ( eventToken ) {\n if ( href.indexOf('?') === -1 ) {\n href += '?';\n } else {\n href += '&';\n }\n href += 'ct_bot_detector_event_token=' + eventToken;\n el.setAttribute('href', href);\n }\n });\n });\n}\n\n/* Cleantalk Modal object */\nlet cleantalkModal = {\n\n // Flags\n loaded: false,\n loading: false,\n opened: false,\n opening: false,\n ignoreURLConvert: false,\n\n // Methods\n load: function( action ) {\n if ( ! this.loaded ) {\n this.loading = true;\n let callback = function( result, data, params, obj ) {\n cleantalkModal.loading = false;\n cleantalkModal.loaded = result;\n document.dispatchEvent(\n new CustomEvent( 'cleantalkModalContentLoaded', {\n bubbles: true,\n } ),\n );\n };\n // eslint-disable-next-line camelcase\n if ( typeof apbct_admin_sendAJAX === 'function' ) {\n apbct_admin_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} );\n } else {\n apbct_public_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} );\n }\n }\n },\n\n open: function() {\n /* Cleantalk Modal CSS start */\n let renderCss = function() {\n let cssStr = '';\n // eslint-disable-next-line guard-for-in\n for ( const key in this.styles ) {\n cssStr += key + ':' + this.styles[key] + ';';\n }\n return cssStr;\n };\n let overlayCss = {\n styles: {\n 'z-index': '9999999999',\n 'position': 'fixed',\n 'top': '0',\n 'left': '0',\n 'width': '100%',\n 'height': '100%',\n 'background': 'rgba(0,0,0,0.5)',\n 'display': 'flex',\n 'justify-content': 'center',\n 'align-items': 'center',\n },\n toString: renderCss,\n };\n let innerCss = {\n styles: {\n 'position': 'relative',\n 'padding': '30px',\n 'background': '#FFF',\n 'border': '1px solid rgba(0,0,0,0.75)',\n 'border-radius': '4px',\n 'box-shadow': '7px 7px 5px 0px rgba(50,50,50,0.75)',\n },\n toString: renderCss,\n };\n let closeCss = {\n styles: {\n 'position': 'absolute',\n 'background': '#FFF',\n 'width': '20px',\n 'height': '20px',\n 'border': '2px solid rgba(0,0,0,0.75)',\n 'border-radius': '15px',\n 'cursor': 'pointer',\n 'top': '-8px',\n 'right': '-8px',\n 'box-sizing': 'content-box',\n },\n toString: renderCss,\n };\n let closeCssBefore = {\n styles: {\n 'content': '\"\"',\n 'display': 'block',\n 'position': 'absolute',\n 'background': '#000',\n 'border-radius': '1px',\n 'width': '2px',\n 'height': '16px',\n 'top': '2px',\n 'left': '9px',\n 'transform': 'rotate(45deg)',\n },\n toString: renderCss,\n };\n let closeCssAfter = {\n styles: {\n 'content': '\"\"',\n 'display': 'block',\n 'position': 'absolute',\n 'background': '#000',\n 'border-radius': '1px',\n 'width': '2px',\n 'height': '16px',\n 'top': '2px',\n 'left': '9px',\n 'transform': 'rotate(-45deg)',\n },\n toString: renderCss,\n };\n let bodyCss = {\n styles: {\n 'overflow': 'hidden',\n },\n toString: renderCss,\n };\n let cleantalkModalStyle = document.createElement( 'style' );\n cleantalkModalStyle.setAttribute( 'id', 'cleantalk-modal-styles' );\n cleantalkModalStyle.innerHTML = 'body.cleantalk-modal-opened{' + bodyCss + '}';\n cleantalkModalStyle.innerHTML += '#cleantalk-modal-overlay{' + overlayCss + '}';\n cleantalkModalStyle.innerHTML += '#cleantalk-modal-close{' + closeCss + '}';\n cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:before{' + closeCssBefore + '}';\n cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:after{' + closeCssAfter + '}';\n document.body.append( cleantalkModalStyle );\n /* Cleantalk Modal CSS end */\n\n let overlay = document.createElement( 'div' );\n overlay.setAttribute( 'id', 'cleantalk-modal-overlay' );\n document.body.append( overlay );\n\n document.body.classList.add( 'cleantalk-modal-opened' );\n\n let inner = document.createElement( 'div' );\n inner.setAttribute( 'id', 'cleantalk-modal-inner' );\n inner.setAttribute( 'style', innerCss );\n overlay.append( inner );\n\n let close = document.createElement( 'div' );\n close.setAttribute( 'id', 'cleantalk-modal-close' );\n inner.append( close );\n\n let content = document.createElement( 'div' );\n if ( this.loaded ) {\n const urlRegex = /(https?:\\/\\/[^\\s]+)/g;\n const serviceContentRegex = /.*\\/inc/g;\n if (serviceContentRegex.test(this.loaded) || this.ignoreURLConvert) {\n content.innerHTML = this.loaded;\n } else {\n content.innerHTML = this.loaded.replace(urlRegex, '<a href=\"$1\" target=\"_blank\">$1</a>');\n }\n } else {\n content.innerHTML = 'Loading...';\n // @ToDo Here is hardcoded parameter. Have to get this from a 'data-' attribute.\n this.load( 'get_options_template' );\n }\n content.setAttribute( 'id', 'cleantalk-modal-content' );\n inner.append( content );\n\n this.opened = true;\n },\n\n close: function() {\n document.body.classList.remove( 'cleantalk-modal-opened' );\n document.getElementById( 'cleantalk-modal-overlay' ).remove();\n document.getElementById( 'cleantalk-modal-styles' ).remove();\n document.dispatchEvent(\n new CustomEvent( 'cleantalkModalClosed', {\n bubbles: true,\n } ),\n );\n },\n\n};\n\n/* Cleantalk Modal helpers */\ndocument.addEventListener('click', function( e ) {\n if ( e.target && (e.target.id === 'cleantalk-modal-overlay' || e.target.id === 'cleantalk-modal-close') ) {\n cleantalkModal.close();\n }\n});\ndocument.addEventListener('cleantalkModalContentLoaded', function( e ) {\n if ( cleantalkModal.opened && cleantalkModal.loaded ) {\n document.getElementById( 'cleantalk-modal-content' ).innerHTML = cleantalkModal.loaded;\n }\n});\n\ndocument.addEventListener('DOMContentLoaded', function() {\n let ctTrpLocalize = undefined;\n let ctTrpIsAdminCommentsList = false;\n\n if ( typeof ctPublic !== 'undefined' || typeof ctTrpAdminLocalize !== 'undefined' ) {\n if ( typeof ctPublic !== 'undefined' && ctPublic.theRealPerson ) {\n ctTrpLocalize = ctPublic.theRealPerson;\n }\n if (\n typeof ctTrpLocalize === 'undefined' &&\n typeof ctTrpAdminLocalize !== 'undefined' &&\n ctTrpAdminLocalize.theRealPerson\n ) {\n ctTrpLocalize = ctTrpAdminLocalize.theRealPerson;\n ctTrpIsAdminCommentsList = true;\n }\n }\n\n if ( ! ctTrpLocalize ) {\n return;\n }\n\n // Selectors. Try to handle the WIDE range of themes.\n let themesCommentsSelector = '.apbct-trp *[class*=\"comment-author\"]';\n if ( document.querySelector('.apbct-trp .comment-author .comment-author-link') ) {\n // For Spacious theme\n themesCommentsSelector = '.apbct-trp *[class*=\"comment-author-link\"]';\n }\n let woocommerceReviewsSelector = '.apbct-trp *[class*=\"review__author\"]';\n let adminCommentsListSelector = '.apbct-trp td[class*=\"column-author\"] > strong';\n const trpComments = document.querySelectorAll(\n themesCommentsSelector + ',' +\n woocommerceReviewsSelector + ',' +\n adminCommentsListSelector);\n\n if ( trpComments.length === 0 ) {\n return;\n }\n\n trpComments.forEach(( element, index ) => {\n // Exceptions for items that are included in the selection\n if (\n typeof pagenow == 'undefined' &&\n element.parentElement.className.indexOf('group') < 0 &&\n element.tagName != 'DIV'\n ) {\n return;\n }\n\n let trpLayout = document.createElement('div');\n trpLayout.setAttribute('class', 'apbct-real-user-badge');\n\n let trpImage = document.createElement('img');\n trpImage.setAttribute('src', ctTrpLocalize.imgPersonUrl);\n trpImage.setAttribute('class', 'apbct-real-user-popup-img');\n\n let trpDescription = document.createElement('div');\n trpDescription.setAttribute('class', 'apbct-real-user-popup');\n\n let trpDescriptionHeading = document.createElement('p');\n trpDescriptionHeading.setAttribute('class', 'apbct-real-user-popup-header');\n trpDescriptionHeading.append(ctTrpLocalize.phrases.trpHeading);\n\n let trpDescriptionContent = document.createElement('div');\n trpDescriptionContent.setAttribute('class', 'apbct-real-user-popup-content_row');\n\n let trpDescriptionContentSpan = document.createElement('span');\n trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent1 + ' ');\n trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent2);\n\n if ( ctTrpIsAdminCommentsList ) {\n let learnMoreLink = document.createElement('a');\n learnMoreLink.setAttribute('href', ctTrpLocalize.trpContentLink);\n learnMoreLink.setAttribute('target', '_blank');\n learnMoreLink.text = ctTrpLocalize.phrases.trpContentLearnMore;\n trpDescriptionContentSpan.append(' '); // Need one space\n trpDescriptionContentSpan.append(learnMoreLink);\n }\n\n trpDescriptionContent.append(trpDescriptionContentSpan);\n trpDescription.append(trpDescriptionHeading, trpDescriptionContent);\n trpLayout.append(trpImage);\n element.append(trpLayout);\n element.append(trpDescription);\n });\n\n const badges = document.querySelectorAll('.apbct-real-user-badge');\n\n badges.forEach((badge) => {\n let hideTimeout = undefined;\n\n this.body.addEventListener('click', function(e) {\n if (\n e.target.className.indexOf('apbct-real-user') == -1 &&\n e.target.parentElement.className.indexOf('apbct-real-user') == -1\n ) {\n closeAllPopupTRP();\n }\n });\n\n badge.addEventListener('click', function() {\n const popup = this.nextElementSibling;\n if (popup && popup.classList.contains('apbct-real-user-popup')) {\n popup.classList.toggle('visible');\n }\n });\n\n badge.addEventListener('mouseenter', function() {\n closeAllPopupTRP();\n const popup = this.nextElementSibling;\n if (popup && popup.classList.contains('apbct-real-user-popup')) {\n popup.classList.add('visible');\n }\n });\n\n badge.addEventListener('mouseleave', function() {\n hideTimeout = setTimeout(() => {\n const popup = this.nextElementSibling;\n if (popup && popup.classList.contains('apbct-real-user-popup')) {\n popup.classList.remove('visible');\n }\n }, 1000);\n });\n\n const popup = badge.nextElementSibling;\n popup.addEventListener('mouseenter', function() {\n clearTimeout(hideTimeout);\n popup.classList.add('visible');\n });\n\n popup.addEventListener('mouseleave', function() {\n hideTimeout = setTimeout(() => {\n if (popup.classList.contains('apbct-real-user-popup')) {\n popup.classList.remove('visible');\n }\n }, 1000);\n });\n\n // For mobile devices\n badge.addEventListener('touchend', function() {\n hideTimeout = setTimeout(() => {\n const popup = this.nextElementSibling;\n const selection = window.getSelection();\n // Check if no text is selected\n if (popup && selection && popup.classList.contains('apbct-real-user-popup') &&\n selection.toString().length === 0\n ) {\n popup.classList.remove('visible');\n } else {\n clearTimeout(hideTimeout);\n document.addEventListener('selectionchange', function onSelectionChange() {\n const selection = window.getSelection();\n if (selection && selection.toString().length === 0) {\n // Restart the hide timeout when selection is cleared\n hideTimeout = setTimeout(() => {\n const popup = badge.nextElementSibling;\n if (popup && popup.classList.contains('apbct-real-user-popup')) {\n popup.classList.remove('visible');\n }\n }, 3000);\n document.removeEventListener('selectionchange', onSelectionChange);\n }\n });\n }\n }, 3000);\n });\n });\n});\n\n/**\n * Closing all TRP popup\n */\nfunction closeAllPopupTRP() {\n let allDisplayPopup = document.querySelectorAll('.apbct-real-user-popup.visible');\n if (allDisplayPopup.length > 0) {\n allDisplayPopup.forEach((element) => {\n element.classList.remove('visible');\n });\n }\n}\n\n/**\n * Check form as internal.\n * @param {int} currForm Current form.\n */\nfunction ctCheckInternal(currForm) {\n // Gathering data\n const ctData = {};\n const elems = currForm.elements;\n let key;\n\n for (key in elems) {\n if (elems[key].type !== 'submit' &&\n elems[key].value !== undefined &&\n elems[key].value !== '') {\n ctData[elems[key].name] = currForm.elements[key].value;\n }\n }\n ctData.action = 'ct_check_internal';\n\n // AJAX Request\n apbct_public_sendAJAX(\n ctData,\n {\n url: ctPublicFunctions._ajax_url,\n callback: function(data) {\n if (data.success === true) {\n currForm.origSubmit();\n } else {\n alert(data.data);\n return false;\n }\n },\n },\n );\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\n if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n for ( let i = 0; i < document.forms.length; i++ ) {\n if ( typeof(document.forms[i].action) == 'string' ) {\n ctCurrForm = document.forms[i];\n ctCurrAction = ctCurrForm.action;\n if (\n ctCurrAction.indexOf('https?://') !== null && // The protocol is obligatory\n ctCurrAction.match(ctPublic.blog_home + '.*?\\.php') !== null && // Main check\n ! ctCheckInternalIsExcludedForm(ctCurrAction) // Exclude WordPress native scripts from processing\n ) {\n const formClone = ctCurrForm.cloneNode(true);\n ctCurrForm.parentNode.replaceChild(formClone, ctCurrForm);\n\n formClone.origSubmit = ctCurrForm.submit;\n formClone.submit = null;\n\n formClone.addEventListener('submit', function(event) {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n ctCheckInternal(event.target);\n return false;\n });\n }\n }\n }\n }, 500);\n});\n\n/**\n * Check by action to exclude the form checking\n * @param {string} action\n * @return {boolean}\n */\nfunction ctCheckInternalIsExcludedForm(action) {\n // An array contains forms action need to be excluded.\n const ctInternalScriptExclusions = [\n 'wp-login.php', // WordPress login page\n 'wp-comments-post.php', // WordPress Comments Form\n ];\n\n return ctInternalScriptExclusions.some((item) => {\n return action.match(new RegExp(ctPublic.blog_home + '.*' + item)) !== null;\n });\n}\n"],"names":["apbctSetEmailDecoderPopupAnimation","animationElements","animationWrapper","document","createElement","classList","let","i","length","apbctEEAnimationDogOne","innerText","append","ctFillDecodedEmailHandler","event","clickSource","ctWlBrandname","encodedEmail","ctPublic","this","removeEventListener","encodedEmailNodesIsMixed","wl_brandname","encodedEmailNodes","ctAdminCommon","plugin_name","encodedEmailNode","body","add","popupHeaderWrapper","popupTextWrapper","popupTextWaiting","popupTextDecoding","encoderPopup","getElementById","setAttribute","ctPublicFunctions","text__ee_wait_for_decoding","innerHTML","waitingPopup","popupHeader","style","color","id","text__ee_decoding_process","apbctAjaxEmailDecodeBulk","data","event_javascript_data","getJavascriptClientData","post_url","location","href","referrer","encodedEmails","encodedEmailsCollection","indexOf","preventDefault","apbctTooltip","apbct","dataset","originalString","JSON","stringify","data__ajax_type","apbct_public_sendREST","method","callback","result","ctSetCookie","emailEncoderPassKey","apbctEmailEncoderCallbackBulk","onErrorCallback","res","resetEncodedNodes","ctShowDecodeComment","action","apbct_public_sendAJAX","notJson","console","log","0","appendChild","apbct_admin_sendAJAX","success","is_allowed","setTimeout","popup","email","currentResultData","forEach","row","encoded_email","decoded_email","split","firstNode","querySelector","selectableEmail","wrapper","text__ee_click_to_select","title","text__ee_original_email","outerHTML","secondNode","remove","buttonWrapper","button","text__ee_got_it","addEventListener","fillDecodedEmails","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","decodingResult","baseElementContent","replace","querySelectorAll","encodedEmailTextInsideMailto","el","ctProcessDecodedDataResult","response","targetElement","removeAttribute","ctFillDecodedEmail","target","ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","constructor","select","HTMLCollection","Array","prototype","slice","call","deselect","addElement","elemToAdd","push","elem","reduce","css","getRaw","styleName","Object","hasOwn","DomStyleName","group","toUpperCase","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","className","removeClass","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","onChecker","bind","stopPropagation","ready","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","Boolean","HTMLElement","HTMLUnknownElement","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","fadeOut","ctProcessError","msg","url","ctJsErrors","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","errorObj","error","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","selectActualNonce","defaultNonce","hasOwnProperty","_fresh_nonce","_ajax_nonce","_rest_nonce","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","async","user","password","spinner","progressbar","context","responseType","headers","timeout","methods_to_convert_data_to_URL","http_code","status_text","parameters","key","prepare","keys","deleteDoubleJSONEncoding","convertData","open","setHeaders","onreadystatechange","isWpNonceError","getFreshNonceAndRerunXHR","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","cursor","complete","status","statusText","on_ready_state_change","on_progress","restErrror","ajaxErrror","readyState","initialRequestParams","noncePrev","spbc_remote_call_action","nonce_prev","initial_request_params","host_url","freshNonceResult","newRequestParams","undefined","wpnonce","httpCode","additionalMsg","errorString","errorOutput","errorMsg","headerName","setRequestHeader","convertDataToURL","convertDataToBody","paramsAppendix","URLSearchParams","toString","paramsPrefix","dataKey","FormData","object","objectKey","parsedValue","super","default_route","_rest_url","route","nonce","X-WP-Nonce","defineProperty","property","enumerable","configurable","writable","ApbctCollectingUserActivity","elementBody","collectionForms","forms","setListeners","checkElementInForms","getSelection","type","addSelected","addTarget","resultCheck","addClicks","trackMouseMovement","ctCollectingUserActivityData","clicks","selected","mouseMovementsInsideForm","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","item","apbctLocalStorage","set","ctSetAlternativeCookie","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","encodeURIComponent","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bloomPopup","pafeFormsFormElementor","otterForm","bookingPress","isArray","e","apbct_site_referer","apbct_force_alt_cookies","apbct_pixel_url","decodeURIComponent","beforeSend","ctGetCookie","matches","RegExp","ctDeleteCookie","cookieName","obj","_params","callback_context","callback_params","silent","no_nonce","_ajax_url","no_cache","apbctGenerateUniqueID","substr","get","storageValue","json","isJson","objToSave","timestamp","getTime","isAlive","maxLifetime","isSet","delete","removeItem","getCleanTalkData","apbctSessionStorage","sessionStorage","apbctOnAnimationStart","animationName","apbctAutocomplete","apbctCancelAutocomplete","apbctOnInput","inputType","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","ApbctForceProtection","wrappers","findWrappers","checkBot","checkBotCallback","decodeForms","allow","showMessageForBot","form","encodedForm","atob","apbctForceProtect","settings__forms__force_protection","data__key_is_ok","apbct_attach_event_handler","CTTypoData","fieldData","isAutoFill","isUseBuffer","speedDelta","firstKeyTimestamp","lastKeyTimestamp","lastDelta","countOfKey","fields","gatheringFields","field","assign","currentDelta","abs","ctDate","ctTimeMs","ctMouseEventTimerFlag","ctMouseData","ctMouseDataCounter","ctCheckedEmails","ctCheckedEmailsExist","ctMouseReadInterval","ctMouseWriteDataInterval","tokenCheckerIntervalId","botDetectorLogLastUpdate","botDetectorLogEventTypesCollected","attachEvent","apbct_remove_event_handler","detachEvent","ctFunctionFirstKey","ctKeyStopStopListening","ctFunctionMouseMove","cronFormsHandler","data__bot_detector_enabled","data__frontend_data_log_enabled","sendBotDetectorLogToAltSessions","setInterval","ctSetMouseMoved","round","clientY","clientX","ctMouseStopData","cronStartTimeout","restartFieldsListening","restartBotDetectorEventTokenAttach","interval","currentLog","needsSaveLogToAltSessions","log_last_update","records","currentType","frontend_data","js_event","includes","token","doAttach","getElementsByClassName","setEventTokenField","clearInterval","checkEmail","currentEmail","test","now","checkEmailExist","hint","getResultCheckEmailExist","viewCheckEmailExist","envelope","text_result","state","textResult","inputEmail","top","getBoundingClientRect","ctEmailExistSetElementsPositions","onmouseover","textContent","height","onmouseout","left","right","offsetHeight","width","envelopeWidth","offsetWidth","ctIsDrawPixel","pixel__setting","settings__data__bot_detector_enabled","pixel__enabled","ctSetPixelImg","pixelUrl","insertedImg","ctSetPixelImgFromLocalstorage","ctGetPixelUrl","localStoragePixelUrl","String","ctSetHasScrolled","ctStartFieldsListening","ctGetPageForms","handled_fields","handledFormFields","ctFunctionHasInputFocused","ctFunctionHasKeyUp","ctStopFieldsListening","eventName","functionName","ctSetHasInputFocused","ctSetHasKeyUp","apbctPrepareBlockForAjaxForms","ctPrepareBlockMessage","responseText","ctParseBlockMessage","jQuery","ajaxComplete","settings","startForcedAltEventTokenChecker","eventToken","apbct_ready","botDetectorLocalStorage","wc_ajax_add_to_cart","apbctCheckAddToCartByGet","sessionID","URL","host","apbctWriteReferrersToSessionStorage","cookiesType","initCookies","ctTypoData","getTimezoneOffset","apbctGetScreenInfo","webdriver","cookiesArray","trim","pixel__url","data__email_check_before_post","data__email_check_exist_post","tokenForForceAlt","ctAjaxSetupAddCleanTalkDataBeforeSendAjax","ctAddWCMiddlewares","hiddenInput","visibleFieldsToInput","ctCheckHiddenFieldsExclusions","apbct_visible_fields","visibleFields","removeChild","apbct_collect_visible_fields","btoa","onsubmit_prev","onsubmit","ctFormIndex","apbct_visible_fields_set_cookie","isFormThatNeedCatchXhr","noCookieData","getNoCookieData","defaultSend","Function","ctOnsubmitPrevCallExclude","_form","settings__forms__search_test","apbctSearchPrevOnsubmit","ctSearchFormOnSubmitHandler","apbctCatchXmlHttpRequest","settings__sfw__anti_crawler","checkBotDetectorExist","botDetectorIntervalSearch","bot_detector_event_token","wp","apiFetch","use","options","next","requests","path","ct_no_cookie_hidden_field","event_token","originalSend","addidionalCleantalkData","apply","apbctAjaxSetImportantParametersOnCacheExist","cacheExist","ajaxSetup","sourceSign","contains","targetForm","honeyPotField","hpValue","callBack","parsedCookies","cleantalkStorageDataArray","getCleanTalkStorageDataArray","eventTokenLocalStorage","parentNode","HTMLFormElement","submit","apbct_search_form__honeypot_value","ct_bot_detector_event_token","warn","commonCookies","resultDataJson","ct_checked_emails","ct_checked_emails_exist","ct_checkjs","ct_fkp_timestamp","ct_pointer_data","ct_ps_timestamp","ct_screen_info","ct_timezone","ctMouseMovedLocalStorage","ctHasScrolledLocalStorage","ctCookiesTypeLocalStorage","apbctPageHits","apbctPrevReferer","apbctSiteReferer","ctJsErrorsLocalStorage","ctPixelUrl","apbctHeadless","ctBotDetectorFrontendDataLog","ctMouseMovedCookie","ctHasScrolledCookie","ctCookiesTypeCookie","ctCookiesPixelUrl","apbctHeadlessNative","ct_mouse_moved","ct_has_scrolled","ct_cookies_type","apbct_headless","ct_bot_detector_frontend_data_log","apbct_page_hits","apbct_prev_referer","apbct_ct_js_errors","removeDoubleJsonEncoding","inputs","inputsVisible","inputsVisibleCount","inputsInvisible","inputsInvisibleCount","inputsWithDuplicateNames","isNaN","visibility","visible_fields","visible_fields_count","invisible_fields","invisible_fields_count","visibleFieldsCollection","formId","collection","apbct_js_keys__set_input_value","js_key","fullWidth","documentElement","scrollWidth","fullHeight","max","scrollHeight","clientHeight","visibleWidth","clientWidth","visibleHeight","blocked","cleantalkModal","loaded","stop_script","stop","ctSetPixelUrlLocalstorage","ajaxPixelUrl","ctNoCookieConstructHiddenField","collectingUserActivityData","noCookieDataLocal","noCookieDataSession","noCookieDataTypo","typo","noCookieDataFromUserActivity","collecting_user_activity_data","ctGetHiddenFieldExclusionsType","no_cookie","ncFieldExclusionsSign","data__visible_fields_required","hiddenFieldType","formAction","j","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","formClasses","classExists","classForm","sessionCurrentPage","loading","opened","opening","ignoreURLConvert","load","renderCss","cssStr","styles","overlayCss","z-index","position","background","justify-content","align-items","innerCss","padding","border","border-radius","box-shadow","closeCss","box-sizing","closeCssBefore","transform","closeCssAfter","bodyCss","overflow","cleantalkModalStyle","overlay","inner","close","urlRegex","closeAllPopupTRP","allDisplayPopup","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctCheckInternalIsExcludedForm","some","blog_home","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","index","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","ctCurrAction","ctCurrForm","settings__forms__check_internal","formClone","cloneNode","replaceChild","stopImmediatePropagation"],"mappings":"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"}