From b56d25b03eb4cfb490cf98f37edf780bc52dfed6 Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Mon, 19 May 2025 21:48:48 +0700 Subject: [PATCH 1/2] Mod. ApbctJsBundleResolver. The dependence of the js bundle connection on the content encoding option, the implementation of a class to determine the desired bundle --- gulpfile.js | 148 +- inc/cleantalk-public.php | 19 +- js/apbct-public-bundle.min.js | 2 +- js/apbct-public-bundle.min.js.map | 5 - js/apbct-public-bundle_comm-func.min.js | 2 + js/apbct-public-bundle_comm-func.min.js.map | 1 + js/apbct-public-bundle_ext-protection.min.js | 2 +- ...ct-public-bundle_ext-protection.min.js.map | 2 +- ...lic-bundle_ext-protection_comm-func.min.js | 2 + ...bundle_ext-protection_comm-func.min.js.map | 1 + js/apbct-public-bundle_full-protection.min.js | 2 +- ...t-public-bundle_full-protection.min.js.map | 2 +- ...ic-bundle_full-protection_comm-func.min.js | 2 + ...undle_full-protection_comm-func.min.js.map | 1 + js/apbct-public-bundle_int-protection.min.js | 2 +- ...ct-public-bundle_int-protection.min.js.map | 2 +- ...lic-bundle_int-protection_comm-func.min.js | 2 + ...bundle_int-protection_comm-func.min.js.map | 1 + js/src/apbct-public-bundle.js | 441 -- js/src/apbct-public-bundle_comm-func.js | 4693 +++++++++++++ js/src/apbct-public-bundle_ext-protection.js | 441 -- ...-public-bundle_ext-protection_comm-func.js | 5749 ++++++++++++++++ js/src/apbct-public-bundle_full-protection.js | 441 -- ...public-bundle_full-protection_comm-func.js | 5851 +++++++++++++++++ js/src/apbct-public-bundle_int-protection.js | 441 -- ...-public-bundle_int-protection_comm-func.js | 4795 ++++++++++++++ .../ApbctWP/ApbctJsBundleResolver.php | 41 + 27 files changed, 21256 insertions(+), 1835 deletions(-) delete mode 100644 js/apbct-public-bundle.min.js.map create mode 100644 js/apbct-public-bundle_comm-func.min.js create mode 100644 js/apbct-public-bundle_comm-func.min.js.map create mode 100644 js/apbct-public-bundle_ext-protection_comm-func.min.js create mode 100644 js/apbct-public-bundle_ext-protection_comm-func.min.js.map create mode 100644 js/apbct-public-bundle_full-protection_comm-func.min.js create mode 100644 js/apbct-public-bundle_full-protection_comm-func.min.js.map create mode 100644 js/apbct-public-bundle_int-protection_comm-func.min.js create mode 100644 js/apbct-public-bundle_int-protection_comm-func.min.js.map create mode 100644 js/src/apbct-public-bundle_comm-func.js create mode 100644 js/src/apbct-public-bundle_ext-protection_comm-func.js create mode 100644 js/src/apbct-public-bundle_full-protection_comm-func.js create mode 100644 js/src/apbct-public-bundle_int-protection_comm-func.js create mode 100644 lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php diff --git a/gulpfile.js b/gulpfile.js index 9ec40be87..02502a3d2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -50,70 +50,128 @@ function bundle_admin_and_common_js() { /** * Bundle Create */ -// Bundle without external and internal js +// Bundle with common-functions, without external and internal js function bundle_src_js() { return gulp.src([ + 'js/src/apbct-common-functions.js', 'js/src/apbct-public--0*.js', 'js/src/apbct-public--1*.js', 'js/src/apbct-public--2*.js', 'js/src/apbct-public--3*.js', 'js/src/apbct-public--7*.js', - 'js/src/apbct-common-functions.js', ]) // Unminified bundle - .pipe(concat('apbct-public-bundle.js')) + .pipe(concat('apbct-public-bundle_comm-func.js')) .pipe(gulp.dest('js/src/')); } -// Bundle with external js and without internal js -function bundle_src_js_external_protection() { +// Bundle without common-functions, external and internal js +function bundle_src_js_without_cf() { return gulp.src([ - 'js/src/apbct-public--0*.js', - 'js/src/apbct-public--1*.js', - 'js/src/apbct-public--2*.js', - 'js/src/apbct-public--3*.js', - 'js/src/apbct-public--7*.js', - 'js/src/apbct-public--5--external-forms.js', - 'js/src/apbct-common-functions.js', - ]) + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + ]) // Unminified bundle - .pipe(concat('apbct-public-bundle_ext-protection.js')) + .pipe(concat('apbct-public-bundle.js')) .pipe(gulp.dest('js/src/')); } -// Bundle with internal js and without external js +// Bundle with common-functions, external js and without internal js +function bundle_src_js_external_protection() { + return gulp.src([ + 'js/src/apbct-common-functions.js', + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--5--external-forms.js', + ]) + // Unminified bundle + .pipe(concat('apbct-public-bundle_ext-protection_comm-func.js')) + .pipe(gulp.dest('js/src/')); +} + +// Bundle with external js and without internal js, common-functions +function bundle_src_js_external_protection_without_cf() { + return gulp.src([ + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--5--external-forms.js', + ]) + // Unminified bundle + .pipe(concat('apbct-public-bundle_ext-protection.js')) + .pipe(gulp.dest('js/src/')); +} + +// Bundle with common-functions, internal js and without external js function bundle_src_js_internal_protection() { return gulp.src([ - 'js/src/apbct-common-functions.js', - 'js/src/apbct-public--0*.js', - 'js/src/apbct-public--1*.js', - 'js/src/apbct-public--2*.js', - 'js/src/apbct-public--3*.js', - 'js/src/apbct-public--7*.js', - 'js/src/apbct-public--6--internal-forms.js', - 'js/src/apbct-common-functions.js', - ]) - // Unminified bundle - .pipe(concat('apbct-public-bundle_int-protection.js')) - .pipe(gulp.dest('js/src/')); + 'js/src/apbct-common-functions.js', + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--6--internal-forms.js', + ]) + // Unminified bundle + .pipe(concat('apbct-public-bundle_int-protection_comm-func.js')) + .pipe(gulp.dest('js/src/')); } -// Bundle with external and internal js -function bundle_src_js_ext_int_protection() { +// Bundle with internal js and without external js, common-functions +function bundle_src_js_internal_protection_without_cf() { return gulp.src([ - 'js/src/apbct-common-functions.js', - 'js/src/apbct-public--0*.js', - 'js/src/apbct-public--1*.js', - 'js/src/apbct-public--2*.js', - 'js/src/apbct-public--3*.js', - 'js/src/apbct-public--7*.js', - 'js/src/apbct-public--5--external-forms.js', - 'js/src/apbct-public--6--internal-forms.js', - 'js/src/apbct-common-functions.js', - ]) - // Unminified bundle - .pipe(concat('apbct-public-bundle_full-protection.js')) - .pipe(gulp.dest('js/src/')); + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--6--internal-forms.js', + ]) + // Unminified bundle + .pipe(concat('apbct-public-bundle_int-protection.js')) + .pipe(gulp.dest('js/src/')); +} + +// Bundle with common-functions, external and internal js +function bundle_src_js_full_protection() { + return gulp.src([ + 'js/src/apbct-common-functions.js', + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--5--external-forms.js', + 'js/src/apbct-public--6--internal-forms.js', + ]) + // Unminified bundle + .pipe(concat('apbct-public-bundle_full-protection_comm-func.js')) + .pipe(gulp.dest('js/src/')); +} + +// Bundle with external and internal js, without common-functions +function bundle_src_js_full_protection_without_cf() { + return gulp.src([ + 'js/src/apbct-public--0*.js', + 'js/src/apbct-public--1*.js', + 'js/src/apbct-public--2*.js', + 'js/src/apbct-public--3*.js', + 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--5--external-forms.js', + 'js/src/apbct-public--6--internal-forms.js', + ]) + // Unminified bundle + .pipe(concat('apbct-public-bundle_full-protection.js')) + .pipe(gulp.dest('js/src/')); } function bundle_js() { @@ -129,9 +187,13 @@ function bundle_js() { gulp.task('compress-js', gulp.series( bundle_src_js, + bundle_src_js_without_cf, bundle_src_js_external_protection, + bundle_src_js_external_protection_without_cf, bundle_src_js_internal_protection, - bundle_src_js_ext_int_protection, + bundle_src_js_internal_protection_without_cf, + bundle_src_js_full_protection, + bundle_src_js_full_protection_without_cf, bundle_js, compress_all_js, bundle_admin_and_common_js diff --git a/inc/cleantalk-public.php b/inc/cleantalk-public.php index 801f04ad6..def2e311b 100644 --- a/inc/cleantalk-public.php +++ b/inc/cleantalk-public.php @@ -9,6 +9,7 @@ use Cleantalk\ApbctWP\Variables\Post; use Cleantalk\ApbctWP\Variables\Server; use Cleantalk\ApbctWP\LinkConstructor; +use Cleantalk\ApbctWP\ApbctJsBundleResolver; /** * Init functions @@ -1262,23 +1263,9 @@ function apbct_enqueue_and_localize_public_scripts() global $apbct; $in_footer = defined('CLEANTALK_PLACE_PUBLIC_JS_SCRIPTS_IN_FOOTER') && CLEANTALK_PLACE_PUBLIC_JS_SCRIPTS_IN_FOOTER; - // Different JS params - if (!$apbct->settings['forms__check_external'] && !$apbct->settings['forms__check_internal']) { - ApbctEnqueue::getInstance()->js('apbct-public-bundle.js', array(), $in_footer); - } - - if ($apbct->settings['forms__check_external'] && !$apbct->settings['forms__check_internal']) { - ApbctEnqueue::getInstance()->js('apbct-public-bundle_ext-protection.js', array(), $in_footer); - } - - if ($apbct->settings['forms__check_internal'] && !$apbct->settings['forms__check_external']) { - ApbctEnqueue::getInstance()->js('apbct-public-bundle_int-protection.js', array(), $in_footer); - } - - if ($apbct->settings['forms__check_external'] && $apbct->settings['forms__check_internal']) { - ApbctEnqueue::getInstance()->js('apbct-public-bundle_full-protection.js', array(), $in_footer); - } + $bundle_name = ApbctJsBundleResolver::getBundleName($apbct->settings); + ApbctEnqueue::getInstance()->js($bundle_name, array(), $in_footer); // Bot detector if ( $apbct->settings['data__bot_detector_enabled'] && ! apbct_bot_detector_scripts_exclusion()) { diff --git a/js/apbct-public-bundle.min.js b/js/apbct-public-bundle.min.js index cff391e3c..11d2eeea5 100644 --- a/js/apbct-public-bundle.min.js +++ b/js/apbct-public-bundle.min.js @@ -1 +1 @@ -function ownKeys(t,e){var o,n=Object.keys(t);return Object.getOwnPropertySymbols&&(o=Object.getOwnPropertySymbols(t),e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,o)),n}function _objectSpread(t){for(var e=1;e=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:t};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){var o;if(e)return"string"==typeof e?_arrayLikeToArray(e,t):"Map"===(o="Object"===(o={}.toString.call(e).slice(8,-1))&&e.constructor?e.constructor.name:o)||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(e,t):void 0}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,n=Array(t);o_createClass(function e(t){_classCallCheck(this,e),_defineProperty(this,"ajax_parameters",{}),_defineProperty(this,"restParameters",{}),_defineProperty(this,"selector",null),_defineProperty(this,"elements",[]),_defineProperty(this,"eventCallback",void 0),_defineProperty(this,"eventSelector",void 0),_defineProperty(this,"event",void 0),this.select(t)},[{key:"select",value:function(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"===_typeof(e)?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}},{key:"addElement",value:function(e){"object"===_typeof(e)?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}},{key:"push",value:function(e){this.elements.push(e)}},{key:"reduce",value:function(){this.elements=this.elements.slice(0,-1)}},{key:"deselect",value:function(){this.elements=[]}},{key:"css",value:function(e,t){if(t=t||!1,"object"===_typeof(e)){for(var o in e)if(Object.hasOwn(e,o))for(var n=o.replace(/([-_][a-z])/g,function(e){return e.toUpperCase().replace("-","").replace("_","")}),c=0;c(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||Boolean(e[t]):o||(null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)):o}},{key:"isWithoutSelector",value:function(e,t){var o,n=!1,c=_createForOfIteratorHelper(document.querySelectorAll(t));try{for(c.s();!(o=c.n()).done;)n=n||e===o.value}catch(e){c.e(e)}finally{c.f()}return n}},{key:"filter",value:function(e){this.selector=null;for(var t=this.elements.length-1;0<=t;t--)this.isElem(this.elements[t],e)||this.elements.splice(Number(t),1);return this}},{key:"parent",value:function(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}},{key:"parents",value:function(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}},{key:"children",value:function(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}},{key:"siblings",value:function(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}},{key:"remove",value:function(){var e,t=_createForOfIteratorHelper(this.elements);try{for(t.s();!(e=t.n()).done;)e.value.remove()}catch(e){t.e(e)}finally{t.f()}}},{key:"after",value:function(e){var t,o=_createForOfIteratorHelper(this.elements);try{for(o.s();!(t=o.n()).done;)t.value.after(e)}catch(e){o.e(e)}finally{o.f()}}},{key:"append",value:function(e){var t,o=_createForOfIteratorHelper(this.elements);try{for(o.s();!(t=o.n()).done;)t.value.append(e)}catch(e){o.e(e)}finally{o.f()}}},{key:"fadeIn",value:function(n){var c,t=_createForOfIteratorHelper(this.elements);try{for(t.s();!(c=t.n()).done;)(()=>{function e(){t.style.opacity=+t.style.opacity+(new Date-o)/n,o=+new Date,+t.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(e)||setTimeout(e,16))}var t=c.value,o=(t.style.opacity=0,t.style.display="block",+new Date);e()})()}catch(e){t.e(e)}finally{t.f()}}},{key:"fadeOut",value:function(n){var c,t=_createForOfIteratorHelper(this.elements);try{for(t.s();!(c=t.n()).done;)(()=>{function e(){t.style.opacity=+t.style.opacity-(new Date-o)/n,o=+new Date,0<+t.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(e)||setTimeout(e,16):t.style.display="none"}var t=c.value,o=(t.style.opacity=1,+new Date);e()})()}catch(e){t.e(e)}finally{t.f()}}}]))();function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");null===(n=localStorage.getItem(e))&&(n="[]");for(var n=JSON.parse(n),c=0;c{function n(e){for(var t in _classCallCheck(this,n),_defineProperty(this,"xhr",new XMLHttpRequest),_defineProperty(this,"method","POST"),_defineProperty(this,"url",""),_defineProperty(this,"async",!0),_defineProperty(this,"user",null),_defineProperty(this,"password",null),_defineProperty(this,"data",{}),_defineProperty(this,"button",null),_defineProperty(this,"spinner",null),_defineProperty(this,"progressbar",null),_defineProperty(this,"context",this),_defineProperty(this,"callback",null),_defineProperty(this,"onErrorCallback",null),_defineProperty(this,"responseType","json"),_defineProperty(this,"headers",{}),_defineProperty(this,"timeout",15e3),_defineProperty(this,"methods_to_convert_data_to_URL",["GET","HEAD"]),_defineProperty(this,"body",null),_defineProperty(this,"http_code",0),_defineProperty(this,"status_text",""),e)void 0!==this[t]&&(this[t]=e[t]);if(this.prepare(),Object.keys(this.data).length&&(this.deleteDoubleJSONEncoding(this.data),this.convertData()),!this.url)return console.log("%cXHR%c not URL provided","color: red; font-weight: bold;","color: grey; font-weight: normal;"),!1;this.xhr.open(this.method,this.url,this.async,this.user,this.password),this.setHeaders(),this.xhr.responseType=this.responseType,this.xhr.timeout=this.timeout,this.xhr.onreadystatechange=function(){this.isWpNonceError()?this.getFreshNonceAndRerunXHR(e):this.onReadyStateChange()}.bind(this),this.xhr.onload=function(){this.onLoad()}.bind(this),this.xhr.onprogress=function(e){this.onProgress(e)}.bind(this),this.xhr.onerror=function(){this.onError()}.bind(this),this.xhr.ontimeout=function(){this.onTimeout()}.bind(this),this.xhr.send(this.body)}return _createClass(n,[{key:"prepare",value:function(){this.button&&(this.button.setAttribute("disabled","disabled"),this.button.style.cursor="not-allowed"),this.spinner&&(this.spinner.style.display="inline")}},{key:"complete",value:function(){this.http_code=this.xhr.status,this.status_text=this.xhr.statusText,this.button&&(this.button.removeAttribute("disabled"),this.button.style.cursor="auto"),this.spinner&&(this.spinner.style.display="none"),this.progressbar&&this.progressbar.fadeOut("slow")}},{key:"onReadyStateChange",value:function(){null!==this.on_ready_state_change&&"function"==typeof this.on_ready_state_change&&this.on_ready_state_change()}},{key:"onProgress",value:function(e){null!==this.on_progress&&"function"==typeof this.on_progress&&this.on_progress()}},{key:"onError",value:function(){console.log("error"),this.complete(),this.error(this.http_code,this.status_text),null!==this.onErrorCallback&&"function"==typeof this.onErrorCallback&&this.onErrorCallback(this.status_text)}},{key:"onTimeout",value:function(){this.complete(),this.error(0,"timeout"),null!==this.onErrorCallback&&"function"==typeof this.onErrorCallback&&this.onErrorCallback("Timeout")}},{key:"onLoad",value:function(){if(this.complete(),"json"===this.responseType){if(null===this.xhr.response)return this.error(this.http_code,this.status_text,"No response"),!1;if(void 0!==this.xhr.response.error)return this.error(this.http_code,this.status_text,this.xhr.response.error),!1}null!==this.callback&&"function"==typeof this.callback&&this.callback.call(this.context,this.xhr.response,this.data)}},{key:"isWpNonceError",value:function(){var e=!1,t=!1;return 4==this.xhr.readyState&&(e="object"===_typeof(this.xhr.response)&&null!==this.xhr.response&&this.xhr.response.hasOwnProperty("data")&&this.xhr.response.data.hasOwnProperty("status")&&403===this.xhr.response.data.status,t="-1"===this.xhr.response&&403===this.xhr.status),e||t}},{key:"getFreshNonceAndRerunXHR",value:function(e){var t,o="";e.hasOwnProperty("headers")&&e.headers.hasOwnProperty("X-WP-Nonce")&&(o=e.headers["X-WP-Nonce"]),""!==(o=e.hasOwnProperty("data")&&e.data.hasOwnProperty("_ajax_nonce")?e.data._ajax_nonce:o)&&((t={method:"POST"}).data={spbc_remote_call_action:"get_fresh_wpnonce",plugin_name:"antispam",nonce_prev:o,initial_request_params:e},t.notJson=!0,t.url=ctPublicFunctions.host_url,t.callback=function(){for(var e=arguments.length,t=new Array(e),o=0;o{function n(){for(var e=arguments.length,t=new Array(e),o=0;o{function c(){for(var e=arguments.length,t=new Array(e),o=0;o_createClass(function e(){_classCallCheck(this,e),_defineProperty(this,"elementBody",document.querySelector("body")),_defineProperty(this,"collectionForms",document.forms),this.setListeners()},[{key:"setListeners",value:function(){var t=this;this.elementBody.addEventListener("click",function(e){t.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",function(e){"Range"==document.getSelection().type.toString()&&t.addSelected()}),this.elementBody.addEventListener("mousemove",function(e){t.checkElementInForms(e,"trackMouseMovement")})}},{key:"checkElementInForms",value:function(e,t){for(var o,n=0;nMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){for(var e={},t=0;t_createClass(function e(){_classCallCheck(this,e),_defineProperty(this,"wrappers",[]),this.wrappers=this.findWrappers(),this.wrappers.length<1||this.checkBot()},[{key:"findWrappers",value:function(){return document.querySelectorAll("div.ct-encoded-form-wrapper")}},{key:"checkBot",value:function(){var t=this,e={event_javascript_data:getJavascriptClientData(),post_url:document.location.href,referrer:document.referrer};"rest"===ctPublicFunctions.data__ajax_type?apbct_public_sendREST("force_protection_check_bot",{data:e,method:"POST",callback:function(e){return t.checkBotCallback(e)}}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:function(e){return t.checkBotCallback(e)}}))}},{key:"checkBotCallback",value:function(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"===_typeof(e)&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}},{key:"decodeForms",value:function(){var t;this.wrappers.forEach(function(e){t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}},{key:"showMessageForBot",value:function(t){this.wrappers.forEach(function(e){e.querySelector("div.ct-encoded-form").dataset.encodedForm&&(e.outerHTML='
'+t+"
")})}}]))();function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));var ctMouseReadInterval,ctMouseWriteDataInterval,tokenCheckerIntervalId,CTTypoData=(()=>_createClass(function e(){_classCallCheck(this,e),_defineProperty(this,"fieldData",{isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0}),_defineProperty(this,"fields",document.querySelectorAll("textarea[name=comment]")),_defineProperty(this,"data",[])},[{key:"gatheringFields",value:function(){var o=this;Array.prototype.slice.call(this.fields).forEach(function(e,t){o.data.push(Object.assign({},o.fieldData))})}},{key:"setListeners",value:function(){var n=this;this.fields.forEach(function(e,t){e.addEventListener("paste",function(){n.data[t].isUseBuffer=!0})}),this.fields.forEach(function(e,t){e.addEventListener("onautocomplete",function(){n.data[t].isAutoFill=!0})}),this.fields.forEach(function(e,o){e.addEventListener("input",function(){n.data[o].countOfKey++;var e,t=+new Date;1===n.data[o].countOfKey?(n.data[o].lastKeyTimestamp=t,n.data[o].firstKeyTimestamp=t):(e=t-n.data[o].lastKeyTimestamp,2===n.data[o].countOfKey?(n.data[o].lastKeyTimestamp=t,n.data[o].lastDelta=e):2{var t=r.value;if("undefined"!=typeof ctPublic&&1==+ctPublic.settings__forms__search_test&&("searchform"===t.getAttribute("id")||null!==t.getAttribute("class")&&-1!==t.getAttribute("class").indexOf("search-form")||null!==t.getAttribute("role")&&-1!==t.getAttribute("role").indexOf("search")))t.querySelector("input.dgwt-wcas-search-input")||"hero-search-form"===t.getAttribute("id")||"hb-booking-search-form"===t.getAttribute("class")||(t.apbctSearchPrevOnsubmit=t.onsubmit,t.onsubmit=function(e){return ctSearchFormOnSubmitHandler(e,t)})})()}catch(e){s.e(e)}finally{s.f()}apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){var e;ctPublic.settings__data__bot_detector_enabled&&(e=setInterval(function(){!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500))}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use(function(e,t){return"object"===_typeof(e)&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{var t=e.value;o.forEach(function(e){t.classList.contains(e)&&(n=!0)})})()}catch(e){t.e(e)}finally{t.f()}return n}function isFormThatNeedCatchXhr(e){return null==document.querySelector("div.elementor-widget[title='Login/Signup']")&&!(!e||!e.action||-1===e.action.toString().indexOf("mailpoet_subscription_form"))}function getNoCookieData(){var e=apbctLocalStorage.getCleanTalkData(),t=apbctSessionStorage.getCleanTalkData(),e=_objectSpread(_objectSpread({},e),t),e=JSON.stringify(e);return"_ct_no_cookie_data_"+btoa(e)}function apbctWriteReferrersToSessionStorage(){var e=apbctSessionStorage.get("apbct_session_current_page");!1!==e&&document.location.href!==e&&apbctSessionStorage.set("apbct_prev_referer",e,!1),apbctSessionStorage.set("apbct_session_current_page",document.location.href,!1)}function apbctCheckAddToCartByGet(){document.querySelectorAll("a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)").forEach(function(n){n.addEventListener("click",function(e){var t=n.getAttribute("href"),o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",n.setAttribute("href",t+="ct_bot_detector_event_token="+o))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);var cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,n){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){var e,t="";for(e in this.styles)t+=e+":"+this.styles[e]+";";return t}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},n={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},c={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+n+"}",r.innerHTML+="#cleantalk-modal-close:before{"+c+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),n=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),c=(n.setAttribute("id","cleantalk-modal-close"),t.append(n),document.createElement("div"));this.loaded?/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?c.innerHTML=this.loaded:c.innerHTML=this.loaded.replace(/(https?:\/\/[^\s]+)/g,'$1'):(c.innerHTML="Loading...",this.load("get_options_template")),c.setAttribute("id","cleantalk-modal-content"),t.append(c),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{var o,e;if(i.data.forEach(function(e){e.encoded_email===a[t].dataset.originalString&&(o=e)}),!1===o.is_allowed)return{v:void 0};if(void 0===a[t].href||0!==a[t].href.indexOf("mailto:")&&0!==a[t].href.indexOf("tel:"))a[t].classList.add("no-blur"),setTimeout(function(){ctProcessDecodedDataResult(o,a[t])},2e3);else{if(0===a[t].href.indexOf("mailto:"))e="mailto:";else{if(0!==a[t].href.indexOf("tel:"))return 0;e="tel:"}var n=a[t].href.replace(e,""),c=a[t].innerHTML;a[t].innerHTML=c.replace(n,o.decoded_email),a[t].href=e+o.decoded_email,a[t].querySelectorAll("span.apbct-email-encoder").forEach(function(t){var o="";i.data.forEach(function(e){e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}a[t].removeEventListener("click",ctFillDecodedEmailHandler)})(t))&&e)return e.v}else{var o=i.data[0];a.classList.add("no-blur"),setTimeout(function(){ctProcessDecodedDataResult(o,a)},2e3),a.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}document.addEventListener("click",function(e){!e.target||"cleantalk-modal-overlay"!==e.target.id&&"cleantalk-modal-close"!==e.target.id||cleantalkModal.close()}),document.addEventListener("cleantalkModalContentLoaded",function(e){cleantalkModal.opened&&cleantalkModal.loaded&&(document.getElementById("cleantalk-modal-content").innerHTML=cleantalkModal.loaded)}),document.addEventListener("DOMContentLoaded",function(){var e,t=this,l=void 0,d=!1;"undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(l="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:l)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(l=ctTrpAdminLocalize.theRealPerson,d=!0),l&&(e='.apbct-trp *[class*="comment-author"]',document.querySelector(".apbct-trp .comment-author .comment-author-link")&&(e='.apbct-trp *[class*="comment-author-link"]'),0!==(e=document.querySelectorAll(e+',.apbct-trp *[class*="review__author"],.apbct-trp td[class*="column-author"] > strong')).length)&&(e.forEach(function(e,t){var o,n,c,a,i,r,s;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(n=document.createElement("img")).setAttribute("src",l.imgPersonUrl),n.setAttribute("class","apbct-real-user-popup-img"),(c=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(l.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(l.phrases.trpContent1+" "),r.append(l.phrases.trpContent2),d&&((s=document.createElement("a")).setAttribute("href",l.trpContentLink),s.setAttribute("target","_blank"),s.text=l.phrases.trpContentLearnMore,r.append(" "),r.append(s)),i.append(r),c.append(a,i),o.append(n),e.append(o),e.append(c))}),document.querySelectorAll(".apbct-real-user-badge").forEach(function(n){var c=void 0,e=(t.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),n.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),n.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),n.addEventListener("mouseleave",function(){var t=this;c=setTimeout(function(){var e=t.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),n.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(function(){e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),n.addEventListener("touchend",function(){var o=this;c=setTimeout(function(){var e=o.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(function(){var e=n.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}); \ No newline at end of file +function ownKeys(t,e){var o,n=Object.keys(t);return Object.getOwnPropertySymbols&&(o=Object.getOwnPropertySymbols(t),e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,o)),n}function _objectSpread(t){for(var e=1;e=e.length?{done:!0}:{done:!1,value:e[c++]}},e:function(e){throw e},f:t};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){var o;if(e)return"string"==typeof e?_arrayLikeToArray(e,t):"Map"===(o="Object"===(o={}.toString.call(e).slice(8,-1))&&e.constructor?e.constructor.name:o)||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(e,t):void 0}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,n=Array(t);o_createClass(function e(t){_classCallCheck(this,e),_defineProperty(this,"ajax_parameters",{}),_defineProperty(this,"restParameters",{}),_defineProperty(this,"selector",null),_defineProperty(this,"elements",[]),_defineProperty(this,"eventCallback",void 0),_defineProperty(this,"eventSelector",void 0),_defineProperty(this,"event",void 0),this.select(t)},[{key:"select",value:function(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"===_typeof(e)?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}},{key:"addElement",value:function(e){"object"===_typeof(e)?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}},{key:"push",value:function(e){this.elements.push(e)}},{key:"reduce",value:function(){this.elements=this.elements.slice(0,-1)}},{key:"deselect",value:function(){this.elements=[]}},{key:"css",value:function(e,t){if(t=t||!1,"object"===_typeof(e)){for(var o in e)if(Object.hasOwn(e,o))for(var n=o.replace(/([-_][a-z])/g,function(e){return e.toUpperCase().replace("-","").replace("_","")}),a=0;a(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||Boolean(e[t]):o||(null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)):o}},{key:"isWithoutSelector",value:function(e,t){var o,n=!1,a=_createForOfIteratorHelper(document.querySelectorAll(t));try{for(a.s();!(o=a.n()).done;)n=n||e===o.value}catch(e){a.e(e)}finally{a.f()}return n}},{key:"filter",value:function(e){this.selector=null;for(var t=this.elements.length-1;0<=t;t--)this.isElem(this.elements[t],e)||this.elements.splice(Number(t),1);return this}},{key:"parent",value:function(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}},{key:"parents",value:function(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}},{key:"children",value:function(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}},{key:"siblings",value:function(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}},{key:"remove",value:function(){var e,t=_createForOfIteratorHelper(this.elements);try{for(t.s();!(e=t.n()).done;)e.value.remove()}catch(e){t.e(e)}finally{t.f()}}},{key:"after",value:function(e){var t,o=_createForOfIteratorHelper(this.elements);try{for(o.s();!(t=o.n()).done;)t.value.after(e)}catch(e){o.e(e)}finally{o.f()}}},{key:"append",value:function(e){var t,o=_createForOfIteratorHelper(this.elements);try{for(o.s();!(t=o.n()).done;)t.value.append(e)}catch(e){o.e(e)}finally{o.f()}}},{key:"fadeIn",value:function(n){var a,t=_createForOfIteratorHelper(this.elements);try{for(t.s();!(a=t.n()).done;)(()=>{function e(){t.style.opacity=+t.style.opacity+(new Date-o)/n,o=+new Date,+t.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(e)||setTimeout(e,16))}var t=a.value,o=(t.style.opacity=0,t.style.display="block",+new Date);e()})()}catch(e){t.e(e)}finally{t.f()}}},{key:"fadeOut",value:function(n){var a,t=_createForOfIteratorHelper(this.elements);try{for(t.s();!(a=t.n()).done;)(()=>{function e(){t.style.opacity=+t.style.opacity-(new Date-o)/n,o=+new Date,0<+t.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(e)||setTimeout(e,16):t.style.display="none"}var t=a.value,o=(t.style.opacity=1,+new Date);e()})()}catch(e){t.e(e)}finally{t.f()}}}]))();function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");null===(n=localStorage.getItem(e))&&(n="[]");for(var n=JSON.parse(n),a=0;a{function n(e){for(var t in _classCallCheck(this,n),_defineProperty(this,"xhr",new XMLHttpRequest),_defineProperty(this,"method","POST"),_defineProperty(this,"url",""),_defineProperty(this,"async",!0),_defineProperty(this,"user",null),_defineProperty(this,"password",null),_defineProperty(this,"data",{}),_defineProperty(this,"button",null),_defineProperty(this,"spinner",null),_defineProperty(this,"progressbar",null),_defineProperty(this,"context",this),_defineProperty(this,"callback",null),_defineProperty(this,"onErrorCallback",null),_defineProperty(this,"responseType","json"),_defineProperty(this,"headers",{}),_defineProperty(this,"timeout",15e3),_defineProperty(this,"methods_to_convert_data_to_URL",["GET","HEAD"]),_defineProperty(this,"body",null),_defineProperty(this,"http_code",0),_defineProperty(this,"status_text",""),e)void 0!==this[t]&&(this[t]=e[t]);if(this.prepare(),Object.keys(this.data).length&&(this.deleteDoubleJSONEncoding(this.data),this.convertData()),!this.url)return console.log("%cXHR%c not URL provided","color: red; font-weight: bold;","color: grey; font-weight: normal;"),!1;this.xhr.open(this.method,this.url,this.async,this.user,this.password),this.setHeaders(),this.xhr.responseType=this.responseType,this.xhr.timeout=this.timeout,this.xhr.onreadystatechange=function(){this.isWpNonceError()?this.getFreshNonceAndRerunXHR(e):this.onReadyStateChange()}.bind(this),this.xhr.onload=function(){this.onLoad()}.bind(this),this.xhr.onprogress=function(e){this.onProgress(e)}.bind(this),this.xhr.onerror=function(){this.onError()}.bind(this),this.xhr.ontimeout=function(){this.onTimeout()}.bind(this),this.xhr.send(this.body)}return _createClass(n,[{key:"prepare",value:function(){this.button&&(this.button.setAttribute("disabled","disabled"),this.button.style.cursor="not-allowed"),this.spinner&&(this.spinner.style.display="inline")}},{key:"complete",value:function(){this.http_code=this.xhr.status,this.status_text=this.xhr.statusText,this.button&&(this.button.removeAttribute("disabled"),this.button.style.cursor="auto"),this.spinner&&(this.spinner.style.display="none"),this.progressbar&&this.progressbar.fadeOut("slow")}},{key:"onReadyStateChange",value:function(){null!==this.on_ready_state_change&&"function"==typeof this.on_ready_state_change&&this.on_ready_state_change()}},{key:"onProgress",value:function(e){null!==this.on_progress&&"function"==typeof this.on_progress&&this.on_progress()}},{key:"onError",value:function(){console.log("error"),this.complete(),this.error(this.http_code,this.status_text),null!==this.onErrorCallback&&"function"==typeof this.onErrorCallback&&this.onErrorCallback(this.status_text)}},{key:"onTimeout",value:function(){this.complete(),this.error(0,"timeout"),null!==this.onErrorCallback&&"function"==typeof this.onErrorCallback&&this.onErrorCallback("Timeout")}},{key:"onLoad",value:function(){if(this.complete(),"json"===this.responseType){if(null===this.xhr.response)return this.error(this.http_code,this.status_text,"No response"),!1;if(void 0!==this.xhr.response.error)return this.error(this.http_code,this.status_text,this.xhr.response.error),!1}null!==this.callback&&"function"==typeof this.callback&&this.callback.call(this.context,this.xhr.response,this.data)}},{key:"isWpNonceError",value:function(){var e=!1,t=!1;return 4==this.xhr.readyState&&(e="object"===_typeof(this.xhr.response)&&null!==this.xhr.response&&this.xhr.response.hasOwnProperty("data")&&this.xhr.response.data.hasOwnProperty("status")&&403===this.xhr.response.data.status,t="-1"===this.xhr.response&&403===this.xhr.status),e||t}},{key:"getFreshNonceAndRerunXHR",value:function(e){var t,o="";e.hasOwnProperty("headers")&&e.headers.hasOwnProperty("X-WP-Nonce")&&(o=e.headers["X-WP-Nonce"]),""!==(o=e.hasOwnProperty("data")&&e.data.hasOwnProperty("_ajax_nonce")?e.data._ajax_nonce:o)&&((t={method:"POST"}).data={spbc_remote_call_action:"get_fresh_wpnonce",plugin_name:"antispam",nonce_prev:o,initial_request_params:e},t.notJson=!0,t.url=ctPublicFunctions.host_url,t.callback=function(){for(var e=arguments.length,t=new Array(e),o=0;o{function n(){for(var e=arguments.length,t=new Array(e),o=0;o{function a(){for(var e=arguments.length,t=new Array(e),o=0;o_createClass(function e(){_classCallCheck(this,e),_defineProperty(this,"elementBody",document.querySelector("body")),_defineProperty(this,"collectionForms",document.forms),this.setListeners()},[{key:"setListeners",value:function(){var t=this;this.elementBody.addEventListener("click",function(e){t.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",function(e){"Range"==document.getSelection().type.toString()&&t.addSelected()}),this.elementBody.addEventListener("mousemove",function(e){t.checkElementInForms(e,"trackMouseMovement")})}},{key:"checkElementInForms",value:function(e,t){for(var o,n=0;nMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){for(var e={},t=0;t_createClass(function e(){_classCallCheck(this,e),_defineProperty(this,"wrappers",[]),this.wrappers=this.findWrappers(),this.wrappers.length<1||this.checkBot()},[{key:"findWrappers",value:function(){return document.querySelectorAll("div.ct-encoded-form-wrapper")}},{key:"checkBot",value:function(){var t=this,e={event_javascript_data:getJavascriptClientData(),post_url:document.location.href,referrer:document.referrer};"rest"===ctPublicFunctions.data__ajax_type?apbct_public_sendREST("force_protection_check_bot",{data:e,method:"POST",callback:function(e){return t.checkBotCallback(e)}}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:function(e){return t.checkBotCallback(e)}}))}},{key:"checkBotCallback",value:function(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"===_typeof(e)&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}},{key:"decodeForms",value:function(){var t;this.wrappers.forEach(function(e){t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}},{key:"showMessageForBot",value:function(t){this.wrappers.forEach(function(e){e.querySelector("div.ct-encoded-form").dataset.encodedForm&&(e.outerHTML='
'+t+"
")})}}]))();function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));var ctMouseReadInterval,ctMouseWriteDataInterval,tokenCheckerIntervalId,CTTypoData=(()=>_createClass(function e(){_classCallCheck(this,e),_defineProperty(this,"fieldData",{isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0}),_defineProperty(this,"fields",document.querySelectorAll("textarea[name=comment]")),_defineProperty(this,"data",[])},[{key:"gatheringFields",value:function(){var o=this;Array.prototype.slice.call(this.fields).forEach(function(e,t){o.data.push(Object.assign({},o.fieldData))})}},{key:"setListeners",value:function(){var n=this;this.fields.forEach(function(e,t){e.addEventListener("paste",function(){n.data[t].isUseBuffer=!0})}),this.fields.forEach(function(e,t){e.addEventListener("onautocomplete",function(){n.data[t].isAutoFill=!0})}),this.fields.forEach(function(e,o){e.addEventListener("input",function(){n.data[o].countOfKey++;var e,t=+new Date;1===n.data[o].countOfKey?(n.data[o].lastKeyTimestamp=t,n.data[o].firstKeyTimestamp=t):(e=t-n.data[o].lastKeyTimestamp,2===n.data[o].countOfKey?(n.data[o].lastKeyTimestamp=t,n.data[o].lastDelta=e):2{var t=r.value;if("undefined"!=typeof ctPublic&&1==+ctPublic.settings__forms__search_test&&("searchform"===t.getAttribute("id")||null!==t.getAttribute("class")&&-1!==t.getAttribute("class").indexOf("search-form")||null!==t.getAttribute("role")&&-1!==t.getAttribute("role").indexOf("search")))t.querySelector("input.dgwt-wcas-search-input")||"hero-search-form"===t.getAttribute("id")||"hb-booking-search-form"===t.getAttribute("class")||(t.apbctSearchPrevOnsubmit=t.onsubmit,t.onsubmit=function(e){return ctSearchFormOnSubmitHandler(e,t)})})()}catch(e){s.e(e)}finally{s.f()}apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){var e;ctPublic.settings__data__bot_detector_enabled&&(e=setInterval(function(){!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500))}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use(function(e,t){return"object"===_typeof(e)&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{var t=e.value;o.forEach(function(e){t.classList.contains(e)&&(n=!0)})})()}catch(e){t.e(e)}finally{t.f()}return n}function isFormThatNeedCatchXhr(e){return null==document.querySelector("div.elementor-widget[title='Login/Signup']")&&!(!e||!e.action||-1===e.action.toString().indexOf("mailpoet_subscription_form"))}function getNoCookieData(){var e=apbctLocalStorage.getCleanTalkData(),t=apbctSessionStorage.getCleanTalkData(),e=_objectSpread(_objectSpread({},e),t),e=JSON.stringify(e);return"_ct_no_cookie_data_"+btoa(e)}function apbctWriteReferrersToSessionStorage(){var e=apbctSessionStorage.get("apbct_session_current_page");!1!==e&&document.location.href!==e&&apbctSessionStorage.set("apbct_prev_referer",e,!1),apbctSessionStorage.set("apbct_session_current_page",document.location.href,!1)}function apbctCheckAddToCartByGet(){document.querySelectorAll("a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)").forEach(function(n){n.addEventListener("click",function(e){var t=n.getAttribute("href"),o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",n.setAttribute("href",t+="ct_bot_detector_event_token="+o))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);var cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,n){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){var e,t="";for(e in this.styles)t+=e+":"+this.styles[e]+";";return t}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},n={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},c={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+n+"}",r.innerHTML+="#cleantalk-modal-close:before{"+a+"}",r.innerHTML+="#cleantalk-modal-close:after{"+c+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),n=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),a=(n.setAttribute("id","cleantalk-modal-close"),t.append(n),document.createElement("div"));this.loaded?/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?a.innerHTML=this.loaded:a.innerHTML=this.loaded.replace(/(https?:\/\/[^\s]+)/g,'$1'):(a.innerHTML="Loading...",this.load("get_options_template")),a.setAttribute("id","cleantalk-modal-content"),t.append(a),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0 strong')).length)&&(e.forEach(function(e,t){var o,n,a,c,i,r,s;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(n=document.createElement("img")).setAttribute("src",l.imgPersonUrl),n.setAttribute("class","apbct-real-user-popup-img"),(a=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(c=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),c.append(l.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(l.phrases.trpContent1+" "),r.append(l.phrases.trpContent2),u&&((s=document.createElement("a")).setAttribute("href",l.trpContentLink),s.setAttribute("target","_blank"),s.text=l.phrases.trpContentLearnMore,r.append(" "),r.append(s)),i.append(r),a.append(c,i),o.append(n),e.append(o),e.append(a))}),document.querySelectorAll(".apbct-real-user-badge").forEach(function(n){var a=void 0,e=(t.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),n.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),n.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),n.addEventListener("mouseleave",function(){var t=this;a=setTimeout(function(){var e=t.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),n.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(a),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){a=setTimeout(function(){e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),n.addEventListener("touchend",function(){var o=this;a=setTimeout(function(){var e=o.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(a),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(a=setTimeout(function(){var e=n.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}); \ No newline at end of file diff --git a/js/apbct-public-bundle.min.js.map b/js/apbct-public-bundle.min.js.map deleted file mode 100644 index 3aac13b65..000000000 --- a/js/apbct-public-bundle.min.js.map +++ /dev/null @@ -1,5 +0,0 @@ -<<<<<<< HEAD -{"version":3,"file":"apbct-public-bundle.min.js","sources":["apbct-public-bundle.js"],"sourcesContent":["/**\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= 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(ct_js_errors, 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 * 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 console.log('%cXHR%c started', 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;');\n\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 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 * @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\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 super(args[0]);\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 args.url = ApbctRest.default_route + args.route;\n args.headers = {\n 'X-WP-Nonce': ctPublicFunctions._rest_nonce,\n };\n super(args);\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_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], encodeURIComponent(item[1]));\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 ctPublic.force_alt_cookies = smartFormsSign ||\n ninjaFormsSign ||\n jetpackCommentsForm ||\n elementorUltimateAddonsRegister ||\n cwginstockForm ||\n userRegistrationProForm ||\n etPbDiviSubscriptionForm ||\n fluentBookingApp;\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 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 },\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\n if (typeof (data) === 'string') {\n if ( ! _params['no_nonce'] ) {\n _params['data'] = _params['data'] + '&_ajax_nonce=' + ctPublicFunctions._ajax_nonce;\n }\n _params['data'] = _params['data'] + '&no_cache=' + Math.random();\n } else {\n if ( ! _params['no_nonce'] ) {\n _params['data']._ajax_nonce = ctPublicFunctions._ajax_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 {\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 ctMouseReadInterval;\nlet ctMouseWriteDataInterval;\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// run cron jobs\ncronFormsHandler(2000);\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 * 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 );\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 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 {string} pixelUrl\n */\nfunction ctSetPixelImg(pixelUrl) {\n ctSetCookie('apbct_pixel_url', pixelUrl);\n if ( +ctPublic.pixel__enabled ) {\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 */\nfunction ctSetPixelImgFromLocalstorage(pixelUrl) {\n if ( +ctPublic.pixel__enabled ) {\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 */\nfunction ctGetPixelUrl() {\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 },\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\n/**\n * ctPreloadLocalStorage\n */\nfunction ctPreloadLocalStorage() {\n if (ctPublic.data__to_local_storage) {\n let data = Object.entries(ctPublic.data__to_local_storage);\n data.forEach(([key, value]) => {\n apbctLocalStorage.set(key, value);\n });\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 }\n}\n\n/**\n * Ready function\n */\n// eslint-disable-next-line camelcase,require-jsdoc\nfunction apbct_ready() {\n // this way calls a lot of apbct_ready(), needs to find another way\n // if (typeof jQuery !== 'undefined') {\n // jQuery(document).on('gform_page_loaded', function() {\n // apbct_ready();\n // });\n // }\n\n apbctPrepareBlockForAjaxForms();\n\n ctPreloadLocalStorage();\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 ( +ctPublic.pixel__setting ) {\n if ( +ctPublic.pixel__enabled ) {\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 (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 if (typeof ctPublic.force_alt_cookies !== 'undefined' &&\n ctPublic.force_alt_cookies &&\n apbctLocalStorage.get('bot_detector_event_token') &&\n // do bot set if (ct_bot_detector_event_token) already set,\n // and it is equal to newly added from moderate (bot_detector_event_token)\n apbctLocalStorage.get('ct_bot_detector_event_token') !== apbctLocalStorage.get('bot_detector_event_token')\n ) {\n initCookies.push(['ct_bot_detector_event_token', apbctLocalStorage.get('bot_detector_event_token')]);\n }\n\n if (!ctPublic.force_alt_cookies && ctPublic.data__cookies_type == 'alternative') {\n ctPublic.force_alt_cookies = apbctLocalStorage.get('bot_detector_event_token');\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 }\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 const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(this);\n apbct_visible_fields_set_cookie( visibleFields, 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 if (\n encodedEmailNodes[i].parentElement.href ||\n encodedEmailNodes[i].parentElement.parentElement.href\n ) {\n // Skip listening click on hyperlinks\n continue;\n }\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 _form.apbctSearchPrevOnsubmit = _form.onsubmit;\n // this handles search forms onsubmit process\n _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form);\n }\n }\n\n // Check any XMLHttpRequest connections\n apbctCatchXmlHttpRequest();\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.querySelectorAll('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 * 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 let eventToken = false;\n if ( typeof jQuery !== 'undefined' ) {\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 {*} _form\n */\nfunction ctSearchFormOnSubmitHandler(e, _form) {\n try {\n // set NoCookie data if is provided\n const noCookieField = _form.querySelector('[name=\"ct_no_cookie_hidden_field\"]');\n // set honeypot data if is provided\n const honeyPotField = _form.querySelector('[id*=\"apbct__email_id__\"]');\n const botDetectorField = _form.querySelector('[name*=\"ct_bot_detector_event_token\"]');\n let hpValue = null;\n let hpEventId = null;\n\n // get honeypot field and it's value\n if (\n honeyPotField !== null &&\n honeyPotField.value !== null &&\n honeyPotField.getAttribute('apbct_event_id') !== null\n ) {\n hpValue = honeyPotField.value;\n hpEventId = honeyPotField.getAttribute('apbct_event_id');\n }\n\n if (ctPublic.data__cookies_type === 'alternative' || ctPublic.data__cookies_type === 'native') {\n if (botDetectorField !== null) {\n botDetectorField.parentNode.removeChild(botDetectorField);\n }\n }\n\n // if noCookie data or honeypot data is set, proceed handling\n if ( noCookieField !== null || honeyPotField !== null) {\n e.preventDefault();\n const callBack = () => {\n if (honeyPotField !== null) {\n honeyPotField.parentNode.removeChild(honeyPotField);\n }\n // ct_bot_detector_event_token\n if (botDetectorField !== null) {\n botDetectorField.parentNode.removeChild(botDetectorField);\n }\n if (_form.apbctSearchPrevOnsubmit instanceof Function) {\n _form.apbctSearchPrevOnsubmit();\n } else {\n const _noCookieField = _form.querySelector('[name=\"ct_no_cookie_hidden_field\"]');\n if ( _noCookieField !== null ) {\n _noCookieField.parentNode.removeChild(_noCookieField);\n }\n HTMLFormElement.prototype.submit.call(_form);\n }\n };\n\n let parsedCookies = '{}';\n\n // if noCookie data provided trim prefix and add data from base64 decoded value then\n if (noCookieField !== null) {\n parsedCookies = atob(noCookieField.value.replace('_ct_no_cookie_data_', ''));\n }\n\n const cookiesArray = JSON.parse(parsedCookies);\n\n // if honeypot data provided add the fields to the parsed data\n if ( hpValue !== null && hpEventId !== null ) {\n cookiesArray.apbct_search_form__honeypot_value = hpValue;\n cookiesArray.apbct_search_form__honeypot_id = hpEventId;\n }\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 parsedCookies = JSON.stringify(cookiesArray);\n\n // if any data provided, proceed data to xhr\n if ( 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} event\n */\nfunction ctFillDecodedEmailHandler(event) {\n this.removeEventListener('click', ctFillDecodedEmailHandler);\n // remember clickSource\n let clickSource = this;\n // globally remember if emails is mixed with mailto\n ctPublic.encodedEmailNodesIsMixed = false;\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 let waitingPopup = document.createElement('div');\n waitingPopup.setAttribute('class', 'apbct-popup');\n waitingPopup.setAttribute('id', 'apbct_popup');\n let popupText = document.createElement('p');\n popupText.setAttribute('id', 'apbct_popup_text');\n popupText.style.color = 'black';\n popupText.innerText = 'Please wait while ' + ctPublic.wl_brandname + ' is decoding the email addresses.';\n waitingPopup.append(popupText);\n document.body.append(waitingPopup);\n } else {\n encoderPopup.setAttribute('style', 'display: inherit');\n document.getElementById('apbct_popup_text').innerHTML =\n 'Please wait while ' + ctPublic.wl_brandname + ' is decoding the email addresses.';\n }\n\n apbctAjaxEmailDecodeBulk(event, ctPublic.encodedEmailNodes, clickSource);\n}\n\n/**\n * @param {mixed} event\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, 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 (typeof encodedEmailNodes[i].href !== 'undefined' && encodedEmailNodes[i].href.indexOf('mailto:') === 0) {\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 // 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}\n\n/**\n * @param {mixed} result\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource) {\n if (result.success && result.data[0].is_allowed === true) {\n // start process of visual decoding\n setTimeout(function() {\n for (let i = 0; i < encodedEmailNodes.length; i++) {\n // chek what is what\n let currentResultData;\n result.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 break;\n }\n // handler for mailto\n if (\n typeof encodedEmailNodes[i].href !== 'undefined' &&\n encodedEmailNodes[i].href.indexOf('mailto:') === 0) {\n let encodedEmail = encodedEmailNodes[i].href.replace('mailto:', '');\n let baseElementContent = encodedEmailNodes[i].innerHTML;\n encodedEmailNodes[i].innerHTML =\n baseElementContent.replace(encodedEmail, currentResultData.decoded_email);\n encodedEmailNodes[i].href = 'mailto:' + currentResultData.decoded_email;\n } else {\n // fill the nodes\n ctProcessDecodedDataResult(currentResultData, encodedEmailNodes[i]);\n }\n // remove listeners\n encodedEmailNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n // popup remove\n let popup = document.getElementById('apbct_popup');\n if (popup !== null) {\n document.body.classList.remove('apbct-popup-fade');\n popup.setAttribute('style', 'display:none');\n // click on mailto if so\n if (ctPublic.encodedEmailNodesIsMixed) {\n clickSource.click();\n }\n }\n }, 3000);\n } else {\n if (result.success) {\n resetEncodedNodes();\n ctShowDecodeComment('Blocked: ' + result.data[0].comment);\n } else {\n resetEncodedNodes();\n ctShowDecodeComment('Cannot connect with CleanTalk server: ' + result.data[0].comment);\n }\n }\n}\n\n/**\n * resetEncodedNodes\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 * @param {mixed} commonCookies\n * @return {string}\n */\nfunction getJavascriptClientData(commonCookies = []) {\n let resultDataJson = {};\n\n resultDataJson.apbct_headless = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless');\n resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails');\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\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\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_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 (\n typeof (commonCookies) === 'object' &&\n commonCookies !== []\n ) {\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 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/**\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 apbct(target).html(\n apbct(target)\n .html()\n .replace(/.+?(
)/, email + '$1'),\n );\n}\n\n/**\n * @param {string} comment\n */\nfunction ctShowDecodeComment(comment) {\n if ( ! comment ) {\n comment = 'Can not decode email. Unknown reason';\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 popupText.innerText = 'CleanTalk email decoder: ' + comment;\n setTimeout(function() {\n popup.setAttribute('style', 'display:none');\n }, 3000);\n }\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 if (ctPublic.data__cookies_type === 'none') {\n ctSetCookie('apbct_visible_fields', JSON.stringify( collection[0] ) );\n } else {\n ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) );\n }\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 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 noCookieData = {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo};\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 * @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 // Ajax Search Lite\n if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) {\n return true;\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 // 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\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 // add new set\n document.forms[i].append(ctNoCookieConstructHiddenField());\n } else if (typeof ctPublic !== 'undefined' &&\n ctPublic.settings__forms__search_test === '1' &&\n (\n document.forms[i].getAttribute('id') === 'searchform' ||\n (\n document.forms[i].getAttribute('class') !== null &&\n document.forms[i].getAttribute('class').indexOf('search-form') !== -1) ||\n (\n document.forms[i].getAttribute('role') !== null &&\n document.forms[i].getAttribute('role').indexOf('search') !== -1\n )\n )\n ) {\n document.forms[i].append(ctNoCookieConstructHiddenField('submit'));\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/* Cleantalk Modal object */\nlet cleantalkModal = {\n\n // Flags\n loaded: false,\n loading: false,\n opened: false,\n opening: 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)) {\n content.innerHTML = this.loaded;\n } else {\n content.innerHTML = this.loaded.replace(urlRegex, '$1');\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\n/**\n * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' && (currentForm.action.indexOf('webto.salesforce.com') !== -1))\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in
\n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n if ( mailerliteDetectedClass ) {\n const mailerliteSubmitButton = documentObject.querySelector('form.' + mailerliteDetectedClass)\n .querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n } else {\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n }\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.onload = function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n};\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n\n if (\n formAction.indexOf('activehosted.com') !== -1 || // ActiveCampaign form\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n formObj.hasAttribute('data-hs-cf-bound') // Hubspot integration in Elementor form\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal.id.indexOf('mautic') !== -1) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Process dynamic rendered form\n * @param {HTMLElements} forms\n * @param {HTMLElement} documentObject\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n if (form.id.indexOf('hsForm') !== -1) {\n neededFormIds.push(form.id);\n }\n if (form.id.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(form.id);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\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":["ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","event","constructor","this","select","HTMLCollection","Array","prototype","slice","call","document","querySelectorAll","deselect","addElement","elemToAdd","push","elem","reduce","css","style","getRaw","styleName","Object","hasOwn","DomStyleName","replace","group","toUpperCase","let","i","length","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","classList","add","className","removeClass","remove","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","addEventListener","onChecker","bind","target","querySelector","stopPropagation","ready","callback","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","data","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","createElement","Boolean","HTMLElement","HTMLUnknownElement","indexOf","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","append","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","setTimeout","fadeOut","ctProcessError","msg","url","log","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","JSON","stringify","errorObj","error","location","href","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","ct_js_errors","apbct","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","method","async","user","password","button","spinner","progressbar","context","onErrorCallback","responseType","headers","timeout","methods_to_convert_data_to_URL","body","http_code","status_text","parameters","key","console","prepare","keys","deleteDoubleJSONEncoding","convertData","open","setHeaders","onreadystatechange","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","setAttribute","cursor","complete","status","statusText","removeAttribute","on_ready_state_change","on_progress","response","httpCode","additionalMsg","errorString","errorOutput","errorMsg","headerName","setRequestHeader","convertDataToURL","convertDataToBody","paramsAppendix","URLSearchParams","toString","paramsPrefix","dataKey","FormData","object","objectKey","parsedValue","super","default_route","ctPublicFunctions","_rest_url","route","X-WP-Nonce","_rest_nonce","ctSetCookie","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","forEach","item","apbctLocalStorage","set","encodeURIComponent","ctSetAlternativeCookie","ctPublic","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bookingPress","isArray","getJavascriptClientData","e","apbct_force_alt_cookies","data__ajax_type","apbct_pixel_url","decodeURIComponent","apbct_public_sendREST","apbct_public_sendAJAX","action","notJson","ctGetCookie","matches","RegExp","undefined","ctDeleteCookie","cookieName","obj","_params","callback_context","callback_params","silent","no_nonce","_ajax_url","_ajax_nonce","no_cache","apbctGenerateUniqueID","substr","get","property","storageValue","json","hasOwnProperty","isJson","objToSave","timestamp","getTime","isAlive","maxLifetime","isSet","delete","removeItem","getCleanTalkData","apbctSessionStorage","sessionStorage","apbctOnAnimationStart","animationName","apbctAutocomplete","apbctCancelAutocomplete","apbctOnInput","inputType","element","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","CTTypoData","fieldData","isAutoFill","isUseBuffer","speedDelta","firstKeyTimestamp","lastKeyTimestamp","lastDelta","countOfKey","fields","gatheringFields","field","assign","setListeners","currentDelta","abs","ctDate","ctTimeMs","ctMouseEventTimerFlag","ctMouseData","ctMouseDataCounter","ctCheckedEmails","ctMouseReadInterval","ctMouseWriteDataInterval","apbct_attach_event_handler","attachEvent","apbct_remove_event_handler","removeEventListener","detachEvent","ctFunctionFirstKey","ctKeyStopStopListening","ctFunctionMouseMove","cronFormsHandler","data__key_is_ok","setInterval","ctSetMouseMoved","round","clientY","clientX","ctMouseStopData","cronStartTimeout","restartFieldsListening","restartBotDetectorEventTokenAttach","token","doAttach","getElementsByClassName","setEventTokenField","clearInterval","checkEmail","currentEmail","email","result","now","ctSetPixelImg","pixelUrl","insertedImg","pixel__enabled","getElementById","ctSetPixelImgFromLocalstorage","ctGetPixelUrl","localStoragePixelUrl","String","ctSetHasScrolled","ctStartFieldsListening","forms","ctGetPageForms","handled_fields","handledFormFields","type","ctFunctionHasInputFocused","ctFunctionHasKeyUp","ctStopFieldsListening","eventName","functionName","ctSetHasInputFocused","ctSetHasKeyUp","ctPreloadLocalStorage","data__to_local_storage","entries","apbctPrepareBlockForAjaxForms","ctPrepareBlockMessage","responseText","ctParseBlockMessage","jQuery","ajaxComplete","settings","apbct_ready","sessionID","referrer","URL","host","apbctWriteReferrersToSessionStorage","cookiesType","initCookies","ctTypoData","getTimezoneOffset","apbctGetScreenInfo","webdriver","cookiesArray","split","trim","pixel__setting","pixel__url","data__email_check_before_post","ctAjaxSetupAddCleanTalkDataBeforeSendAjax","hiddenInput","visibleFieldsToInput","form","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","encodedEmailNodes","ctFillDecodedEmailHandler","_form","settings__forms__search_test","apbctSearchPrevOnsubmit","ctSearchFormOnSubmitHandler","apbctCatchXmlHttpRequest","originalSend","addidionalCleantalkData","eventToken","apply","ajaxSetup","beforeSend","sourceSign","contains","noCookieField","honeyPotField","botDetectorField","hpValue","hpEventId","parentNode","preventDefault","callBack","_noCookieField","HTMLFormElement","submit","parsedCookies","atob","apbct_search_form__honeypot_value","apbct_search_form__honeypot_id","warn","encodedEmailNodesIsMixed","popupText","encoderPopup","innerHTML","wl_brandname","waitingPopup","color","innerText","apbctAjaxEmailDecodeBulk","clickSource","event_javascript_data","post_url","encodedEmails","encodedEmailsCollection","apbctTooltip","dataset","originalString","emailEncoderPassKey","apbctEmailEncoderCallbackBulk","res","resetEncodedNodes","ctShowDecodeComment","success","is_allowed","currentResultData","row","encoded_email","encodedEmail","baseElementContent","decoded_email","ctProcessDecodedDataResult","popup","click","comment","commonCookies","resultDataJson","apbct_headless","ct_checked_emails","ct_checkjs","ct_fkp_timestamp","ct_pointer_data","ct_ps_timestamp","ct_screen_info","ct_timezone","ctMouseMovedLocalStorage","ctHasScrolledLocalStorage","ctCookiesTypeLocalStorage","apbctPageHits","apbctPrevReferer","apbctSiteReferer","ctJsErrorsLocalStorage","ctPixelUrl","ctMouseMovedCookie","ctHasScrolledCookie","ctCookiesTypeCookie","ctCookiesPixelUrl","ct_mouse_moved","ct_has_scrolled","ct_cookies_type","apbct_page_hits","apbct_prev_referer","apbct_site_referer","apbct_ct_js_errors","removeDoubleJsonEncoding","targetElement","ctFillDecodedEmail","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","offsetHeight","clientHeight","visibleWidth","clientWidth","visibleHeight","blocked","cleantalkModal","loaded","stop_script","stop","ctSetPixelUrlLocalstorage","ajaxPixelUrl","ctNoCookieConstructHiddenField","noCookieDataLocal","noCookieDataSession","noCookieDataTypo","typo","ctGetHiddenFieldExclusionsType","no_cookie","ncFieldExclusionsSign","data__visible_fields_required","id","hiddenFieldType","j","outerHTML","readyState","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","includes","formClasses","classExists","classForm","sessionCurrentPage","loading","opened","opening","load","apbct_admin_sendAJAX","renderCss","cssStr","styles","overlayCss","z-index","position","top","left","width","height","background","justify-content","align-items","innerCss","padding","border","border-radius","box-shadow","closeCss","right","box-sizing","closeCssBefore","transform","closeCssAfter","bodyCss","overflow","cleantalkModalStyle","overlay","inner","close","urlRegex","test","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","appendChild","apbctProcessIframes","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","apbctPrev","apbctFormOriginal","mailerliteDetectedClass","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","elemSource","elemTarget","checked","apbctVal","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","cover","onclick","currentDiv","preloader","botDetectorToken","ct_no_cookie_hidden_field","ct_bot_detector_event_token","el","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formAction","firstChild","elems","submitButton","formNew","mauticIntegration","submButton","catchDynamicRenderedFormHandler","neededFormIds","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","clearTimeout","options","multiple","option","selected","map","ctCheckInternal","currForm","ctData","alert","origSubmit","ctCheckInternalIsExcludedForm","some","blog_home","ctCurrAction","ctCurrForm","settings__forms__check_internal","formClone","cloneNode","replaceChild"],"mappings":"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"} -======= -{"version":3,"file":"apbct-public-bundle.min.js","sources":["apbct-public-bundle.js"],"sourcesContent":["/**\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= 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(ct_js_errors, 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 * 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 console.log('%cXHR%c started', 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;');\n\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 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 * @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\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 super(args[0]);\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 args.url = ApbctRest.default_route + args.route;\n args.headers = {\n 'X-WP-Nonce': ctPublicFunctions._rest_nonce,\n };\n super(args);\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_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], encodeURIComponent(item[1]));\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 ctPublic.force_alt_cookies = smartFormsSign ||\n ninjaFormsSign ||\n jetpackCommentsForm ||\n elementorUltimateAddonsRegister ||\n cwginstockForm ||\n userRegistrationProForm ||\n etPbDiviSubscriptionForm ||\n fluentBookingApp;\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 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 },\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\n if (typeof (data) === 'string') {\n if ( ! _params['no_nonce'] ) {\n _params['data'] = _params['data'] + '&_ajax_nonce=' + ctPublicFunctions._ajax_nonce;\n }\n _params['data'] = _params['data'] + '&no_cache=' + Math.random();\n } else {\n if ( ! _params['no_nonce'] ) {\n _params['data']._ajax_nonce = ctPublicFunctions._ajax_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 {\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 ctMouseReadInterval;\nlet ctMouseWriteDataInterval;\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// run cron jobs\ncronFormsHandler(2000);\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 * 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 );\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 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 {string} pixelUrl\n */\nfunction ctSetPixelImg(pixelUrl) {\n ctSetCookie('apbct_pixel_url', pixelUrl);\n if ( +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 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 */\nfunction ctSetPixelImgFromLocalstorage(pixelUrl) {\n if ( +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 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 */\nfunction ctGetPixelUrl() {\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 console.log(2);\n // if so - load pixel from localstorage and draw it skipping AJAX\n ctSetPixelImgFromLocalstorage(localStoragePixelUrl);\n return;\n }\n }\n console.log(3);\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 },\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\n/**\n * ctPreloadLocalStorage\n */\nfunction ctPreloadLocalStorage() {\n if (ctPublic.data__to_local_storage) {\n let data = Object.entries(ctPublic.data__to_local_storage);\n data.forEach(([key, value]) => {\n apbctLocalStorage.set(key, value);\n });\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 }\n}\n\n/**\n * Ready function\n */\n// eslint-disable-next-line camelcase,require-jsdoc\nfunction apbct_ready() {\n // this way calls a lot of apbct_ready(), needs to find another way\n // if (typeof jQuery !== 'undefined') {\n // jQuery(document).on('gform_page_loaded', function() {\n // apbct_ready();\n // });\n // }\n\n apbctPrepareBlockForAjaxForms();\n\n ctPreloadLocalStorage();\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 ( +ctPublic.pixel__setting ) {\n if ( +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 console.log(1);\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 (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 if (typeof ctPublic.force_alt_cookies !== 'undefined' &&\n ctPublic.force_alt_cookies &&\n apbctLocalStorage.get('bot_detector_event_token') &&\n // do bot set if (ct_bot_detector_event_token) already set,\n // and it is equal to newly added from moderate (bot_detector_event_token)\n apbctLocalStorage.get('ct_bot_detector_event_token') !== apbctLocalStorage.get('bot_detector_event_token')\n ) {\n initCookies.push(['ct_bot_detector_event_token', apbctLocalStorage.get('bot_detector_event_token')]);\n }\n\n if (!ctPublic.force_alt_cookies && ctPublic.data__cookies_type == 'alternative') {\n ctPublic.force_alt_cookies = apbctLocalStorage.get('bot_detector_event_token');\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 }\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 const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(this);\n apbct_visible_fields_set_cookie( visibleFields, 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 if (\n encodedEmailNodes[i].parentElement.href ||\n encodedEmailNodes[i].parentElement.parentElement.href\n ) {\n // Skip listening click on hyperlinks\n continue;\n }\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 _form.apbctSearchPrevOnsubmit = _form.onsubmit;\n // this handles search forms onsubmit process\n _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form);\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 let eventToken = false;\n if ( typeof jQuery !== 'undefined' ) {\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 {*} _form\n */\nfunction ctSearchFormOnSubmitHandler(e, _form) {\n try {\n // set NoCookie data if is provided\n const noCookieField = _form.querySelector('[name=\"ct_no_cookie_hidden_field\"]');\n // set honeypot data if is provided\n const honeyPotField = _form.querySelector('[id*=\"apbct__email_id__\"]');\n const botDetectorField = _form.querySelector('[name*=\"ct_bot_detector_event_token\"]');\n let hpValue = null;\n let hpEventId = null;\n\n // get honeypot field and it's value\n if (\n honeyPotField !== null &&\n honeyPotField.value !== null &&\n honeyPotField.getAttribute('apbct_event_id') !== null\n ) {\n hpValue = honeyPotField.value;\n hpEventId = honeyPotField.getAttribute('apbct_event_id');\n }\n\n if (ctPublic.data__cookies_type === 'alternative' || ctPublic.data__cookies_type === 'native') {\n if (botDetectorField !== null) {\n botDetectorField.parentNode.removeChild(botDetectorField);\n }\n }\n\n // if noCookie data or honeypot data is set, proceed handling\n if ( noCookieField !== null || honeyPotField !== null) {\n e.preventDefault();\n const callBack = () => {\n if (honeyPotField !== null) {\n honeyPotField.parentNode.removeChild(honeyPotField);\n }\n // ct_bot_detector_event_token\n if (botDetectorField !== null) {\n botDetectorField.parentNode.removeChild(botDetectorField);\n }\n if (_form.apbctSearchPrevOnsubmit instanceof Function) {\n _form.apbctSearchPrevOnsubmit();\n } else {\n const _noCookieField = _form.querySelector('[name=\"ct_no_cookie_hidden_field\"]');\n if ( _noCookieField !== null ) {\n _noCookieField.parentNode.removeChild(_noCookieField);\n }\n HTMLFormElement.prototype.submit.call(_form);\n }\n };\n\n let parsedCookies = '{}';\n\n // if noCookie data provided trim prefix and add data from base64 decoded value then\n if (noCookieField !== null) {\n parsedCookies = atob(noCookieField.value.replace('_ct_no_cookie_data_', ''));\n }\n\n const cookiesArray = JSON.parse(parsedCookies);\n\n // if honeypot data provided add the fields to the parsed data\n if ( hpValue !== null && hpEventId !== null ) {\n cookiesArray.apbct_search_form__honeypot_value = hpValue;\n cookiesArray.apbct_search_form__honeypot_id = hpEventId;\n }\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 parsedCookies = JSON.stringify(cookiesArray);\n\n // if any data provided, proceed data to xhr\n if ( 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} event\n */\nfunction ctFillDecodedEmailHandler(event) {\n this.removeEventListener('click', ctFillDecodedEmailHandler);\n // remember clickSource\n let clickSource = this;\n // globally remember if emails is mixed with mailto\n ctPublic.encodedEmailNodesIsMixed = false;\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 let waitingPopup = document.createElement('div');\n waitingPopup.setAttribute('class', 'apbct-popup');\n waitingPopup.setAttribute('id', 'apbct_popup');\n let popupText = document.createElement('p');\n popupText.setAttribute('id', 'apbct_popup_text');\n popupText.style.color = 'black';\n popupText.innerText = 'Please wait while ' + ctPublic.wl_brandname + ' is decoding the email addresses.';\n waitingPopup.append(popupText);\n document.body.append(waitingPopup);\n } else {\n encoderPopup.setAttribute('style', 'display: inherit');\n document.getElementById('apbct_popup_text').innerHTML =\n 'Please wait while ' + ctPublic.wl_brandname + ' is decoding the email addresses.';\n }\n\n apbctAjaxEmailDecodeBulk(event, ctPublic.encodedEmailNodes, clickSource);\n}\n\n/**\n * @param {mixed} event\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, 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 (typeof encodedEmailNodes[i].href !== 'undefined' && encodedEmailNodes[i].href.indexOf('mailto:') === 0) {\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 // 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}\n\n/**\n * @param {mixed} result\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource) {\n if (result.success && result.data[0].is_allowed === true) {\n // start process of visual decoding\n setTimeout(function() {\n for (let i = 0; i < encodedEmailNodes.length; i++) {\n // chek what is what\n let currentResultData;\n result.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 break;\n }\n // handler for mailto\n if (\n typeof encodedEmailNodes[i].href !== 'undefined' &&\n encodedEmailNodes[i].href.indexOf('mailto:') === 0) {\n let encodedEmail = encodedEmailNodes[i].href.replace('mailto:', '');\n let baseElementContent = encodedEmailNodes[i].innerHTML;\n encodedEmailNodes[i].innerHTML =\n baseElementContent.replace(encodedEmail, currentResultData.decoded_email);\n encodedEmailNodes[i].href = 'mailto:' + currentResultData.decoded_email;\n } else {\n // fill the nodes\n ctProcessDecodedDataResult(currentResultData, encodedEmailNodes[i]);\n }\n // remove listeners\n encodedEmailNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n // popup remove\n let popup = document.getElementById('apbct_popup');\n if (popup !== null) {\n document.body.classList.remove('apbct-popup-fade');\n popup.setAttribute('style', 'display:none');\n // click on mailto if so\n if (ctPublic.encodedEmailNodesIsMixed) {\n clickSource.click();\n }\n }\n }, 3000);\n } else {\n if (result.success) {\n resetEncodedNodes();\n ctShowDecodeComment('Blocked: ' + result.data[0].comment);\n } else {\n resetEncodedNodes();\n ctShowDecodeComment('Cannot connect with CleanTalk server: ' + result.data[0].comment);\n }\n }\n}\n\n/**\n * resetEncodedNodes\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 * @param {mixed} commonCookies\n * @return {string}\n */\nfunction getJavascriptClientData(commonCookies = []) {\n let resultDataJson = {};\n\n resultDataJson.apbct_headless = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless');\n resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails');\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\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\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_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 (\n typeof (commonCookies) === 'object' &&\n commonCookies !== []\n ) {\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 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/**\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 apbct(target).html(\n apbct(target)\n .html()\n .replace(/.+?(
)/, email + '$1'),\n );\n}\n\n/**\n * @param {string} comment\n */\nfunction ctShowDecodeComment(comment) {\n if ( ! comment ) {\n comment = 'Can not decode email. Unknown reason';\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 popupText.innerText = 'CleanTalk email decoder: ' + comment;\n setTimeout(function() {\n popup.setAttribute('style', 'display:none');\n }, 3000);\n }\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 if (ctPublic.data__cookies_type === 'none') {\n ctSetCookie('apbct_visible_fields', JSON.stringify( collection[0] ) );\n } else {\n ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) );\n }\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 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 noCookieData = {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo};\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 * @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 // Ajax Search Lite\n if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) {\n return true;\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 // 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\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 // add new set\n document.forms[i].append(ctNoCookieConstructHiddenField());\n } else if (typeof ctPublic !== 'undefined' &&\n ctPublic.settings__forms__search_test === '1' &&\n (\n document.forms[i].getAttribute('id') === 'searchform' ||\n (\n document.forms[i].getAttribute('class') !== null &&\n document.forms[i].getAttribute('class').indexOf('search-form') !== -1) ||\n (\n document.forms[i].getAttribute('role') !== null &&\n document.forms[i].getAttribute('role').indexOf('search') !== -1\n )\n )\n ) {\n document.forms[i].append(ctNoCookieConstructHiddenField('submit'));\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/* Cleantalk Modal object */\nlet cleantalkModal = {\n\n // Flags\n loaded: false,\n loading: false,\n opened: false,\n opening: 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)) {\n content.innerHTML = this.loaded;\n } else {\n content.innerHTML = this.loaded.replace(urlRegex, '$1');\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\n/**\n * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' && (currentForm.action.indexOf('webto.salesforce.com') !== -1))\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n if ( mailerliteDetectedClass ) {\n const mailerliteSubmitButton = documentObject.querySelector('form.' + mailerliteDetectedClass)\n .querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n } else {\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n }\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.onload = function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n};\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n\n if (\n formAction.indexOf('activehosted.com') !== -1 || // ActiveCampaign form\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n formObj.hasAttribute('data-hs-cf-bound') // Hubspot integration in Elementor form\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal.id.indexOf('mautic') !== -1) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Process dynamic rendered form\n * @param {HTMLElements} forms\n * @param {HTMLElement} documentObject\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n if (form.id.indexOf('hsForm') !== -1) {\n neededFormIds.push(form.id);\n }\n if (form.id.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(form.id);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\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":["ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","event","constructor","this","select","HTMLCollection","Array","prototype","slice","call","document","querySelectorAll","deselect","addElement","elemToAdd","push","elem","reduce","css","style","getRaw","styleName","Object","hasOwn","DomStyleName","replace","group","toUpperCase","let","i","length","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","classList","add","className","removeClass","remove","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","addEventListener","onChecker","bind","target","querySelector","stopPropagation","ready","callback","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","data","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","createElement","Boolean","HTMLElement","HTMLUnknownElement","indexOf","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","append","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","setTimeout","fadeOut","ctProcessError","msg","url","log","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","JSON","stringify","errorObj","error","location","href","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","ct_js_errors","apbct","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","method","async","user","password","button","spinner","progressbar","context","onErrorCallback","responseType","headers","timeout","methods_to_convert_data_to_URL","body","http_code","status_text","parameters","key","console","prepare","keys","deleteDoubleJSONEncoding","convertData","open","setHeaders","onreadystatechange","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","setAttribute","cursor","complete","status","statusText","removeAttribute","on_ready_state_change","on_progress","response","httpCode","additionalMsg","errorString","errorOutput","errorMsg","headerName","setRequestHeader","convertDataToURL","convertDataToBody","paramsAppendix","URLSearchParams","toString","paramsPrefix","dataKey","FormData","object","objectKey","parsedValue","super","default_route","ctPublicFunctions","_rest_url","route","X-WP-Nonce","_rest_nonce","ctSetCookie","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","forEach","item","apbctLocalStorage","set","encodeURIComponent","ctSetAlternativeCookie","ctPublic","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bookingPress","isArray","getJavascriptClientData","e","apbct_force_alt_cookies","data__ajax_type","apbct_pixel_url","decodeURIComponent","apbct_public_sendREST","apbct_public_sendAJAX","action","notJson","ctGetCookie","matches","RegExp","undefined","ctDeleteCookie","cookieName","obj","_params","callback_context","callback_params","silent","no_nonce","_ajax_url","_ajax_nonce","no_cache","apbctGenerateUniqueID","substr","get","property","storageValue","json","hasOwnProperty","isJson","objToSave","timestamp","getTime","isAlive","maxLifetime","isSet","delete","removeItem","getCleanTalkData","apbctSessionStorage","sessionStorage","apbctOnAnimationStart","animationName","apbctAutocomplete","apbctCancelAutocomplete","apbctOnInput","inputType","element","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","CTTypoData","fieldData","isAutoFill","isUseBuffer","speedDelta","firstKeyTimestamp","lastKeyTimestamp","lastDelta","countOfKey","fields","gatheringFields","field","assign","setListeners","currentDelta","abs","ctDate","ctTimeMs","ctMouseEventTimerFlag","ctMouseData","ctMouseDataCounter","ctCheckedEmails","ctMouseReadInterval","ctMouseWriteDataInterval","apbct_attach_event_handler","attachEvent","apbct_remove_event_handler","removeEventListener","detachEvent","ctFunctionFirstKey","ctKeyStopStopListening","ctFunctionMouseMove","cronFormsHandler","data__key_is_ok","setInterval","ctSetMouseMoved","round","clientY","clientX","ctMouseStopData","cronStartTimeout","restartFieldsListening","restartBotDetectorEventTokenAttach","token","doAttach","getElementsByClassName","setEventTokenField","clearInterval","checkEmail","currentEmail","email","result","now","ctSetPixelImg","pixelUrl","insertedImg","pixel__enabled","getElementById","ctSetPixelImgFromLocalstorage","ctGetPixelUrl","localStoragePixelUrl","String","ctSetHasScrolled","ctStartFieldsListening","forms","ctGetPageForms","handled_fields","handledFormFields","type","ctFunctionHasInputFocused","ctFunctionHasKeyUp","ctStopFieldsListening","eventName","functionName","ctSetHasInputFocused","ctSetHasKeyUp","ctPreloadLocalStorage","data__to_local_storage","entries","apbctPrepareBlockForAjaxForms","ctPrepareBlockMessage","responseText","ctParseBlockMessage","jQuery","ajaxComplete","settings","apbct_ready","sessionID","referrer","URL","host","apbctWriteReferrersToSessionStorage","cookiesType","initCookies","ctTypoData","getTimezoneOffset","apbctGetScreenInfo","webdriver","cookiesArray","split","trim","pixel__setting","pixel__url","data__email_check_before_post","ctAjaxSetupAddCleanTalkDataBeforeSendAjax","hiddenInput","visibleFieldsToInput","form","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","encodedEmailNodes","ctFillDecodedEmailHandler","_form","settings__forms__search_test","apbctSearchPrevOnsubmit","ctSearchFormOnSubmitHandler","eventToken","ajaxSetup","beforeSend","sourceSign","contains","noCookieField","honeyPotField","botDetectorField","hpValue","hpEventId","parentNode","preventDefault","callBack","_noCookieField","HTMLFormElement","submit","parsedCookies","atob","apbct_search_form__honeypot_value","apbct_search_form__honeypot_id","warn","encodedEmailNodesIsMixed","popupText","encoderPopup","innerHTML","wl_brandname","waitingPopup","color","innerText","apbctAjaxEmailDecodeBulk","clickSource","event_javascript_data","post_url","encodedEmails","encodedEmailsCollection","apbctTooltip","dataset","originalString","emailEncoderPassKey","apbctEmailEncoderCallbackBulk","res","resetEncodedNodes","ctShowDecodeComment","success","is_allowed","currentResultData","row","encoded_email","encodedEmail","baseElementContent","decoded_email","ctProcessDecodedDataResult","popup","click","comment","commonCookies","resultDataJson","apbct_headless","ct_checked_emails","ct_checkjs","ct_fkp_timestamp","ct_pointer_data","ct_ps_timestamp","ct_screen_info","ct_timezone","ctMouseMovedLocalStorage","ctHasScrolledLocalStorage","ctCookiesTypeLocalStorage","apbctPageHits","apbctPrevReferer","apbctSiteReferer","ctJsErrorsLocalStorage","ctPixelUrl","ctMouseMovedCookie","ctHasScrolledCookie","ctCookiesTypeCookie","ctCookiesPixelUrl","ct_mouse_moved","ct_has_scrolled","ct_cookies_type","apbct_page_hits","apbct_prev_referer","apbct_site_referer","apbct_ct_js_errors","removeDoubleJsonEncoding","targetElement","ctFillDecodedEmail","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","offsetHeight","clientHeight","visibleWidth","clientWidth","visibleHeight","blocked","cleantalkModal","loaded","stop_script","stop","ctSetPixelUrlLocalstorage","ajaxPixelUrl","ctNoCookieConstructHiddenField","noCookieDataLocal","noCookieDataSession","noCookieDataTypo","typo","ctGetHiddenFieldExclusionsType","no_cookie","ncFieldExclusionsSign","data__visible_fields_required","id","hiddenFieldType","j","outerHTML","readyState","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","includes","apply","formClasses","classExists","classForm","sessionCurrentPage","loading","opened","opening","load","apbct_admin_sendAJAX","renderCss","cssStr","styles","overlayCss","z-index","position","top","left","width","height","background","justify-content","align-items","innerCss","padding","border","border-radius","box-shadow","closeCss","right","box-sizing","closeCssBefore","transform","closeCssAfter","bodyCss","overflow","cleantalkModalStyle","overlay","inner","close","urlRegex","test","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","appendChild","apbctProcessIframes","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","apbctPrev","apbctFormOriginal","mailerliteDetectedClass","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","elemSource","elemTarget","checked","apbctVal","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","cover","onclick","currentDiv","preloader","botDetectorToken","ct_no_cookie_hidden_field","ct_bot_detector_event_token","el","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formAction","firstChild","elems","submitButton","formNew","mauticIntegration","submButton","catchDynamicRenderedFormHandler","neededFormIds","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","clearTimeout","options","multiple","option","selected","map","ctCheckInternal","currForm","ctData","alert","origSubmit","ctCheckInternalIsExcludedForm","some","blog_home","ctCurrAction","ctCurrForm","settings__forms__check_internal","formClone","cloneNode","replaceChild"],"mappings":"MAGMA,UACFC,gBAAkB,GAClBC,eAAiB,GAEjBC,SAAW,KACXC,SAAW,GAGXC,cACAC,cACAC,MAMAC,YAAYL,GACRM,KAAKC,OAAOP,CAAQ,CACxB,CAQAO,OAAOP,GAiBH,OAhBIA,aAAoBQ,gBACpBF,KAAKN,SAAW,KAChBM,KAAKL,SAAW,GAChBK,KAAKL,SAAWQ,MAAMC,UAAUC,MAAMC,KAAKZ,CAAQ,GACvB,UAApB,OAAOA,GACfM,KAAKN,SAAW,KAChBM,KAAKL,SAAW,GAChBK,KAAKL,SAAS,GAAKD,GACS,UAApB,OAAOA,GACfM,KAAKN,SAAWA,EAChBM,KAAKL,SAAWQ,MAAMC,UAAUC,MAAMC,KAAKC,SAASC,iBAAiBd,CAAQ,CAAC,GAG9EM,KAAKS,SAAS,EAGXT,IACX,CAKAU,WAAWC,GACmB,UAArB,OAAOA,EACRX,KAAKL,SAASiB,KAAKD,CAAS,EACC,UAArB,OAAOA,GACfX,KAAKN,SAAWiB,EAChBX,KAAKL,SAAWQ,MAAMC,UAAUC,MAAMC,KAAKC,SAASC,iBAAiBG,CAAS,CAAC,GAE/EX,KAAKS,SAAS,CAEtB,CAKAG,KAAKC,GACDb,KAAKL,SAASiB,KAAKC,CAAI,CAC3B,CAKAC,SACId,KAAKL,SAAWK,KAAKL,SAASU,MAAM,EAAG,CAAC,CAAC,CAC7C,CAKAI,WACIT,KAAKL,SAAW,EACpB,CAUAoB,IAAIC,EAAOC,GAIP,GAHAA,EAASA,GAAU,CAAA,EAGE,UAAjB,OAAOD,EAAoB,CAU3B,IAAK,MAAME,KAAaF,EACpB,GAAIG,OAAOC,OAAOJ,EAAOE,CAAS,EAAG,CACjC,IAAMG,EAAiCH,EAVvCI,QAAQ,eAAgB,GACxBC,EACKC,YAAY,EACZF,QAAQ,IAAK,EAAE,EACfA,QAAQ,IAAK,EAAE,CACxB,EAQI,IAAKG,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnC1B,KAAKL,SAAS+B,GAAGV,MAAMK,GAAgBL,EAAME,EAErD,CAGJ,OAAOlB,IACX,CAGA,GAAqB,UAAjB,OAAOgB,EAAoB,CAC3BS,IAAIG,EAAgBC,iBAAiB7B,KAAKL,SAAS,EAAE,EAAEqB,GAGvD,OAA8B,KAAA,IAAlBY,GAAmCX,EASxCW,GAPHA,EAAgBA,EAAcN,QAAQ,yBAA0B,IAAI,EAEpEM,EAAgBE,OAAOF,CAAa,GAAKA,EAAgBE,OAAOF,CAAa,EAAIA,EAMzF,CACJ,CAKAG,OACI/B,KAAKgC,KAAK,eAAgBhC,KAAKe,IAAI,SAAS,CAAC,EAC7Cf,KAAKe,IAAI,CAACkB,QAAW,MAAM,CAAC,CAChC,CAKAC,OACIlC,KAAKe,IAAI,CAACkB,QAAWjC,KAAKgC,KAAK,cAAc,CAAC,CAAC,CACnD,CAKAG,WACI,IAAKV,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnC1B,KAAKL,SAAS+B,GAAGU,UAAUC,IAAIC,SAAS,CAEhD,CAKAC,cACI,IAAKd,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnC1B,KAAKL,SAAS+B,GAAGU,UAAUI,OAAOF,SAAS,CAEnD,CAKAG,YAAYH,GACR,IAAKb,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnC1B,KAAKL,SAAS+B,GAAGU,UAAUM,OAAOJ,CAAS,CAEnD,CAQAK,KAAKC,GAED,OADA5C,KAAKR,gBAAkBoD,EAChB,IAAIC,UAAUD,CAAc,CACvC,CAQAE,KAAKrD,GAED,OADAO,KAAKP,eAAiBA,EACf,IAAIsD,UAAUtD,CAAc,CACvC,CAgBAuD,MAAMC,GACFjD,KAAKF,MAAQmD,EAAK,GAClBjD,KAAKJ,cAAgBqD,EAAK,IAAMA,EAAK,GACrCjD,KAAKH,cAAmC,UAAnB,OAAOoD,EAAK,GAAkBA,EAAK,GAAK,KAE7D,IAAKxB,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnC1B,KAAKL,SAAS+B,GAAGwB,iBACblD,KAAKF,MACkB,OAAvBE,KAAKH,cACDG,KAAKmD,UAAUC,KAAKpD,IAAI,EACxBA,KAAKJ,aACb,CAER,CAQAuD,UAAUrD,GACN,GAAIA,EAAMuD,SAAW9C,SAAS+C,cAActD,KAAKH,aAAa,EAE1D,OADAC,EAAMyD,gBAAgB,EACfvD,KAAKJ,cAAcE,CAAK,CAEvC,CAKA0D,MAAMC,GACFlD,SAAS2C,iBAAiB,mBAAoBO,CAAQ,CAC1D,CAKAC,OAAOD,GACHzD,KAAKgD,GAAG,SAAUS,CAAQ,CAC9B,CAYAE,KAAKC,GACDnC,IAAIoC,EAAc,GAElB,IAAKpC,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GAEO,KAAA,IAA/B1B,KAAKL,SAAS+B,GAAGkC,GACxBC,EAAYjD,KAAKZ,KAAKL,SAAS+B,GAAGkC,EAAS,EAE3CC,EAAYjD,KAAKZ,KAAKL,SAAS+B,GAAGoC,aAAaF,CAAQ,CAAC,EAKhE,OAA8B,IAAvBC,EAAYlC,OAAekC,EAAY,GAAKA,CACvD,CAOA7B,KAAK+B,EAAUC,GAEX,GAAqB,KAAA,IAAVA,EAAuB,CAC9B,IAAKvC,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnC1B,KAAKL,SAAS+B,GAAGqC,GAAYC,EAGjC,OAAOhE,IAGX,CACI,IAAM6D,EAAc,GAEpB,IAAKpC,IAAIC,EAAE,EAAGA,EAAE1B,KAAKL,SAASgC,OAAQD,CAAC,GACnCmC,EAAYjD,KAAKZ,KAAKL,SAAS+B,GAAGqC,EAAS,EAI/C,OAA8B,IAAvBF,EAAYlC,OAAekC,EAAY,GAAKA,CAE3D,CAQAI,KAAKD,GACD,OAAwB,KAAA,IAAVA,EACVhE,KAAKgC,KAAK,YAAagC,CAAK,EAC5BhE,KAAKgC,KAAK,WAAW,CAC7B,CAQAkC,IAAIF,GACA,OAAwB,KAAA,IAAVA,EACVhE,KAAKgC,KAAK,QAASgC,CAAK,EACxBhE,KAAKgC,KAAK,OAAO,CACzB,CAOAmC,KAAKC,EAAMJ,GACP,OAAwB,KAAA,IAAVA,EACVhE,KAAKgC,KAAK,aAAcoC,EAAMJ,CAAK,EACnChE,KAAKgC,KAAK,YAAY,CAC9B,CAgBAqC,GAAGC,GACC7C,IAAIoC,EAAc,CAAA,EAElB,IAAKpC,IAAIZ,KAAQb,KAAKL,SAClBkE,IAAgB7D,KAAKuE,OAAO1D,EAAMyD,CAAM,EAG5C,OAAOT,CACX,CAOAU,OAAOC,EAAaF,GAChB7C,IAAI4C,EAAK,CAAA,EA6BT,MAtBsB,YAAlB,OAAOC,IACPD,IAAOC,EAAOhE,KAAKN,KAAMwE,CAAW,GAIlB,UAAlB,OAAOF,IAEFA,EAAOG,MAAM,QAAQ,GAbJ,SAASL,GAC3BM,EAAsBnE,SAASoE,cAAcP,CAAI,EAAErE,YACvD,MAAO,CAAE6E,QAAS,CAAC,CAACC,YAAaC,oBAAoBC,QAAQL,CAAmB,CAAE,CACtF,EAUuDJ,CAAM,EACrDD,IAAOG,EAAYQ,QAAQC,YAAY,IAAMX,EAAOW,YAAY,EAGxDX,EAAOG,MAAM,QAAQ,EAC7BJ,IAAOO,QAAQJ,EAAYF,EAAO,EAIlCD,IAAyB,OAAlBrE,KAAKN,SAC2C,OAAnDa,SAAS+C,cAActD,KAAKN,SAAW4E,CAAM,EAC7CtE,KAAKkF,kBAAkBV,EAAaF,CAAM,GAI/CD,CACX,CAOAa,kBAAkBV,EAAaF,GAC3B,IAGSzD,EAFTY,IAAIoC,EAAc,CAAA,EAElB,IAAShD,KAHKN,SAASC,iBAAiB8D,CAAM,EAI1CT,IAAgBW,IAAgB3D,EAGpC,OAAOgD,CACX,CAMAS,OAAOA,GACHtE,KAAKN,SAAW,KAEhB,IAAM+B,IAAIC,EAAI1B,KAAKL,SAASgC,OAAS,EAAQ,GAALD,EAAQA,CAAC,GACtC1B,KAAKuE,OAAOvE,KAAKL,SAAS+B,GAAI4C,CAAM,GACvCtE,KAAKL,SAASwF,OAAOrD,OAAOJ,CAAC,EAAG,CAAC,EAIzC,OAAO1B,IACX,CAUAoF,OAAOd,GAOH,OANAtE,KAAKC,OAAOD,KAAKL,SAAS,GAAG0F,aAAa,EAEnB,KAAA,IAAXf,GAA4BtE,KAAKqE,GAAGC,CAAM,GAClDtE,KAAKS,SAAS,EAGXT,IACX,CAMAsF,QAAQhB,GAGJ,IAFAtE,KAAKC,OAAOD,KAAKL,SAAS,EAAE,EAEsC,OAA1DK,KAAKL,SAASK,KAAKL,SAASgC,OAAS,GAAG0D,eAC5CrF,KAAKY,KAAKZ,KAAKL,SAASK,KAAKL,SAASgC,OAAS,GAAG0D,aAAa,EASnE,OANArF,KAAKL,SAASwF,OAAO,EAAG,CAAC,EAEF,KAAA,IAAXb,GACRtE,KAAKsE,OAAOA,CAAM,EAGftE,IACX,CAMAuF,SAASjB,GAOL,OANAtE,KAAKC,OAAOD,KAAKL,SAAS,GAAG4F,QAAQ,EAEd,KAAA,IAAXjB,GACRtE,KAAKsE,OAAOA,CAAM,EAGftE,IACX,CAMAwF,SAASlB,GACL7C,IAAIgE,EAAUzF,KAAKL,SAAS,GAM5B,OAJAK,KAAKoF,OAAO,EACZpF,KAAKuF,SAASjB,CAAM,EACpBtE,KAAKL,SAASwF,OAAOnF,KAAKL,SAASoF,QAAQU,CAAO,EAAG,CAAC,EAE/CzF,IACX,CAGAwC,SACI,IAAKf,IAAIZ,KAAQb,KAAKL,SAClBkB,EAAK2B,OAAO,CAEpB,CAKAkD,MAAMC,GACF,IAAKlE,IAAIZ,KAAQb,KAAKL,SAClBkB,EAAK6E,MAAMC,CAAO,CAE1B,CAKAC,OAAOD,GACH,IAAKlE,IAAIZ,KAAQb,KAAKL,SAClBkB,EAAK+E,OAAOD,CAAO,CAE3B,CAMAE,OAAOC,GACH,IAAKrE,IAAIZ,KAAQb,KAAKL,SAAU,CAC5BkB,EAAKG,MAAM+E,QAAU,EACrBlF,EAAKG,MAAMiB,QAAU,QAErBR,IAAIuE,EAAO,CAAC,IAAIC,KAChB,MAAMC,EAAO,WACTrF,EAAKG,MAAM+E,QAAU,CAAClF,EAAKG,MAAM+E,SAAW,IAAIE,KAASD,GAAQF,EACjEE,EAAO,CAAC,IAAIC,KAER,CAACpF,EAAKG,MAAM+E,QAAU,IACrBI,OAAOC,uBAAyBA,sBAAsBF,CAAI,GAAMG,WAAWH,EAAM,EAAE,EAE5F,EAEAA,EAAK,CACT,CACJ,CAKAI,QAAQR,GACJ,IAAKrE,IAAIZ,KAAQb,KAAKL,SAAU,CAC5BkB,EAAKG,MAAM+E,QAAU,EAErBtE,IAAIuE,EAAO,CAAC,IAAIC,KAChB,MAAMC,EAAO,WACTrF,EAAKG,MAAM+E,QAAU,CAAClF,EAAKG,MAAM+E,SAAW,IAAIE,KAASD,GAAQF,EACjEE,EAAO,CAAC,IAAIC,KAEc,EAAtB,CAACpF,EAAKG,MAAM+E,QACXI,OAAOC,uBAAyBA,sBAAsBF,CAAI,GAAMG,WAAWH,EAAM,EAAE,EAEpFrF,EAAKG,MAAMiB,QAAU,MAE7B,EAEAiE,EAAK,CACT,CACJ,CACJ,CAyCA,SAASK,eAAeC,EAAKC,GACzBhF,IAAIiF,EAAM,GACNF,GAAOA,EAAIG,QACXD,EAAIE,IAAM,CACNJ,IAAOA,EAAIG,QACXE,KAAUL,EAAIM,UAA0B,CAAA,EACxCC,GAAQP,EAAIQ,YAAgCC,QAAkB,CAAA,EAC9DC,IAASV,EAAIW,cAAoCC,UAAsB,CAAA,EACvEC,WAAgBb,EAAIc,OAAoB,CAAA,EACxCC,MAAWd,CAAAA,CAAAA,GAAMe,KAAKC,UAAUhB,CAAG,EACnCiB,SAAcC,OAAgB,CAAA,CAClC,GAEAjB,EAAIE,IAAM,CACNJ,IAAOA,CACX,EAEMC,IACFC,EAAIE,IAAIC,KAAOJ,IAIvBC,EAAID,IAAMN,OAAOyB,SAASC,KAC1BnB,EAAIoB,UAAY3B,OAAO4B,UAAUD,UAGjCrG,IAAIuG,EAAWC,aAAaC,QADX,cAC6B,EAC7B,OAAbF,IAAmBA,EAAW,MAClCA,EAAWR,KAAKW,MAAMH,CAAQ,EAC9B,IAAKvG,IAAIC,EAAI,EAAGA,EAAIsG,EAASrG,OAAQD,CAAC,GAClC,GAAIsG,EAAStG,GAAGkF,IAAIJ,MAAQE,EAAIE,IAAIJ,IAChC,OAIRwB,EAASpH,KAAK8F,CAAG,EACjBuB,aAAaG,QAAQC,aAAcb,KAAKC,UAAUO,CAAQ,CAAC,CAC/D,CAuBA,SAASM,MAAMC,GACX,OAAO,IAAIhJ,WACNU,OAAOsI,CAAM,CACtB,CAxBwC,IAApCC,KAAKC,MAAsB,IAAhBD,KAAKE,OAAO,CAAO,IAC9BvC,OAAOwC,QAAU,SAASC,EAAWnC,GACjChF,IAAIoH,EAAc,CAAC,QAAS,YAC5BpH,IAAIE,EAASkH,EAAYlH,OACzB,KAAOA,CAAM,IACsC,CAAC,IAA5CiH,EAAU7D,QAAQ8D,EAAYlH,EAAO,GACrC4E,eAAeqC,EAAWnC,CAAG,EAIrC,MAAO,CAAA,CACX,SAkBEqC,SACFC,IAAM,IAAIC,eAGVC,OAAS,OACTxC,IAAM,GACNyC,MAAQ,CAAA,EACRC,KAAO,KACPC,SAAW,KACXjF,KAAO,GAGPkF,OAAS,KACTC,QAAU,KACVC,YAAc,KACdC,QAAUxJ,KACVyD,SAAW,KACXgG,gBAAkB,KAElBC,aAAe,OACfC,QAAU,GACVC,QAAU,KAEVC,+BAAiC,CAC7B,MACA,QAGJC,KAAO,KACPC,UAAY,EACZC,YAAc,GAGdjK,YAAYkK,GAIR,IAAMxI,IAAIyI,KAHVC,QAAQzD,IAAI,kBAAmB,iCAAkC,mCAAmC,EAGnFuD,EACa,KAAA,IAAdjK,KAAKkK,KACblK,KAAKkK,GAAOD,EAAWC,IAa/B,GARAlK,KAAKoK,QAAQ,EAGRjJ,OAAOkJ,KAAKrK,KAAKmE,IAAI,EAAExC,SACxB3B,KAAKsK,yBAAyBtK,KAAKmE,IAAI,EACvCnE,KAAKuK,YAAY,GAGhB,CAAEvK,KAAKyG,IAGR,OAFA0D,QAAQzD,IAAI,2BACR,iCAAkC,mCAAmC,EAClE,CAAA,EAIX1G,KAAK+I,IAAIyB,KAAKxK,KAAKiJ,OAAQjJ,KAAKyG,IAAKzG,KAAKkJ,MAAOlJ,KAAKmJ,KAAMnJ,KAAKoJ,QAAQ,EACzEpJ,KAAKyK,WAAW,EAEhBzK,KAAK+I,IAAIW,aAAe1J,KAAK0J,aAC7B1J,KAAK+I,IAAIa,QAAU5J,KAAK4J,QAIxB5J,KAAK+I,IAAI2B,mBAAqB,WAC1B1K,KAAK2K,mBAAmB,CAC5B,EAAEvH,KAAKpD,IAAI,EAGXA,KAAK+I,IAAI6B,OAAS,WACd5K,KAAK6K,OAAO,CAChB,EAAEzH,KAAKpD,IAAI,EAGXA,KAAK+I,IAAI+B,WAAa,SAAShL,GAC3BE,KAAK+K,WAAWjL,CAAK,CACzB,EAAEsD,KAAKpD,IAAI,EAGXA,KAAK+I,IAAIJ,QAAU,WACf3I,KAAKgL,QAAQ,CACjB,EAAE5H,KAAKpD,IAAI,EAEXA,KAAK+I,IAAIkC,UAAY,WACjBjL,KAAKkL,UAAU,CACnB,EAAE9H,KAAKpD,IAAI,EAGXA,KAAK+I,IAAIoC,KAAKnL,KAAK8J,IAAI,CAC3B,CAKAM,UAEQpK,KAAKqJ,SACLrJ,KAAKqJ,OAAO+B,aAAa,WAAY,UAAU,EAC/CpL,KAAKqJ,OAAOrI,MAAMqK,OAAS,eAI3BrL,KAAKsJ,UACLtJ,KAAKsJ,QAAQtI,MAAMiB,QAAU,SAErC,CAKAqJ,WACItL,KAAK+J,UAAY/J,KAAK+I,IAAIwC,OAC1BvL,KAAKgK,YAAchK,KAAK+I,IAAIyC,WAGxBxL,KAAKqJ,SACLrJ,KAAKqJ,OAAOoC,gBAAgB,UAAU,EACtCzL,KAAKqJ,OAAOrI,MAAMqK,OAAS,QAI3BrL,KAAKsJ,UACLtJ,KAAKsJ,QAAQtI,MAAMiB,QAAU,QAG5BjC,KAAKuJ,aACNvJ,KAAKuJ,YAAYjD,QAAQ,MAAM,CAEvC,CAKAqE,qBACuC,OAA/B3K,KAAK0L,uBAAwE,YAAtC,OAAO1L,KAAK0L,uBACnD1L,KAAK0L,sBAAsB,CAEnC,CAKAX,WAAWjL,GACkB,OAArBE,KAAK2L,aAAoD,YAA5B,OAAO3L,KAAK2L,aACzC3L,KAAK2L,YAAY,CAEzB,CAKAX,UACIb,QAAQzD,IAAI,OAAO,EAEnB1G,KAAKsL,SAAS,EACdtL,KAAK2H,MACD3H,KAAK+J,UACL/J,KAAKgK,WACT,EAE6B,OAAzBhK,KAAKyJ,iBAA4D,YAAhC,OAAOzJ,KAAKyJ,iBAC7CzJ,KAAKyJ,gBAAgBzJ,KAAKgK,WAAW,CAE7C,CAKAkB,YACIlL,KAAKsL,SAAS,EACdtL,KAAK2H,MACD,EACA,SACJ,EAE6B,OAAzB3H,KAAKyJ,iBAA4D,YAAhC,OAAOzJ,KAAKyJ,iBAC7CzJ,KAAKyJ,gBAAgB,SAAS,CAEtC,CAKAoB,SAGI,GAFA7K,KAAKsL,SAAS,EAEY,SAAtBtL,KAAK0J,aAA0B,CAC/B,GAA0B,OAAtB1J,KAAK+I,IAAI6C,SAET,OADA5L,KAAK2H,MAAM3H,KAAK+J,UAAW/J,KAAKgK,YAAa,aAAa,EACnD,CAAA,EACJ,GAAwC,KAAA,IAA5BhK,KAAK+I,IAAI6C,SAASjE,MAEjC,OADA3H,KAAK2H,MAAM3H,KAAK+J,UAAW/J,KAAKgK,YAAahK,KAAK+I,IAAI6C,SAASjE,KAAK,EAC7D,CAAA,CAEf,CAEsB,OAAlB3H,KAAKyD,UAA8C,YAAzB,OAAOzD,KAAKyD,UACtCzD,KAAKyD,SAASnD,KAAKN,KAAKwJ,QAASxJ,KAAK+I,IAAI6C,SAAU5L,KAAKmE,IAAI,CAErE,CAOAwD,MAAMkE,EAAUL,EAAYM,GACxBrK,IAAIsK,EAAc,GAEE,YAAfP,EACDO,GAAe,0BACM,MAAbF,EACY,gBAAfL,EACDO,GAAe,6DAEfA,GAAe,6BAA+BP,EAAa,IAC7B,KAAA,IAAlBM,IACRC,GAAe,2BAA6BD,IAIpDC,GADoB,MAAbF,EACQ,yBAEA,4BAA8BA,EAGjD7L,KAAKgM,YAAaD,CAAY,CAClC,CAKAC,YAAYC,GACR9B,QAAQzD,IAAK,qBAAuBuF,EAAU,cAAe,cAAe,CAChF,CAKAxB,aAEI,IAAMhJ,IAAIyK,KAAclM,KAAK2J,QACgB,KAAA,IAA7B3J,KAAK2J,QAAQuC,IACrBlM,KAAK+I,IAAIoD,iBAAiBD,EAAYlM,KAAK2J,QAAQuC,EAAW,CAG1E,CAKA3B,cAEI,MAAK,CAACvK,KAAK6J,+BAA+B9E,QAAS/E,KAAKiJ,MAAO,EACpDjJ,KAAKoM,iBAAiB,EAItBpM,KAAKqM,kBAAkB,CAEtC,CAKAD,mBACI3K,IAAI6K,EAAiB,IAAIC,gBAAgBvM,KAAKmE,IAAI,EAAEqI,SAAS,EACzDC,EAAezM,KAAKyG,IAAIhC,MAAM,8BAA8B,EAAI,IAAM,IAG1E,OAFAzE,KAAKyG,KAAOgG,EAAeH,EAEpBtM,KAAKyG,GAChB,CAKA4F,oBAEI,IAAK5K,IAAIiL,KADT1M,KAAK8J,KAAO,IAAI6C,SACI3M,KAAKmE,KACjBhD,OAAOC,OAAOpB,KAAKmE,KAAMuI,CAAO,GAChC1M,KAAK8J,KAAKlE,OACN8G,EAC8B,UAA9B,OAAO1M,KAAKmE,KAAKuI,GACblF,KAAKC,UAAUzH,KAAKmE,KAAKuI,EAAQ,EACjC1M,KAAKmE,KAAKuI,EAClB,EAIR,OAAO1M,KAAK8J,IAChB,CAUAQ,yBAAyBsC,GACrB,GAAuB,UAAlB,OAAOA,EACR,IAAKnL,IAAIoL,KAAaD,EAAQ,CAC1B,IAWYE,EAXR3L,OAAOC,OAAOwL,EAAQC,CAAS,IAEG,UAA7B,OAAOD,EAAOC,KACfD,EAAOC,GAAa7M,KAAKsK,yBAAyBsC,EAAOC,EAAU,GAKtC,UAA7B,OAAOD,EAAOC,KACiC,OAA/CD,EAAOC,GAAWpI,MAAM,iBAAiB,GAGb,UAAvB,OADDqI,EAActF,KAAKW,MAAMyE,EAAOC,EAAU,KAE1CD,EAAOC,GAAaC,EAIpC,CAGJ,OAAOF,CACX,CACJ,OAEM/J,kBAAkBiG,SAEpB/I,eAAekD,GACX8J,MAAM9J,EAAK,EAAE,CACjB,CACJ,OAEMF,kBAAkB+F,SACpBkE,qBAAuBC,kBAAkBC,UAAY,yBACrDC,MAAQ,GAGRpN,eAAekD,IACXA,EAAOA,EAAK,IACPwD,IAAM1D,UAAUiK,cAAgB/J,EAAKkK,MAC1ClK,EAAK0G,QAAU,CACXyD,aAAcH,kBAAkBI,WACpC,EACAN,MAAM9J,CAAI,CACd,CACJ,CAQA,SAASqK,YAAaC,EAASvJ,EAAOwJ,GAClC/L,IAAIgM,EAA8B,CAC9B,kBACA,gBACA,0BACA,2BACA,yBACA,8BAGAC,EAAU,CAAA,EAUd,GARwB,UAAnB,OAAOH,IACRG,EAAsB,oBAAZH,EACY,UAAjB,OAAOvJ,GAAuC,UAAjB,OAAOA,IACrCuJ,EAAU,CAAC,CAACA,EAASvJ,EAAOwJ,MAKU,SAAzCP,kBAAkBU,mBAAgC,CACnDlM,IAAImM,EAAsB,GAC1BL,EAAQM,QAAS,SAASC,GAC+B,CAAC,IAAlDL,EAA4B1I,QAAQ+I,EAAK,EAAE,EAC3CF,EAAoBhN,KAAKkN,CAAI,EAE7BC,kBAAkBC,IAAIF,EAAK,GAAIG,mBAAmBH,EAAK,EAAE,CAAC,CAElE,CAAC,EAEiC,EAA7BF,EAAoBjM,QACrBuM,uBAAuBN,CAAmB,EAIzCO,SAASC,mBAAqB,CAACV,EAEhCQ,uBAAuBX,EAAS,CAACc,gBAAiB,CAAA,CAAI,CAAC,EAEvDC,oCAAoC,CAI5C,KAAqD,WAAzCrB,kBAAkBU,oBAErBQ,SAASC,mBAAqB,CAACV,GAEhCQ,uBAAuBX,EAAS,CAACc,gBAAiB,CAAA,CAAI,CAAC,EAE3Dd,EAAQM,QAAS,SAASC,GACtB,IAAMS,EAA8B,KAAA,IAAZT,EAAK,GAAqB,WAAaN,EAAU,KAAO,GAC5EgB,EAAiC,WAAtB5G,SAAS6G,SAAwB,WAAa,GAC7DlO,SAASmO,OAASzB,kBAAkB0B,aAChCb,EAAK,GACL,IACAG,mBAAmBH,EAAK,EAAE,EAC1B,KACAS,EACA,uBACAC,CACR,CAAC,GAGgD,gBAAzCvB,kBAAkBU,oBAAyCD,GACnEQ,uBAAuBX,CAAO,CAEtC,CAGA,SAASqB,gCACLnN,IAAIoN,EAAuE,EAAtDtO,SAASC,iBAAiB,iBAAiB,EAAEmB,OAC9DmN,EAAwG,EAAtEvO,SAASC,iBAAiB,iCAAiC,EAAEmB,OAC/FoN,EAAiF,EAAhExO,SAASC,iBAAiB,2BAA2B,EAAEmB,OACxEqN,EAAkG,EAA5EzO,SAASC,iBAAiB,uCAAuC,EAAEmB,OACzFsN,EAAkF,EAAjE1O,SAASC,iBAAiB,4BAA4B,EAAEmB,OACzEuN,EAAkG,EAAxE3O,SAASC,iBAAiB,mCAAmC,EAAEmB,OACzFwN,EAAqG,EAA1E5O,SAASC,iBAAiB,qCAAqC,EAAEmB,OAC5FyN,EAA0F,EAAvE7O,SAASC,iBAAiB,kCAAkC,EAAEmB,OACrFwM,SAASC,kBAAoBW,GACzBF,GACAG,GACAF,GACAG,GACAC,GACAC,GACAC,EAEJ/I,WAAW,WACP,IACQgJ,EADHlB,SAASC,oBACNiB,EAA2F,EAA5E9O,SAASC,iBAAiB,uCAAuC,EAAEmB,OACtFwM,SAASC,kBAAoBiB,EAErC,EAAG,GAAI,CACX,CAGA,SAASnB,uBAAuBX,EAAShF,GACI,YAArC,OAAO,wBAEHpI,MAAMmP,QAAQ/B,CAAO,IACrBA,EAAUgC,wBAAwBhC,CAAO,GAG7CpD,QAAQzD,IAAI,sDAAsD,EAGtE,IACI6G,EAAU/F,KAAKW,MAAMoF,CAAO,CAIhC,CAHE,MAAOiC,GAEL,OADArF,KAAAA,QAAQzD,IAAI,iCAAmC8I,CAAC,CAEpD,CAEA,IAAM/L,EAAW8E,GAAUA,EAAO9E,UAAY,KACxCgG,EAAkBlB,GAAUA,EAAOkB,iBAAmB,KAEvDlB,GAAUA,EAAO8F,kBAClBd,EAAQkC,wBAA0B,CAAA,GAIK,SAAtCxC,kBAAkByC,iBAEoB,UAAnC,OAAOnC,EAAQoC,iBAC4B,CAAC,IAA5CpC,EAAQoC,gBAAgB5K,QAAQ,KAAK,IAErCwI,EAAQoC,gBAAkBC,mBAAmBrC,EAAQoC,eAAe,GAExEE,sBACI,eACA,CACI5G,OAAQ,OACR9E,KAAM,CAACoJ,QAASA,CAAO,EACvB9J,SAAUA,EACVgG,gBAAiBA,CACrB,CACJ,GAG8C,eAAtCwD,kBAAkByC,iBAC1BI,sBACI,CACIC,OAAQ,gCACRxC,QAASA,CACb,EACA,CACIyC,QAAS,EACTvM,SAAUA,EACVgG,gBAAiBA,CACrB,CACJ,CAER,CAQA,SAASwG,YAAY7L,GACb8L,EAAU3P,SAASmO,OAAOjK,MAAM,IAAI0L,OACpC,WAAa/L,EAAK9C,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAO4O,EAAUN,mBAAmBM,EAAQ,EAAE,EAAIE,KAAAA,CACtD,CAGA,SAASC,eAAeC,GAEpB,IAKQ9B,EALsC,SAAzCvB,kBAAkBU,qBAI8B,WAAzCV,kBAAkBU,oBACtBa,EAAiC,WAAtB5G,SAAS6G,SAAwB,WAAa,GAC7DlO,SAASmO,OAAS4B,EAAa,mEAAqE9B,GAG5FvB,kBAAkBU,mBAGlC,CAGA,SAASmC,sBAAsB3L,EAAMoE,EAAQgI,GAEzC9O,IAAI+O,EAAU,GACdA,EAAkB,SAAIjI,EAAO9E,UAAY,KACzC+M,EAAyB,gBAAIjI,EAAOkB,iBAAmB,KACvD+G,EAA0B,iBAAIjI,EAAOkI,kBAAoB,KACzDD,EAAyB,gBAAIjI,EAAOmI,iBAAmB,KACvDF,EAAe,MAAIjI,EAAOW,OAAS,CAAA,EACnCsH,EAAiB,QAAIjI,EAAOyH,SAAW,KACvCQ,EAAsB,aAAGjI,EAAOyH,QAAU,OAAS,OACnDQ,EAAiB,QAAIjI,EAAOqB,SAAW,KACvC4G,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAIjI,EAAOc,QAAU,KACrCmH,EAAiB,QAAIjI,EAAOe,SAAW,KACvCkH,EAAqB,YAAIjI,EAAOgB,aAAe,KAC/CiH,EAAgB,OAAIjI,EAAOoI,QAAU,KACrCH,EAAkB,SAAIjI,EAAOqI,UAAY,KACzCJ,EAAc,KAAIrM,EAClBqM,EAAa,IAAIvD,kBAAkB4D,UAEb,UAAlB,OAAO,GACAL,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBvD,kBAAkB6D,aAE5EN,EAAc,KAAIA,EAAc,KAAI,aAAehI,KAAKE,OAAO,IAExD8H,EAAkB,WACrBA,EAAc,KAAEM,YAAc7D,kBAAkB6D,aAEpDN,EAAc,KAAEO,SAAWvI,KAAKE,OAAO,IAG3C,IAAInJ,WAAYoD,KAAK6N,CAAO,CAChC,CAGA,SAASX,sBAAuB1C,EAAO5E,GACnC9G,IAAI+O,EAAU,GACdA,EAAe,MAAIrD,EACnBqD,EAAkB,SAAIjI,EAAO9E,UAAY,KACzC+M,EAAyB,gBAAIjI,EAAOkB,iBAAmB,KACvD+G,EAAc,KAAIjI,EAAOpE,MAAQ,GACjCqM,EAAgB,OAAIjI,EAAOU,QAAU,QAErC,IAAI1J,WAAYuD,KAAK0N,CAAO,CAChC,CAOA,SAASQ,wBACL,OAAOxI,KAAKE,OAAO,EAAE8D,SAAS,EAAE,EAAElL,QAAQ,WAAY,EAAE,EAAE2P,OAAO,EAAG,EAAE,CAC1E,CAEAxP,IAAIsM,kBAAoB,CACpBmD,IAAK,SAAShH,EAAKiH,GACU,KAAA,IAAbA,IACRA,EAAW,SAETC,EAAenJ,aAAaC,QAAQgC,CAAG,EAC7C,GAAsB,OAAjBkH,EACD,IACI,IAAMC,EAAO7J,KAAKW,MAAMiJ,CAAY,EACpC,GAAKC,CAAAA,EAAKC,eAAeH,CAAQ,EAS7B,OAAOE,EARP,IAEI,OAAO7J,KAAKW,MAAOkJ,EAAKF,EAAU,CAItC,CAHE,MAAO3B,GAEL,OAAO6B,EAAKF,GAAU3E,SAAS,CACnC,CAMR,CAFE,MAAOgD,GACL,OAAO4B,CACX,CAEJ,MAAO,CAAA,CACX,EACApD,IAAK,SAAS9D,EAAKlG,EAAOuN,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACxN,MAASwD,KAAKC,UAAUzD,CAAK,EAAGyN,UAAajJ,KAAKC,OAAM,IAAIxC,MAAOyL,QAAQ,EAAI,GAAI,CAAC,EACrGzJ,aAAaG,QAAQ8B,EAAK1C,KAAKC,UAAU+J,CAAS,CAAC,GAEnDvJ,aAAaG,QAAQ8B,EAAKlG,CAAK,CAEvC,EACA2N,QAAS,SAASzH,EAAK0H,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEG5R,KAAKkR,IAAIhH,EAAK,WAAW,EACxB0H,EAAcpJ,KAAKC,OAAM,IAAIxC,MAAOyL,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAAS3H,GACZ,OAAqC,OAA9BjC,aAAaC,QAAQgC,CAAG,CACnC,EACA4H,OAAQ,SAAS5H,GACbjC,aAAa8J,WAAW7H,CAAG,CAC/B,EACA8H,iBAAkB,WACdvQ,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEuG,aAAatG,OAAQD,CAAC,GAAI,CACtCD,IAAIyI,EAAMjC,aAAaiC,IAAIxI,CAAC,EACF,CAAC,IAAvBwI,EAAInF,QAAQ,KAAK,GAAoC,CAAC,IAA1BmF,EAAInF,QAAQ,QAAQ,IAChDZ,EAAK+F,EAAIsC,SAAS,GAAKuB,kBAAkBmD,IAAIhH,CAAG,EAExD,CACA,OAAO/F,CACX,CAEJ,EAEI8N,oBAAsB,CACtBf,IAAK,SAAShH,EAAKiH,GACU,KAAA,IAAbA,IACRA,EAAW,SAETC,EAAec,eAAehK,QAAQgC,CAAG,EAC/C,GAAsB,OAAjBkH,EACD,IACI,IAAMC,EAAO7J,KAAKW,MAAMiJ,CAAY,EACpC,OAAOC,EAAKC,eAAeH,CAAQ,EAAI3J,KAAKW,MAAMkJ,EAAKF,EAAS,EAAIE,CAGxE,CAFE,MAAO7B,GACL,OAAO4B,CACX,CAEJ,MAAO,CAAA,CACX,EACApD,IAAK,SAAS9D,EAAKlG,EAAOuN,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACxN,MAASwD,KAAKC,UAAUzD,CAAK,EAAGyN,UAAajJ,KAAKC,OAAM,IAAIxC,MAAOyL,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAe9J,QAAQ8B,EAAK1C,KAAKC,UAAU+J,CAAS,CAAC,GAErDU,eAAe9J,QAAQ8B,EAAKlG,CAAK,CAEzC,EACA6N,MAAO,SAAS3H,GACZ,OAAuC,OAAhCgI,eAAehK,QAAQgC,CAAG,CACrC,EACA4H,OAAQ,SAAS5H,GACbgI,eAAeH,WAAW7H,CAAG,CACjC,EACA8H,iBAAkB,WACdvQ,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEwQ,eAAevQ,OAAQD,CAAC,GAAI,CACxCD,IAAIyI,EAAMgI,eAAehI,IAAIxI,CAAC,EACJ,CAAC,IAAvBwI,EAAInF,QAAQ,KAAK,GAAoC,CAAC,IAA1BmF,EAAInF,QAAQ,QAAQ,IAChDZ,EAAK+F,EAAIsC,SAAS,GAAKyF,oBAAoBf,IAAIhH,CAAG,EAE1D,CACA,OAAO/F,CACX,CACJ,EAUA,SAASgO,sBAAsBrS,IAC1B,oBAAsBA,EAAMsS,cACzBC,kBAAkCC,yBAAhBxS,EAAMuD,MAAM,CACtC,CAUA,SAASkP,aAAazS,IACjB,0BAA4BA,EAAM0S,WAAe,SAAU1S,EACtBwS,wBAAlCD,mBAA0DvS,EAAMuD,MAAM,CAC9E,CAWA,SAASgP,kBAAkBI,GACvB,IAGI3S,EAHA2S,EAAQC,aAAa,eAAe,IACxCD,EAAQrH,aAAa,gBAAiB,EAAE,EAEpCtL,EAAQ,IAAIqG,OAAOwM,YAAY,iBAAkB,CACjDC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIL,EAAQM,cAAcjT,CAAK,KAC5B2S,EAAQzO,MAAQ,GAExB,CAWA,SAASsO,wBAAwBG,GACxBA,EAAQC,aAAa,eAAe,IACzCD,EAAQhH,gBAAgB,eAAe,EAGvCgH,EAAQM,cAAc,IAAI5M,OAAOwM,YAAY,iBAAkB,CAC3DC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAkBME,WACFC,UAAY,CACRC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,WAAY,EACZC,kBAAmB,EACnBC,iBAAkB,EAClBC,UAAW,EACXC,WAAY,CAChB,EAEAC,OAASlT,SAASC,iBAAiB,wBAAwB,EAE3D2D,KAAO,GAKPuP,kBACmBvT,MAAMC,UAAUC,MAAMC,KAAKN,KAAKyT,MAAM,EAC5C5F,QAAQ,CAAC8F,EAAOjS,KACrB1B,KAAKmE,KAAKvD,KAAKO,OAAOyS,OAAO,GAAI5T,KAAKiT,SAAS,CAAC,CACpD,CAAC,CACL,CAKAY,eACI7T,KAAKyT,OAAO5F,QAAQ,CAAC8F,EAAOjS,KACxBiS,EAAMzQ,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAGyR,YAAc,CAAA,CAC/B,CAAC,CACL,CAAC,EAEDnT,KAAKyT,OAAO5F,QAAQ,CAAC8F,EAAOjS,KACxBiS,EAAMzQ,iBAAiB,iBAAkB,KACrClD,KAAKmE,KAAKzC,GAAGwR,WAAa,CAAA,CAC9B,CAAC,CACL,CAAC,EAEDlT,KAAKyT,OAAO5F,QAAQ,CAAC8F,EAAOjS,KACxBiS,EAAMzQ,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAG8R,UAAU,GACvB/R,IACIqS,EADAhO,EAAO,CAAE,IAAIG,KAGe,IAA5BjG,KAAKmE,KAAKzC,GAAG8R,YACbxT,KAAKmE,KAAKzC,GAAG4R,iBAAmBxN,EAChC9F,KAAKmE,KAAKzC,GAAG2R,kBAAoBvN,IAIrCgO,EAAehO,EAAO9F,KAAKmE,KAAKzC,GAAG4R,iBACH,IAA5BtT,KAAKmE,KAAKzC,GAAG8R,YACbxT,KAAKmE,KAAKzC,GAAG4R,iBAAmBxN,EAChC9F,KAAKmE,KAAKzC,GAAG6R,UAAYO,GAIC,EAA1B9T,KAAKmE,KAAKzC,GAAG8R,aACbxT,KAAKmE,KAAKzC,GAAG0R,YAAc5K,KAAKuL,IAAI/T,KAAKmE,KAAKzC,GAAG6R,UAAYO,CAAY,EACzE9T,KAAKmE,KAAKzC,GAAG4R,iBAAmBxN,EAChC9F,KAAKmE,KAAKzC,GAAG6R,UAAYO,GAEjC,CAAC,CACL,CAAC,CACL,CACJ,CAGA,MAAME,OAAS,IAAI/N,KACbgO,UAAW,IAAIhO,MAAOyL,QAAQ,EACpCjQ,IAAIyS,sBAAwB,CAAA,EACxBC,YAAc,GACdC,mBAAqB,EACrBC,gBAAkB,GAClBC,oBACAC,yBAGJ,SAASC,2BAA2B3T,EAAMf,EAAO2D,GACN,YAAnC,OAAO0C,OAAOjD,iBAAiCrC,EAAKqC,iBAAiBpD,EAAO2D,CAAQ,EACnF5C,EAAK4T,YAAY3U,EAAO2D,CAAQ,CACzC,CAEA,SAASiR,2BAA2B7T,EAAMf,EAAO2D,GACH,YAAtC,OAAO0C,OAAOwO,oBAAoC9T,EAAK8T,oBAAoB7U,EAAO2D,CAAQ,EACzF5C,EAAK+T,YAAY9U,EAAO2D,CAAQ,CACzC,CAGA,MAAMoR,mBAAqB,SAAgB/U,GAEvCwN,YAAY,mBADO9E,KAAKC,OAAM,IAAIxC,MAAOyL,QAAQ,EAAI,GAAI,CACb,EAC5CoD,uBAAuB,CAC3B,EAmBMC,qBAhBNC,iBAAiB,GAAI,EAGjB7G,SAAS8G,kBAETX,oBAAsBY,YAAY,WAC9BhB,sBAAwB,CAAA,CAC5B,EAAG,GAAG,EAGNK,yBAA2BW,YAAY,WACnC5H,YAAY,kBAAmB9F,KAAKC,UAAU0M,WAAW,CAAC,CAC9D,EAAG,IAAI,GAIiB,SAAgBrU,GACxCqV,gBAAgB,EACc,CAAA,IAA1BjB,wBACAC,YAAYvT,KAAK,CACb4H,KAAK4M,MAAMtV,EAAMuV,OAAO,EACxB7M,KAAK4M,MAAMtV,EAAMwV,OAAO,EACxB9M,KAAK4M,OAAM,IAAInP,MAAOyL,QAAQ,EAAIuC,QAAQ,EAC7C,EAEDG,kBAAkB,GAClBF,sBAAwB,CAAA,EACE,IAAtBE,qBACAmB,gBAAgB,CAG5B,GAMA,SAASP,iBAAiBQ,EAAmB,KACzCnP,WAAW,WACP6O,YAAY,WACRO,uBAAuB,EACvBC,mCAAmC,CACvC,EAAG,GAAI,CACX,EAAGF,CAAgB,CACvB,CAKA,SAASE,qCAIL,IAQcC,EARRC,EACyD,EAA3DrV,SAASsV,uBAAuB,gBAAgB,EAAElU,QACqB,EAAvEpB,SAASsV,uBAAuB,4BAA4B,EAAElU,OAGlE,IACSiU,IAEKD,EAAQ5H,kBAAkBmD,IAAI,0BAA0B,EAC5B,YAA9B,OAAO4E,qBAA+C1F,KAAAA,IAAVuF,GAAwC,KAAjBA,EAAMhU,QACzEmU,mBAAmBH,CAAK,CAMpC,CAFE,MAAOnG,GACLrF,QAAQzD,IAAI8I,EAAEhD,SAAS,CAAC,CAC5B,CACJ,CAKA,SAAS+I,kBACLb,2BAA2BnU,SAAU,YAAawU,mBAAmB,EACrEgB,cAAczB,mBAAmB,EACjCyB,cAAcxB,wBAAwB,CAC1C,CAKA,SAASO,yBACLJ,2BAA2BnU,SAAU,YAAasU,kBAAkB,EACpEH,2BAA2BnU,SAAU,UAAWsU,kBAAkB,CACtE,CAKA,SAASmB,WAAWxG,GAChB/N,IAAIwU,EAAezG,EAAEnM,OAAOW,MACxBiS,CAAAA,GAAkBA,KAAgB5B,kBAES,SAAtCpH,kBAAkByC,gBACnBG,sBACI,0BACA,CACI5G,OAAQ,OACR9E,KAAM,CAAC+R,MAASD,CAAY,EAC5BxS,SAAU,SAAS0S,GACXA,EAAOA,SACP9B,gBAAgB4B,GAAgB,CAC5BE,OAAUA,EAAOA,OACjB1E,UAAaxL,KAAKmQ,IAAI,EAAI,IAAM,CACpC,EACA9I,YAAY,oBAAqB9F,KAAKC,UAAU4M,eAAe,CAAC,EAExE,CACJ,CACJ,EAE8C,eAAtCpH,kBAAkByC,iBAC1BI,sBACI,CACIC,OAAQ,gCACRmG,MAAOD,CACX,EACA,CACIxS,SAAU,SAAS0S,GACXA,EAAOA,SACP9B,gBAAgB4B,GAAgB,CAC5BE,OAAUA,EAAOA,OACjB1E,UAAaxL,KAAKmQ,IAAI,EAAI,IAAM,CACpC,EACA9I,YAAY,oBAAqB9F,KAAKC,UAAU4M,eAAe,CAAC,EAExE,CACJ,CACJ,EAGZ,CAKA,SAASgC,cAAcC,GAEnB,IAKYC,EANZjJ,YAAY,kBAAmBgJ,CAAQ,GAClC,CAACnI,SAASqI,gBACsB,SAAhCrI,SAASR,oBAAyF,IAAxDpN,SAASC,iBAAiB,iBAAiB,EAAEmB,QACvD,gBAAhCwM,SAASR,oBAAgG,IAAxDpN,SAASC,iBAAiB,iBAAiB,EAAEmB,SAExFpB,CAAAA,SAASkW,eAAe,aAAa,KACpCF,EAAchW,SAASoE,cAAc,KAAK,GAClCyG,aAAa,MAAO,iBAAiB,EACjDmL,EAAYnL,aAAa,QAAS,iBAAiB,EACnDmL,EAAYnL,aAAa,KAAM,aAAa,EAC5CmL,EAAYnL,aAAa,QAAS,+BAA+B,EACjEmL,EAAYnL,aAAa,MAAOkL,CAAQ,EACxChO,MAAM,MAAM,EAAE1C,OAAO2Q,CAAW,EAG5C,CAKA,SAASG,8BAA8BJ,GACnC,IAKYC,GALP,CAACpI,SAASqI,gBACsB,SAAhCrI,SAASR,oBAAyF,IAAxDpN,SAASC,iBAAiB,iBAAiB,EAAEmB,QACvD,gBAAhCwM,SAASR,oBAAgG,IAAxDpN,SAASC,iBAAiB,iBAAiB,EAAEmB,SAExFpB,CAAAA,SAASkW,eAAe,aAAa,KACpCF,EAAchW,SAASoE,cAAc,KAAK,GAClCyG,aAAa,MAAO,iBAAiB,EACjDmL,EAAYnL,aAAa,QAAS,iBAAiB,EACnDmL,EAAYnL,aAAa,KAAM,aAAa,EAC5CmL,EAAYnL,aAAa,QAAS,+BAA+B,EACjEmL,EAAYnL,aAAa,MAAOwE,mBAAmB0G,CAAQ,CAAC,EAC5DhO,MAAM,MAAM,EAAE1C,OAAO2Q,CAAW,EAG5C,CAKA,SAASI,gBAELlV,IAAImV,EAAuB7I,kBAAkBmD,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzB0F,EAAiC,CAClC,GAAO7I,kBAAkB4D,QAAQ,kBAAmB,KAAQ,EAMxD,OAHAxH,QAAQzD,IAAI,CAAC,EAAbyD,KAEAuM,8BAA8BE,CAAoB,EAJlD7I,kBAAkB+D,OAAO,iBAAiB,CAOlD,CACA3H,QAAQzD,IAAI,CAAC,EAE8B,SAAtCuG,kBAAkByC,gBACnBG,sBACI,sBACA,CACI5G,OAAQ,OACRxF,SAAU,SAAS0S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBU,SAAuC,IAA5BV,EAAOpR,QAAQ,OAAO,IAE3EgJ,kBAAkBmD,IAAI,iBAAiB,IAE1CnD,kBAAkBC,IAAI,kBAAmBmI,CAAM,EAE/C7H,oCAAoC,GAGxC+H,cAAcF,CAAM,EAE5B,CACJ,CACJ,EAGArG,sBACI,CACIC,OAAQ,qBACZ,EACA,CACIC,QAAS,CAAA,EACTvM,SAAU,SAAS0S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBU,SAAuC,IAA5BV,EAAOpR,QAAQ,OAAO,IAE3EgJ,kBAAkBmD,IAAI,iBAAiB,IAE1CnD,kBAAkBC,IAAI,kBAAmBmI,CAAM,EAE/C7H,oCAAoC,GAGxC+H,cAAcF,CAAM,EAE5B,CACJ,CACJ,CAER,CAKA,SAASW,mBACE/I,kBAAkB8D,MAAM,iBAAiB,GAAO9D,kBAAkBmD,IAAI,iBAAiB,IAC1F5D,YAAY,kBAAmB,MAAM,EACrCS,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhCG,SAASR,oBAC0ByC,KAAAA,IAAnCH,YAAY,iBAAiB,GAE7B3C,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAAS6H,kBACEpH,kBAAkB8D,MAAM,gBAAgB,GAAO9D,kBAAkBmD,IAAI,gBAAgB,IACxF5D,YAAY,iBAAkB,MAAM,EACpCS,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhCG,SAASR,oBACyByC,KAAAA,IAAlCH,YAAY,gBAAgB,GAE5B3C,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAASmI,yBACA1H,kBAAkB8D,MAAM,sBAAsB,GAAM9D,kBAAkB8D,MAAM,eAAe,GAC5FkF,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACKhJ,CAAAA,kBAAkB8D,MAAM,eAAe,GAAK9D,CAAAA,kBAAkBmD,IAAI,eAAe,GACjFnD,CAAAA,kBAAkB8D,MAAM,sBAAsB,GAAK9D,CAAAA,kBAAkBmD,IAAI,sBAAsB,GAE5D,WAAhC/C,SAASR,oBAC+ByC,KAAAA,IAAxCH,YAAY,sBAAsB,GACDG,KAAAA,IAAjCH,YAAY,eAAe,EANnC,CAaAxO,IAAIuV,EAAQC,eAAe,EAG3B,GAFA9I,SAAS+I,eAAiB,GAEP,EAAfF,EAAMrV,OACN,IAAKF,IAAIC,EAAI,EAAGA,EAAIsV,EAAMrV,OAAQD,CAAC,GAAI,CAEnC,IAAMyV,EAAoBH,EAAMtV,GAAGlB,iBAAiB,gBAAgB,EACpE,IAAKiB,IAAIC,EAAI,EAAGA,EAAIyV,EAAkBxV,OAAQD,CAAC,GACT,WAA9ByV,EAAkBzV,GAAG0V,OAErBjJ,SAAS+I,eAAetW,KAAKuW,EAAkBzV,EAAE,EAEjD8S,2BAA2B2C,EAAkBzV,GAAI,QAAS2V,yBAAyB,EACnF7C,2BAA2B2C,EAAkBzV,GAAI,QAAS4V,kBAAkB,EAGxF,CAlBJ,CAoBJ,CAOA,SAASC,sBAAsBC,EAAWC,GACtC,GAAuC,KAAA,IAA5BtJ,SAAS+I,gBAAmE,EAAjC/I,SAAS+I,eAAevV,OAC1E,IAAKF,IAAIC,EAAI,EAAGA,EAAIyM,SAAS+I,eAAevV,OAAQD,CAAC,GACjDgT,2BAA2BvG,SAAS+I,eAAexV,GAAI8V,EAAWC,CAAY,CAG1F,CAEAhW,IAAI4V,0BAA4B,SAAgBvX,GAC5C4X,qBAAqB,EACrBH,sBAAsB,QAASF,yBAAyB,CAC5D,EAEIC,mBAAqB,SAAgBxX,GACrC6X,cAAc,EACdJ,sBAAsB,QAASD,kBAAkB,CACrD,EAKA,SAASI,uBACE3J,kBAAkB8D,MAAM,sBAAsB,GAAO9D,kBAAkBmD,IAAI,sBAAsB,GACpGnD,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhCG,SAASR,oBAC+ByC,KAAAA,IAAxCH,YAAY,sBAAsB,GAEN,gBAAhC9B,SAASR,oBAGuB,SAAhCQ,SAASR,qBAEiC,KAAA,IAA/BQ,SAASC,mBACgBgC,KAAAA,IAA/BjC,SAASC,mBAAmCD,SAASC,qBAI9Dd,YAAY,uBAAwB,MAAM,CAElD,CAKA,SAASqK,gBACE5J,kBAAkB8D,MAAM,eAAe,GAAO9D,kBAAkBmD,IAAI,eAAe,GACtFnD,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhCG,SAASR,oBACwByC,KAAAA,IAAjCH,YAAY,eAAe,GAEC,gBAAhC9B,SAASR,oBAGuB,SAAhCQ,SAASR,qBAEiC,KAAA,IAA/BQ,SAASC,mBACgBgC,KAAAA,IAA/BjC,SAASC,mBAAmCD,SAASC,qBAI9Dd,YAAY,gBAAiB,MAAM,CAE3C,CAKA,SAASsK,wBACDzJ,SAAS0J,wBACE1W,OAAO2W,QAAQ3J,SAAS0J,sBAAsB,EACpDhK,QAAQ,CAAA,CAAE3D,EAAKlG,MAChB+J,kBAAkBC,IAAI9D,EAAKlG,CAAK,CACpC,CAAC,CAET,CAYA,SAAS+T,gCAEL,SAASC,EAAsBjP,GAC3B,GAAIA,EAAIkP,cACmC,CAAC,IAAxClP,EAAIkP,aAAalT,QAAQ,QAAQ,GACO,CAAC,IAAzCgE,EAAIkP,aAAalT,QAAQ,SAAS,EAElC,IACImT,oBAAoB1Q,KAAKW,MAAMY,EAAIkP,YAAY,CAAC,CAGpD,CAFE,MAAOzI,GACLrF,QAAQzD,IAAI8I,EAAEhD,SAAS,CAAC,CAC5B,CAER,CAEsB,aAAlB,OAAO2L,SAEwC,YAA3C,OAAOA,OAAO5X,QAAQ,EAAE6X,aAAa,EACrCD,OAAO5X,QAAQ,EAAEyC,GAAG,eAAgB,SAASlD,EAAOiJ,EAAKsP,GACrDL,EAAsBjP,CAAG,CAC7B,CAAC,EAEDoP,OAAO5X,QAAQ,EAAE6X,aAAc,SAAStY,EAAOiJ,EAAKsP,GAChDL,EAAsBjP,CAAG,CAC7B,CAAC,EAGb,CAMA,SAASuP,cAQLP,8BAA8B,EAE9BH,sBAAsB,EAGjB3F,oBAAoBJ,MAAM,kBAAkB,EAW7C9D,kBAAkBC,IAAI,kBAAmBlM,OAAOiM,kBAAkBmD,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvFqH,EAAYvH,sBAAsB,EACxCiB,oBAAoBjE,IAAI,mBAAoBuK,EAAW,CAAA,CAAK,EAC5DxK,kBAAkBC,IAAI,kBAAmB,CAAC,EACtCzN,SAASiY,UACQ,IAAIC,IAAIlY,SAASiY,QAAQ,EAC3BE,OAAS9Q,SAAS8Q,MAC7BzG,oBAAoBjE,IAAI,qBAAsBzN,SAASiY,SAAU,CAAA,CAAK,GAOlFG,oCAAoC,EAdpC,IAgBMC,EAAc7K,kBAAkBmD,IAAI,iBAAiB,EAoBrD2H,GAnBCD,GAAeA,IAAgBzK,SAASR,qBAC3CI,kBAAkBC,IAAI,kBAAmBG,SAASR,kBAAkB,EACpEI,kBAAkB+D,OAAO,gBAAgB,EACzC/D,kBAAkB+D,OAAO,iBAAiB,GAGV,gBAAhC3D,SAASR,qBACToJ,uBAAuB,EAEvB1Q,WAAW0Q,uBAAwB,GAAI,GAG3C5Q,OAAOjD,iBAAiB,iBAAkBiP,sBAAuB,CAAA,CAAI,EACrEhM,OAAOjD,iBAAiB,QAASqP,aAAc,CAAA,CAAI,EACnDhS,SAASuY,WAAa,IAAI9F,WAC1BzS,SAASuY,WAAWpF,gBAAgB,EACpCnT,SAASuY,WAAWjF,aAAa,EAGb,CAChB,CAAC,kBAAmBrL,KAAKC,OAAM,IAAIxC,MAAOyL,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAesC,OAAO+E,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkBjR,UAAUkR,aAWjC,GARAlL,kBAAkBC,IAAI,kBAAmBxF,KAAKC,OAAM,IAAIxC,MAAOyL,QAAQ,EAAI,GAAI,CAAC,EAChF3D,kBAAkBC,IAAI,mBAAoB,GAAG,EAC7CD,kBAAkBC,IAAI,kBAAmB,GAAG,EAE5CD,kBAAkBC,IAAI,cAAegG,OAAO+E,kBAAkB,EAAE,GAAG,CAAE,CAAG,EACxEhL,kBAAkBC,IAAI,iBAAkBgL,mBAAmB,CAAC,EAC5DjL,kBAAkBC,IAAI,iBAAkBjG,UAAUkR,SAAS,EAEtB,WAAhC9K,SAASR,mBACVkL,EAAYjY,KAAK,CAAC,uBAAwB,IAAI,MAC3C,CAEHa,IAAIyX,EAAe3Y,SAASmO,OAAOyK,MAAM,GAAG,EAC5C,GAA6B,IAAxBD,EAAavX,OACd,IAAMF,IAAIC,EAAI,EAAGA,EAAIwX,EAAavX,OAAQD,CAAC,GAAK,CAC5CD,IACI6O,EADgB4I,EAAaxX,GAAG0X,KAAK,EACVD,MAAM,GAAG,EAAE,GACW,IAAhD7I,EAAWvL,QAAQ,uBAAuB,GAC3CsL,eAAeC,CAAU,CAEjC,CAER,CAEK,CAACnC,SAASkL,iBACN,CAAClL,SAASqI,gBACsB,SAAhCrI,SAASR,oBAAyF,IAAxDpN,SAASC,iBAAiB,iBAAiB,EAAEmB,QACvD,gBAAhCwM,SAASR,oBAAgG,IAAxDpN,SAASC,iBAAiB,iBAAiB,EAAEmB,QAE/FwI,QAAQzD,IAAI,CAAC,EACbiQ,cAAc,GAEdkC,EAAYjY,KAAK,CAAC,kBAAmBuN,SAASmL,WAAW,GAI5D,CAACnL,SAASoL,gCACXV,EAAYjY,KAAK,CAAC,oBAAqB,IAAI,EAC3C0H,MAAM,+BAAiC,EAAEtF,GAAG,OAAQgT,UAAU,GAG9DjI,kBAAkB8D,MAAM,YAAY,EACpCgH,EAAYjY,KAAK,CAAC,aAAcmN,kBAAkBmD,IAAI,YAAY,EAAE,EAEpE2H,EAAYjY,KAAK,CAAC,aAAc,EAAE,EAItCgO,8BAA8B,EAGY,KAAA,IAA/BT,SAASC,mBAChBD,SAASC,mBACTL,kBAAkBmD,IAAI,0BAA0B,GAGhDnD,kBAAkBmD,IAAI,6BAA6B,IAAMnD,kBAAkBmD,IAAI,0BAA0B,GAEzG2H,EAAYjY,KAAK,CAAC,8BAA+BmN,kBAAkBmD,IAAI,0BAA0B,EAAE,EAGlG/C,SAASC,mBAAoD,eAA/BD,SAASR,qBACxCQ,SAASC,kBAAoBL,kBAAkBmD,IAAI,0BAA0B,GAGjF5D,YAAYuL,CAAW,EAEvBxS,WAAW,WAEkC,KAAA,IAA9B8H,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,oBAEzDE,oCAAoC,EAIG,KAAA,IAAhCH,SAASR,oBACgB,SAAhCQ,SAASR,oBAET6L,0CAA0C,EAG9C,IAAK/X,IAAIC,EAAI,EAAGA,EAAInB,SAASyW,MAAMrV,OAAQD,CAAC,GAAI,CAC5CD,IAoBIgY,EAIAC,EAxBAC,EAAOpZ,SAASyW,MAAMtV,GAGtBkY,8BAA8BrZ,SAASyW,MAAMtV,GAAI,gBAAgB,GAMb0O,KAAAA,IAApD7P,SAASyW,MAAMtV,GAAG/B,SAASka,sBAC8B,EAAzDtZ,SAASyW,MAAMtV,GAAG/B,SAASka,qBAAqBlY,SAKhDgY,EAAKrW,cAAc,oCAAoC,IACnDwW,EAAgBH,EAAKrW,cAAc,oCAAoC,EAC3EqW,EAAKI,YAAYD,CAAa,IAG9BL,EAAclZ,SAASoE,cAAe,OAAQ,GACtCyG,aAAc,OAAQ,QAAS,EAC3CqO,EAAYrO,aAAc,KAAM,wBAA0B1J,CAAE,EAC5D+X,EAAYrO,aAAc,OAAQ,sBAAsB,GACpDsO,EAAuB,IACN,GAAKM,6BAA6BL,CAAI,EAC3DF,EAAYzV,MAAQiW,KAAKzS,KAAKC,UAAUiS,CAAoB,CAAC,EAC7DC,EAAK/T,OAAQ6T,CAAY,EAEzBE,EAAKO,cAAgBP,EAAKQ,SAE1BR,EAAKS,YAAc1Y,EACnBiY,EAAKQ,SAAW,SAASra,GACrB,IACUga,EAD2B,WAAhC3L,SAASR,oBAAuE,KAAA,IAA7B7N,EAAMuD,OAAO+W,eAC3DN,EAAgB,IACR,GAAKE,6BAA6Bha,IAAI,EACpDqa,gCAAiCP,EAAeha,EAAMuD,OAAO+W,WAAY,GAGzC,SAAhCjM,SAASR,oBAAiC2M,uBAAuBxa,EAAMuD,MAAM,IAC7E8C,OAAO6C,eAAe5I,UAAU+K,KAAO,SAAShH,GAC5C1C,IACA8Y,EAAe,uCADIC,gBAAgB,EACoC,IACvEC,YAAYna,KAAKN,KAAMua,EAAepW,CAAI,EAC1CkC,WAAW,KACPF,OAAO6C,eAAe5I,UAAU+K,KAAOsP,WAC3C,EAAG,CAAC,CACR,GAIA3a,EAAMuD,OAAO6W,yBAAyBQ,UAAY,CAACC,0BAA0B7a,EAAMuD,MAAM,GACzFgD,WAAW,WACPvG,EAAMuD,OAAO6W,cAAc5Z,KAAKR,EAAMuD,OAAQvD,CAAK,CACvD,EAAG,GAAG,CAEd,EACJ,CACJ,EAAG,GAAI,EAGP2B,IAAImZ,EAAoBra,SAASC,iBAAiB,wBAAwB,EAE1E,IADA2N,SAASyM,kBAAoBA,GACPjZ,OAClB,IAAKF,IAAIC,EAAI,EAAGA,EAAIkZ,EAAkBjZ,OAAQ,EAAED,EAExCkZ,EAAkBlZ,GAAG2D,cAAcwC,MACnC+S,EAAkBlZ,GAAG2D,cAAcA,cAAcwC,MAKrD+S,EAAkBlZ,GAAGwB,iBAAiB,QAAS2X,yBAAyB,EAKhF,IAAK,MAAMC,KAASva,SAASyW,MAED,aAApB,OAAO7I,UACmC,MAA1CA,SAAS4M,+BAEwB,eAA7BD,EAAMhX,aAAa,IAAI,GACU,OAAhCgX,EAAMhX,aAAa,OAAO,GAAqE,CAAC,IAAxDgX,EAAMhX,aAAa,OAAO,EAAEiB,QAAQ,aAAa,GAC1D,OAA/B+V,EAAMhX,aAAa,MAAM,GAA+D,CAAC,IAAlDgX,EAAMhX,aAAa,MAAM,EAAEiB,QAAQ,QAAQ,KAGvF+V,EAAME,wBAA0BF,EAAMX,SAEtCW,EAAMX,SAAW,GAAOc,4BAA4BzL,EAAGsL,CAAK,EAGxE,CAUA,SAAStB,4CAEL/X,IAAIyZ,EAAa,CAAA,EACM,aAAlB,OAAO/C,QACRA,OAAOgD,UAAU,CACbC,WAAY,SAASrS,EAAKsP,GACtB5W,IAAI4Z,EAAa,CAAA,EA0BjB,GAxB8B,UAAzB,OAAOhD,EAASlU,OAC8B,CAAC,IAA5CkU,EAASlU,KAAKY,QAAQ,eAAe,IACrCsW,EAAa,iBAGgC,CAAC,IAA9ChD,EAASlU,KAAKY,QAAQ,iBAAiB,IACvCsW,EAAa,mBAIyC,CAAC,IAAvDhD,EAASlU,KAAKY,QAAQ,0BAA0B,GACI,CAAC,IAArDsT,EAASlU,KAAKY,QAAQ,wBAAwB,IAE9CsW,EAAa,4BAG0C,CAAC,IAAxDhD,EAASlU,KAAKY,QAAQ,2BAA2B,IACjDsW,EAAa,6BAG4C,CAAC,IAA1DhD,EAASlU,KAAKY,QAAQ,6BAA6B,KACnDsW,EAAa,+BAGQ,UAAxB,OAAOhD,EAAS5R,KACmC,CAAC,IAAjD4R,EAAS5R,IAAI1B,QAAQ,qBAAqB,IAC1CsW,EAAa,sBAC4C,OAArDpT,aAAaC,QAAQ,0BAA0B,GAAY,CAC3DgT,EAAajT,aAAaC,QAAQ,0BAA0B,EAC5D,IACIgT,EAAa1T,KAAKW,MAAM+S,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CACmB,CAAA,IAAfA,GAAwBA,EAAW5J,eAAe,OAAO,GAA0B,KAArB4J,EAAWlX,QACzEkX,EAAaA,EAAWlX,MAEhC,CAIR,IACQuW,EADJc,IACId,EAAeC,gBAAgB,EAE/BU,EADsB,UAAtB,OAAOA,EACM,yCAA2CA,EAAa,IAExD,GAIjB7C,EAASlU,MAFToW,EAAe,uCAAyCA,EAAe,KAExCW,EAAa7C,EAASlU,KAE7D,CACJ,CAAC,CAET,CAGA,SAASwW,0BAA0BhB,GAC/B,MAAIA,CAAAA,CAAAA,EAAKvX,UAAUkZ,SAAS,wBAAwB,CAKxD,CAgBA,SAASL,4BAA4BzL,EAAGsL,GACpC,IAEI,IAAMS,EAAgBT,EAAMxX,cAAc,oCAAoC,EAE9E,MAAMkY,EAAgBV,EAAMxX,cAAc,2BAA2B,EAC/DmY,EAAmBX,EAAMxX,cAAc,uCAAuC,EACpF7B,IAAIia,EAAU,KACVC,EAAY,KAmBhB,GAfsB,OAAlBH,GACwB,OAAxBA,EAAcxX,OACmC,OAAjDwX,EAAc1X,aAAa,gBAAgB,IAE3C4X,EAAUF,EAAcxX,MACxB2X,EAAYH,EAAc1X,aAAa,gBAAgB,GAGvB,gBAAhCqK,SAASR,oBAAwE,WAAhCQ,SAASR,oBACjC,OAArB8N,GACAA,EAAiBG,WAAW7B,YAAY0B,CAAgB,EAKzC,OAAlBF,GAA4C,OAAlBC,EAAwB,CACnDhM,EAAEqM,eAAe,EACjB,IAAMC,EAAW,KAQb,IAGUC,EAVY,OAAlBP,GACAA,EAAcI,WAAW7B,YAAYyB,CAAa,EAG7B,OAArBC,GACAA,EAAiBG,WAAW7B,YAAY0B,CAAgB,EAExDX,EAAME,mCAAmCN,SACzCI,EAAME,wBAAwB,GAGN,QADlBe,EAAiBjB,EAAMxX,cAAc,oCAAoC,IAE3EyY,EAAeH,WAAW7B,YAAYgC,CAAc,EAExDC,gBAAgB5b,UAAU6b,OAAO3b,KAAKwa,CAAK,EAEnD,EAEArZ,IAAIya,EAAgB,KAGE,OAAlBX,IACAW,EAAgBC,KAAKZ,EAAcvX,MAAM1C,QAAQ,sBAAuB,EAAE,CAAC,GAG/E,IAAM4X,EAAe1R,KAAKW,MAAM+T,CAAa,EAG5B,OAAZR,GAAkC,OAAdC,IACrBzC,EAAakD,kCAAoCV,EACjDxC,EAAamD,+BAAiCV,GAKN,UAAxC,OAAOzC,EAAavJ,iBAC4B,CAAC,IAAjDuJ,EAAavJ,gBAAgB5K,QAAQ,KAAK,IAE1CmU,EAAavJ,gBAAkBC,mBAAmBsJ,EAAavJ,eAAe,GAMpD,KAH9BuM,EAAgB1U,KAAKC,UAAUyR,CAAY,GAGxBvX,OACfuM,uBACIgO,EACA,CAACzY,SAAUqY,EAAUrS,gBAAiBqS,EAAUzN,gBAAiB,CAAA,CAAI,CACzE,EAEAyN,EAAS,CAEjB,CAGJ,CAFE,MAAOnU,GACLwC,QAAQmS,KAAK,6CAA+C3U,CAAK,CACrE,CACJ,CAKA,SAASkT,0BAA0B/a,GAC/BE,KAAK2U,oBAAoB,QAASkG,yBAAyB,EAI3D1M,SAASoO,yBAA2B,CAAA,EAEpChc,SAASuJ,KAAK1H,UAAUC,IAAI,kBAAkB,EAJ9CZ,IAWQ+a,EALJC,EAAelc,SAASkW,eAAe,aAAa,EACnDgG,GAWDA,EAAarR,aAAa,QAAS,kBAAkB,EACrD7K,SAASkW,eAAe,kBAAkB,EAAEiG,UACxC,qBAAuBvO,SAASwO,aAAe,uCAZ/CC,EAAerc,SAASoE,cAAc,KAAK,GAClCyG,aAAa,QAAS,aAAa,EAChDwR,EAAaxR,aAAa,KAAM,aAAa,GACzCoR,EAAYjc,SAASoE,cAAc,GAAG,GAChCyG,aAAa,KAAM,kBAAkB,EAC/CoR,EAAUxb,MAAM6b,MAAQ,QACxBL,EAAUM,UAAY,qBAAuB3O,SAASwO,aAAe,oCACrEC,EAAahX,OAAO4W,CAAS,EAC7Bjc,SAASuJ,KAAKlE,OAAOgX,CAAY,GAOrCG,yBAAyBjd,EAAOqO,SAASyM,kBAvBvB5a,IAuBqD,CAC3E,CAOA,SAAS+c,yBAAyBjd,EAAO8a,EAAmBoC,GAExD,IACI7Y,EAAO,CACP8Y,sBAFyB1N,wBAAwB,EAGjD2N,SAAU3c,SAASqH,SAASC,KAC5B2Q,SAAUjY,SAASiY,SACnB2E,cAAe,EACnB,EACIC,EAA0B,GAC9B,IAAK3b,IAAIC,EAAI,EAAGA,EAAIkZ,EAAkBjZ,OAAQD,CAAC,GAAI,CAEN,KAAA,IAA9BkZ,EAAkBlZ,GAAGmG,MAAyE,IAAjD+S,EAAkBlZ,GAAGmG,KAAK9C,QAAQ,SAAS,IAC/FjF,EAAM+b,eAAe,EACrB1N,SAASoO,yBAA2B,CAAA,GAIxC9a,IAAI4b,EAAe9c,SAASoE,cAAc,KAAK,EAC/C0Y,EAAajS,aAAa,QAAS,eAAe,EAClD9C,MAAMsS,EAAkBlZ,EAAE,EAAEkE,OAAOyX,CAAY,EAG/CD,EAAwB1b,GAAKkZ,EAAkBlZ,GAAG4b,QAAQC,cAC9D,CAGApZ,EAAKgZ,cAAgB3V,KAAKC,UAAU2V,CAAuB,EAGhB,SAAtCnQ,kBAAkByC,gBACnBG,sBACI,qBACA,CACI1L,KAAMA,EACN8E,OAAQ,OACRxF,SAAU,SAAS0S,GAEf7I,YAAY,6BAA8Ba,SAASqP,mBAAmB,EACtEC,8BAA8BtH,EAAQyE,EAAmBoC,CAAW,CACxE,EACAvT,gBAAiB,SAASiU,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,GAIAvZ,EAAK4L,OAAS,qBACdD,sBACI3L,EACA,CACI6L,QAAS,CAAA,EACTvM,SAAU,SAAS0S,GAEf7I,YAAY,6BAA8Ba,SAASqP,mBAAmB,EACtEC,8BAA8BtH,EAAQyE,EAAmBoC,CAAW,CACxE,EACAvT,gBAAiB,SAASiU,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,EAER,CAOA,SAASD,8BAA8BtH,EAAQyE,EAAmBoC,GAC1D7G,EAAO0H,SAAyC,CAAA,IAA9B1H,EAAOhS,KAAK,GAAG2Z,WAEjCzX,WAAW,WACP,IAAK5E,IAAIC,EAAI,EAAGA,EAAIkZ,EAAkBjZ,OAAQD,CAAC,GAAI,CAE/CD,IAAIsc,EAOJ,GANA5H,EAAOhS,KAAK0J,QAAQ,IACZmQ,EAAIC,gBAAkBrD,EAAkBlZ,GAAG4b,QAAQC,iBACnDQ,EAAoBC,EAE5B,CAAC,EAEoC,CAAA,IAAjCD,EAAkBD,WAClB,MAGJ,IAGQI,EACAC,EAHiC,KAAA,IAA9BvD,EAAkBlZ,GAAGmG,MACqB,IAAjD+S,EAAkBlZ,GAAGmG,KAAK9C,QAAQ,SAAS,GACvCmZ,EAAetD,EAAkBlZ,GAAGmG,KAAKvG,QAAQ,UAAW,EAAE,EAC9D6c,EAAqBvD,EAAkBlZ,GAAGgb,UAC9C9B,EAAkBlZ,GAAGgb,UACjByB,EAAmB7c,QAAQ4c,EAAcH,EAAkBK,aAAa,EAC5ExD,EAAkBlZ,GAAGmG,KAAO,UAAYkW,EAAkBK,eAG1DC,2BAA2BN,EAAmBnD,EAAkBlZ,EAAE,EAGtEkZ,EAAkBlZ,GAAGiT,oBAAoB,QAASkG,yBAAyB,CAC/E,CAEApZ,IAAI6c,EAAQ/d,SAASkW,eAAe,aAAa,EACnC,OAAV6H,IACA/d,SAASuJ,KAAK1H,UAAUI,OAAO,kBAAkB,EACjD8b,EAAMlT,aAAa,QAAS,cAAc,EAEtC+C,SAASoO,2BACTS,EAAYuB,MAAM,CAG9B,EAAG,GAAI,EAEHpI,EAAO0H,SACPF,kBAAkB,EAClBC,oBAAoB,YAAczH,EAAOhS,KAAK,GAAGqa,OAAO,IAExDb,kBAAkB,EAClBC,oBAAoB,yCAA2CzH,EAAOhS,KAAK,GAAGqa,OAAO,EAGjG,CAKA,SAASb,oBACqC,KAAA,IAA/BxP,SAASyM,mBAChBzM,SAASyM,kBAAkB/M,QAAQ,SAAS4E,GACxCA,EAAQvP,iBAAiB,QAAS2X,yBAAyB,CAC/D,CAAC,CAET,CAMA,SAAStL,wBAAwBkP,EAAgB,IAC7Chd,IAAIid,EAAiB,GAErBA,EAAeC,eAAiB,CAAC,CAAC1O,YAAYhD,kBAAkB0B,aAAe,gBAAgB,EAC/F+P,EAAeE,kBAAoB3O,YAAYhD,kBAAkB0B,aAAe,mBAAmB,EACnG+P,EAAeG,WAAa5O,YAAYhD,kBAAkB0B,aAAe,YAAY,EACrF+P,EAAeI,iBAAmB7O,YAAYhD,kBAAkB0B,aAAe,kBAAkB,EACjG+P,EAAeK,gBAAkB9O,YAAYhD,kBAAkB0B,aAAe,iBAAiB,EAC/F+P,EAAeM,gBAAkB/O,YAAYhD,kBAAkB0B,aAAe,iBAAiB,EAC/F+P,EAAeO,eAAiBhP,YAAYhD,kBAAkB0B,aAAe,gBAAgB,EAC7F+P,EAAeQ,YAAcjP,YAAYhD,kBAAkB0B,aAAe,aAAa,EAGvF,IAAMwQ,EAA2BpR,kBAAkBmD,IAAIjE,kBAAkB0B,aAAe,gBAAgB,EAClGyQ,EAA4BrR,kBAAkBmD,IAAIjE,kBAAkB0B,aAAe,iBAAiB,EACpG0Q,EAA4BtR,kBAAkBmD,IAAIjE,kBAAkB0B,aAAe,iBAAiB,EACpG2Q,EAAgBvR,kBAAkBmD,IAAI,iBAAiB,EACvDqO,EAAmBtN,oBAAoBf,IAAI,oBAAoB,EAC/DsO,EAAmBvN,oBAAoBf,IAAI,oBAAoB,EAC/DuO,EAAyB1R,kBAAkBmD,IAAIjE,kBAAkB0B,aAAe,cAAc,EAC9F+Q,EAAa3R,kBAAkBmD,IAAIjE,kBAAkB0B,aAAe,iBAAiB,EAGrFgR,EAAqB1P,YAAYhD,kBAAkB0B,aAAe,gBAAgB,EAClFiR,EAAsB3P,YAAYhD,kBAAkB0B,aAAe,iBAAiB,EACpFkR,EAAsB5P,YAAYhD,kBAAkB0B,aAAe,iBAAiB,EACpFmR,EAAoB7P,YAAYhD,kBAAkB0B,aAAe,iBAAiB,EAmBxF,GAjBA+P,EAAeqB,eAA8C3P,KAAAA,IAA7B+O,EAC5BA,EAA2BQ,EAC/BjB,EAAesB,gBAAgD5P,KAAAA,IAA9BgP,EAC7BA,EAA4BQ,EAChClB,EAAeuB,gBAAgD7P,KAAAA,IAA9BiP,EAC7BA,EAA4BQ,EAChCnB,EAAe/O,gBAAiCS,KAAAA,IAAfsP,EAC7BA,EAAaI,EACjBpB,EAAewB,gBAAkBZ,EACjCZ,EAAeyB,mBAAqBZ,EACpCb,EAAe0B,mBAAqBZ,EACpCd,EAAe2B,mBAAqBZ,EAE/Bf,EAAe/O,kBAChB+O,EAAe/O,gBAAkBxB,SAASmL,YAIf,UAA3B,OAAO,GACPmF,IAAkB,GAElB,IAAKhd,IAAIC,EAAI,EAAGA,EAAI+c,EAAc9c,OAAQ,EAAED,EACF,UAAjC,OAAQ+c,EAAc/c,GAAG,GAE1Bgd,EAAeD,EAAc/c,GAAG,GAAG,IAAM+c,EAAc/c,GAAG,GAAG,GAE7Dgd,EAAeD,EAAc/c,GAAG,IAAM+c,EAAc/c,GAAG,QAI/DyI,QAAQzD,IAAI,+CAA+C,EAM/D,OAFAgY,EAAiB4B,yBAAyB5B,CAAc,EAEjDlX,KAAKC,UAAUiX,CAAc,CACxC,CAUA,SAAS4B,yBAAyB1T,GAC9B,GAAuB,UAAlB,OAAOA,EAER,IAAKnL,IAAIoL,KAAaD,EAAQ,CAO1B,IAIUE,EATwB,UAA7B,OAAOF,EAAOC,KACfD,EAAOC,GAAayT,yBAAyB1T,EAAOC,EAAU,GAKjC,UAA7B,OAAOD,EAAOC,IACiC,OAA/CD,EAAOC,GAAWpI,MAAM,iBAAiB,GAGb,UAAvB,OADCqI,EAActF,KAAKW,MAAMyE,EAAOC,EAAU,KAE5CD,EAAOC,GAAaC,EAGhC,CAGJ,OAAOF,CACX,CAMA,SAASyR,2BAA2BzS,EAAU2U,GAC1CA,EAAcnV,aAAa,QAAS,EAAE,EACtCmV,EAAc9U,gBAAgB,OAAO,EACrC+U,mBAAmBD,EAAe3U,EAASwS,aAAa,CAC5D,CAMA,SAASoC,mBAAmBnd,EAAQ6S,GAChC5N,MAAMjF,CAAM,EAAEY,KACVqE,MAAMjF,CAAM,EACPY,KAAK,EACL3C,QAAQ,kDAAmD4U,EAAQ,IAAI,CAChF,CACJ,CAKA,SAAS0H,oBAAoBY,GAClBA,EAAAA,GACO,uCAGd/c,IAAI6c,EAAQ/d,SAASkW,eAAe,aAAa,EACjDhV,IAAI+a,EAAYjc,SAASkW,eAAe,kBAAkB,EAC5C,OAAV6H,IACA/d,SAASuJ,KAAK1H,UAAUI,OAAO,kBAAkB,EACjDga,EAAUM,UAAY,4BAA8B0B,EACpDnY,WAAW,WACPiY,EAAMlT,aAAa,QAAS,cAAc,CAC9C,EAAG,GAAI,EAEf,CAGA,SAAS4O,6BAA8BL,GAEnClY,IAAIgf,EAAS,GACTC,EAAgB,GAChBC,EAAqB,EACrBC,EAAkB,GAClBC,EAAuB,EACvBC,EAA2B,GAE/B,IAAKrf,IAAIyI,KAAOyP,EAAKha,SACZohB,MAAM,CAAC7W,CAAG,IACXuW,EAAOvW,GAAOyP,EAAKha,SAASuK,IAsDpC,OAjDAuW,EAASA,EAAOnc,OAAO,SAASzD,GAE5B,MAAuE,CAAC,IAAnEigB,EAAyB/b,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IAI5D,CAAC,IAAM,CAAC,QAAS,YAAYiB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IACjEgd,EAAyBlgB,KAAMC,EAAKiD,aAAa,MAAM,CAAE,EAClD,CAAA,GAGf,CAAC,GAGM+J,QAAQ,SAAShN,EAAMa,EAAG/B,GAGK,WAA9BkB,EAAKiD,aAAa,MAAM,GACM,OAA9BjD,EAAKiD,aAAa,MAAM,GACM,eAA9BjD,EAAKiD,aAAa,MAAM,IAMW,SAAnCjC,iBAAiBhB,CAAI,EAAEoB,SACe,WAAtCJ,iBAAiBhB,CAAI,EAAEmgB,YACY,MAAnCnf,iBAAiBhB,CAAI,EAAEkF,SACO,WAA9BlF,EAAKiD,aAAa,MAAM,GAEnBjD,EAAKuB,UAAUkZ,SAAS,gBAAgB,GAW7CoF,GAAiB,IAAM7f,EAAKiD,aAAa,MAAM,EAC/C6c,CAAkB,KARdC,GAAmB,IAAM/f,EAAKiD,aAAa,MAAM,EACjD+c,CAAoB,IAShC,CAAC,EAEDD,EAAkBA,EAAgBxH,KAAK,EAGhC,CACH6H,eAHJP,EAAgBA,EAActH,KAAK,EAI/B8H,qBAAsBP,EACtBQ,iBAAkBP,EAClBQ,uBAAwBP,CAC5B,CACJ,CAGA,SAASxG,gCAAiCgH,EAAyBC,GAC/D7f,IAAI8f,EAAgD,UAAnC,OAAOF,GAAoE,OAA5BA,EAC5DA,EAA0B,GAE9B,GAAqC,WAAhClT,SAASR,mBAEV,IAAMlM,IAAIC,KAAK6f,EAAa,CACxB,GAAS,GAAJ7f,EAED,OAGJ4L,YAAY,yBADqB8C,KAAAA,IAAXkR,EAAuBA,EAAS5f,GACC8F,KAAKC,UAAW8Z,EAAW7f,EAAG,CAAE,CAC3F,KAEoC,SAAhCyM,SAASR,mBACTL,YAAY,uBAAwB9F,KAAKC,UAAW8Z,EAAW,EAAG,CAAE,EAEpEjU,YAAY,uBAAwB9F,KAAKC,UAAW8Z,CAAW,CAAE,CAG7E,CAGA,SAASC,+BAA+BrL,EAAQhS,EAAMoE,EAAQgI,GAC1D,GAA8D,EAAzDhQ,SAASC,iBAAiB,oBAAoB,EAAEmB,OAAa,CAC9DF,IAAI9B,EAAWY,SAASC,iBAAiB,oBAAoB,EAC7D,IAAMiB,IAAIC,EAAI,EAAGA,EAAI/B,EAASgC,OAAQD,CAAC,GACnC/B,EAAS+B,GAAGsC,MAAQmS,EAAOsL,MAEnC,CACJ,CAKA,SAASzI,qBACL,OAAOxR,KAAKC,UAAU,CAClBia,UAAWnhB,SAASohB,gBAAgBC,YACpCC,WAAYrZ,KAAKsZ,IACbvhB,SAASuJ,KAAKiY,aAAcxhB,SAASohB,gBAAgBI,aACrDxhB,SAASuJ,KAAKkY,aAAczhB,SAASohB,gBAAgBK,aACrDzhB,SAASuJ,KAAKmY,aAAc1hB,SAASohB,gBAAgBM,YACzD,EACAC,aAAc3hB,SAASohB,gBAAgBQ,YACvCC,cAAe7hB,SAASohB,gBAAgBM,YAC5C,CAAC,CACL,CAGA,SAAS/J,oBAAoBtM,GACK,KAAA,IAAnBA,EAAStD,QAChBsD,EAAWA,EAAStD,OACP+Z,UACT9hB,SAASwS,cACL,IAAIJ,YAAa,qBAAsB,CACnCC,QAAS,CAAA,EACTE,OAAQ,CAACnM,QAASiF,EAAS4S,OAAO,CACtC,CAAE,CACN,EAGA8D,eAAeC,OAAS3W,EAAS4S,QACjC8D,eAAe9X,KAAK,EAEU,GAA1B,CAACoB,EAAS4W,cACVrc,OAAOsc,KAAK,CAI5B,CAGA,SAASC,0BAA0BC,GAE/BrV,YAAY,kBAAmBqV,CAAY,CAC/C,CAGA,SAASC,+BAA+BxL,GACpC3V,IAAI+Q,EAAY,SACH,WAAT4E,IACA5E,EAAY,UAEhB/Q,IAAIkS,EAAQ,GACRkP,EAAoB9U,kBAAkBiE,iBAAiB,EACvD8Q,EAAsB7Q,oBAAoBD,iBAAiB,EAE/DvQ,IAAIshB,EAAmB,CAACC,KAAM,EAAE,EAC5BziB,SAASuY,YAAcvY,SAASuY,WAAW3U,OAC3C4e,EAAmB,CAACC,KAAMziB,SAASuY,WAAW3U,IAAI,GAGlDoW,EAAe,CAAC,GAAGsI,EAAmB,GAAGC,EAAqB,GAAGC,CAAgB,EACrFxI,EAAe/S,KAAKC,UAAU8S,CAAY,EAQ1C,OAPAA,EAAe,sBAAwBN,KAAKM,CAAY,GACxD5G,EAAQpT,SAASoE,cAAc,OAAO,GAChCyG,aAAa,OAAQ,2BAA2B,EACtDuI,EAAMvI,aAAa,QAASmP,CAAY,EACxC5G,EAAMvI,aAAa,OAAQoH,CAAS,EACpCmB,EAAMvR,UAAUC,IAAI,qBAAqB,EACzCsR,EAAMvR,UAAUC,IAAI,2BAA2B,EACxCsR,CACX,CAKA,SAASsD,iBACLxV,IAAIuV,EAAQzW,SAASyW,MACrB,OAAIA,GAGG,CAAA,CACX,CAOA,SAASiM,+BAA+BtJ,GAEpClY,IAAI0U,EAAS,CAAC+M,UAAa,EAAGjC,eAAkB,CAAC,EAkC7CkC,IAhC4C,GAA5C,CAAChV,SAASiV,+BACgC,QAAzCzJ,EAAK1Q,OAAOuD,SAAS,EAAEvH,YAAY,GACiB,IAArD0U,EAAKnZ,iBAAiB,kBAAkB,EAAEmB,QAC9B,kBAAZgY,EAAK0J,IACL1J,EAAKvX,UAAUkZ,SAAS,iBAAiB,GACzC3B,EAAKtU,cAAcjD,UAAUkZ,SAAS,aAAa,GACI,CAAC,IAAxD3B,EAAK5J,OAAOvD,SAAS,EAAEzH,QAAQ,kBAAkB,GAChD4U,EAAK0J,IAAkB,eAAZ1J,EAAK0J,IAChB1J,EAAKvX,WAAauX,EAAKvX,UAAUkZ,SAAS,eAAe,GACzD3B,EAAKvX,WAAauX,EAAKvX,UAAUkZ,SAAS,WAAW,GACrD3B,EAAK0J,IAAkB,6BAAZ1J,EAAK0J,IAChB1J,EAAK0J,IAAyD,CAAC,IAApD1J,EAAK0J,GAAG7W,SAAS,EAAEzH,QAAQ,kBAAkB,GACxD4U,EAAK0J,IAAiD,CAAC,IAA5C1J,EAAK0J,GAAG7W,SAAS,EAAEzH,QAAQ,UAAU,GAChD4U,EAAK0J,IACuD,CAAC,IAA1D1J,EAAK0J,GAAG7W,SAAS,EAAEzH,QAAQ,wBAAwB,GACtD4U,EAAKvV,MACyD,CAAC,IAA5DuV,EAAKvV,KAAKoI,SAAS,EAAEzH,QAAQ,wBAAwB,GAC9B,iDAA3B4U,EAAK5J,OAAOvD,SAAS,GACpBmN,EAAKvV,MAA2D,CAAC,IAApDuV,EAAKvV,KAAKoI,SAAS,EAAEzH,QAAQ,gBAAgB,GAC1D4U,EAAK0J,IAAkB,mBAAZ1J,EAAK0J,IAChB1J,EAAK0J,IACU,mBAAZ1J,EAAK0J,IACmD,CAAC,IAAzD1J,EAAK5J,OAAOvD,SAAS,EAAEzH,QAAQ,mBAAmB,GACrD4U,EAAK0J,IAAkB,yBAAZ1J,EAAK0J,IAChB1J,EAAK0J,IAAkB,YAAZ1J,EAAK0J,IACmE,CAAC,IAArF1J,EAAK5J,OAAOvD,SAAS,EAAEzH,QAAQ,+CAA+C,GACpC,OAA1C4U,EAAKrW,cAAc,iBAAiB,KAEpC6S,EAAO8K,eAAiB,GAIAtH,EAAKiC,YAgBjC,OAdIuH,GAAyBA,EAAsB/gB,UAAUkZ,SAAS,UAAU,GAC7D,YAAd3B,EAAKvV,MAAsBuV,EAAKvX,UAAUkZ,SAAS,cAAc,KAElEnF,EAAO+M,UAAY,GAKnBvJ,GAAQA,EAAKvX,UAAUkZ,SAAS,wBAAwB,IAExDnF,EAAO8K,eAAiB,EACxB9K,EAAO+M,UAAY,GAGhB/M,CACX,CAUA,SAASyD,8BAA8BD,EAAM2J,GAEzC,MAAI1e,CAAAA,CAAAA,QAAQ+U,EAAKrW,cAAc,0BAA0B,CAAC,GAGzB,UAA7B,OAAO,GACsD,CAAC,IAA9D,CAAC,iBAAkB,aAAayB,QAAQue,CAAe,GAEhB,IADpBL,+BAA+BtJ,CAAI,EACpC2J,EAI1B,CAKA,SAAShV,sCACL,GAAoC,SAAhCH,SAASR,mBAAb,CAIAlM,IAAIuV,EAAQC,eAAe,EAE3B,GAAID,EACA,IAAMvV,IAAIC,EAAI,EAAGA,EAAIsV,EAAMrV,OAAQD,CAAC,GAAK,CAErCD,IAAIgS,EAASuD,EAAMtV,GAAGlB,iBAAiB,4BAA4B,EACnE,IAAMiB,IAAI8hB,EAAI,EAAGA,EAAI9P,EAAO9R,OAAQ4hB,CAAC,GACjC9P,EAAO8P,GAAGC,UAAY,GAGrB5J,8BAA8BrZ,SAASyW,MAAMtV,GAAI,WAAW,IAKhB,OAA7CnB,SAASyW,MAAMtV,GAAGoC,aAAa,QAAQ,GACoB,SAA3DvD,SAASyW,MAAMtV,GAAGoC,aAAa,QAAQ,EAAEmB,YAAY,EAErD1E,SAASyW,MAAMtV,GAAGkE,OAAOgd,+BAA+B,CAAC,EAC9B,aAApB,OAAOzU,UAC4B,MAA1CA,SAAS4M,+BAEoC,eAAzCxa,SAASyW,MAAMtV,GAAGoC,aAAa,IAAI,GAEa,OAA5CvD,SAASyW,MAAMtV,GAAGoC,aAAa,OAAO,GAC6B,CAAC,IAApEvD,SAASyW,MAAMtV,GAAGoC,aAAa,OAAO,EAAEiB,QAAQ,aAAa,GAElB,OAA3CxE,SAASyW,MAAMtV,GAAGoC,aAAa,MAAM,GACwB,CAAC,IAA9DvD,SAASyW,MAAMtV,GAAGoC,aAAa,MAAM,EAAEiB,QAAQ,QAAQ,IAI/DxE,SAASyW,MAAMtV,GAAGkE,OAAOgd,+BAA+B,QAAQ,CAAC,EAEzE,CApCJ,CAsCJ,CA7kCIzU,SAAS8G,kBACTT,2BAA2BjU,SAAU,YAAawU,mBAAmB,EACrEP,2BAA2BjU,SAAU,YAAasU,kBAAkB,EACpEL,2BAA2BjU,SAAU,UAAWsU,kBAAkB,EAClEL,2BAA2BjU,SAAU,SAAUuW,gBAAgB,GAqW/D3I,SAAS8G,kBACmB,YAAxB1U,SAASkjB,WACTnL,YAAY,EAEZ9D,2BAA2BjU,SAAU,mBAAoB+X,WAAW,EAGxEvK,kBAAkBC,IAAI,aAAcG,SAASuV,eAAgB,CAAA,CAAK,GA+tBtE,MAAMC,aAAexd,OAAOyd,MACtBnJ,YAAczR,eAAe5I,UAAU+K,KAW7C,SAAS0Y,6BACLxd,WAAW,WACHyd,oBAAoB,IACpB3d,OAAOyd,MAAQ,YAAY3gB,GACvB,IAKQsX,EAOR,OAZItX,GACAA,EAAK,IACuB,YAA5B,OAAOA,EAAK,GAAG8gB,UACf9gB,EAAK,GAAG8gB,SAAS,mBAAmB,IAEhCxJ,EAAeC,gBAAgB,EAE/BvX,IAAQA,EAAK,IAAMA,EAAK,GAAG6G,MAC3B7G,EAAK,GAAG6G,KAAKlE,OAAO,4BAA6B2U,CAAY,EAI9DoJ,aAAaK,MAAM7d,OAAQlD,CAAI,CAC1C,EAER,EAAG,GAAI,CACX,CAKA,SAAS6gB,sBACL,IAAMG,EAAc,CAChB,wBAEJxiB,IAAIyiB,EAAc,CAAA,EAGlB,IAAKziB,IAAIkY,KADKpZ,SAASyW,MAEnBiN,EAAYpW,QAAQ,SAASsW,GACrBxK,EAAKvX,UAAUkZ,SAAS6I,CAAS,IACjCD,EAAc,CAAA,EAEtB,CAAC,EAGL,OAAOA,CACX,CAMA,SAAS5J,uBAAuBX,GAC5B,OAA8E,MAA1EpZ,SAAS+C,cAAc,4CAA8C,GAGrEqW,EAAAA,CAAAA,GAAQA,CAAAA,EAAK5J,QAA2E,CAAC,IAAlE4J,EAAK5J,OAAOvD,SAAS,EAAEzH,QAAQ,4BAA4B,EAK1F,CAKA,SAASyV,kBACL/Y,IAAIohB,EAAoB9U,kBAAkBiE,iBAAiB,EACvD8Q,EAAsB7Q,oBAAoBD,iBAAiB,EAC3DuI,EAAe,CAAC,GAAGsI,EAAmB,GAAGC,CAAmB,EAChEvI,EAAe/S,KAAKC,UAAU8S,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS5B,sCACL,IAAMyL,EAAqBnS,oBAAoBf,IAAI,4BAA4B,EAGrD,CAAA,IAAtBkT,GAA+B7jB,SAASqH,SAASC,OAASuc,GAC1DnS,oBAAoBjE,IAAI,qBAAsBoW,EAAoB,CAAA,CAAK,EAI3EnS,oBAAoBjE,IAAI,6BAA8BzN,SAASqH,SAASC,KAAM,CAAA,CAAK,CACvF,CA7F4B,YAAxBtH,SAASkjB,WACTI,2BAA2B,EAE3BrP,2BAA2BjU,SAAU,mBAAoBsjB,0BAA0B,EA8FvFpiB,IAAI6gB,eAAiB,CAGjBC,OAAQ,CAAA,EACR8B,QAAS,CAAA,EACTC,OAAQ,CAAA,EACRC,QAAS,CAAA,EAGTC,KAAM,SAAUzU,GACZ,IAEQtM,EAFDzD,KAAKuiB,SACRviB,KAAKqkB,QAAU,CAAA,EACX5gB,EAAW,SAAU0S,EAAQhS,EAAMoE,EAAQgI,GAC3C+R,eAAe+B,QAAU,CAAA,EACzB/B,eAAeC,OAASpM,EACxB5V,SAASwS,cACL,IAAIJ,YAAa,8BAA+B,CAC5CC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAO6R,qBACRA,qBAEA3U,uBAFsB,CAACC,OAAUA,CAAM,EAAG,CAACtM,SAAYA,EAAUuM,QAAW,CAAA,CAAI,CAAE,EAK9F,EAEAxF,KAAM,WAEc,SAAZka,IACAjjB,IAAIkjB,EAAS,GAEb,IAAM,MAAMza,KAAOlK,KAAK4kB,OACpBD,GAAUza,EAAM,IAAMlK,KAAK4kB,OAAO1a,GAAO,IAE7C,OAAOya,CACX,CAPAljB,IAQIojB,EAAa,CACbD,OAAQ,CACJE,UAAW,aACXC,SAAY,QACZC,IAAO,IACPC,KAAQ,IACRC,MAAS,OACTC,OAAU,OACVC,WAAc,kBACdnjB,QAAW,OACXojB,kBAAmB,SACnBC,cAAe,QACnB,EACA9Y,SAAUkY,CACd,EACIa,EAAW,CACXX,OAAQ,CACJG,SAAY,WACZS,QAAW,OACXJ,WAAc,OACdK,OAAU,6BACVC,gBAAiB,MACjBC,aAAc,qCAClB,EACAnZ,SAAUkY,CACd,EACIkB,EAAW,CACXhB,OAAQ,CACJG,SAAY,WACZK,WAAc,OACdF,MAAS,OACTC,OAAU,OACVM,OAAU,6BACVC,gBAAiB,OACjBra,OAAU,UACV2Z,IAAO,OACPa,MAAS,OACTC,aAAc,aAClB,EACAtZ,SAAUkY,CACd,EACIqB,EAAiB,CACjBnB,OAAQ,CACJjf,QAAW,KACX1D,QAAW,QACX8iB,SAAY,WACZK,WAAc,OACdM,gBAAiB,MACjBR,MAAS,MACTC,OAAU,OACVH,IAAO,MACPC,KAAQ,MACRe,UAAa,eACjB,EACAxZ,SAAUkY,CACd,EACIuB,EAAgB,CAChBrB,OAAQ,CACJjf,QAAW,KACX1D,QAAW,QACX8iB,SAAY,WACZK,WAAc,OACdM,gBAAiB,MACjBR,MAAS,MACTC,OAAU,OACVH,IAAO,MACPC,KAAQ,MACRe,UAAa,gBACjB,EACAxZ,SAAUkY,CACd,EACIwB,EAAU,CACVtB,OAAQ,CACJuB,SAAY,QAChB,EACA3Z,SAAUkY,CACd,EACI0B,EAAsB7lB,SAASoE,cAAe,OAAQ,EAUtD0hB,GATJD,EAAoBhb,aAAc,KAAM,wBAAyB,EACjEgb,EAAoB1J,UAAY,+BAAiCwJ,EAAU,IAC3EE,EAAoB1J,WAAa,4BAA8BmI,EAAa,IAC5EuB,EAAoB1J,WAAa,0BAA4BkJ,EAAW,IACxEQ,EAAoB1J,WAAa,iCAAmCqJ,EAAiB,IACrFK,EAAoB1J,WAAa,gCAAkCuJ,EAAgB,IACnF1lB,SAASuJ,KAAKlE,OAAQwgB,CAAoB,EAG5B7lB,SAASoE,cAAe,KAAM,GAMxC2hB,GALJD,EAAQjb,aAAc,KAAM,yBAA0B,EACtD7K,SAASuJ,KAAKlE,OAAQygB,CAAQ,EAE9B9lB,SAASuJ,KAAK1H,UAAUC,IAAK,wBAAyB,EAE1C9B,SAASoE,cAAe,KAAM,GAKtC4hB,GAJJD,EAAMlb,aAAc,KAAM,uBAAwB,EAClDkb,EAAMlb,aAAc,QAASma,CAAS,EACtCc,EAAQzgB,OAAQ0gB,CAAM,EAEV/lB,SAASoE,cAAe,KAAM,GAItCgB,GAHJ4gB,EAAMnb,aAAc,KAAM,uBAAwB,EAClDkb,EAAM1gB,OAAQ2gB,CAAM,EAENhmB,SAASoE,cAAe,KAAM,GACvC3E,KAAKuiB,QACAiE,EAAW,uBACW,WACJC,KAAKzmB,KAAKuiB,MAAM,EACpC5c,EAAQ+W,UAAY1c,KAAKuiB,OAEzB5c,EAAQ+W,UAAY1c,KAAKuiB,OAAOjhB,QAAQklB,EAAU,qCAAqC,IAG3F7gB,EAAQ+W,UAAY,aAEpB1c,KAAKwkB,KAAM,sBAAuB,GAEtC7e,EAAQyF,aAAc,KAAM,yBAA0B,EACtDkb,EAAM1gB,OAAQD,CAAQ,EAEtB3F,KAAKskB,OAAS,CAAA,CAClB,EAEAiC,MAAO,WACHhmB,SAASuJ,KAAK1H,UAAUI,OAAQ,wBAAyB,EACzDjC,SAASkW,eAAgB,yBAA0B,EAAEjU,OAAO,EAC5DjC,SAASkW,eAAgB,wBAAyB,EAAEjU,OAAO,EAC3DjC,SAASwS,cACL,IAAIJ,YAAa,uBAAwB,CACrCC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EAiBA,SAAS8T,oBACL,IAAKjlB,IAAIC,EAAI,EAAGA,EAAInB,SAASyW,MAAMrV,OAAQD,CAAC,GACxC,GAAkD0O,KAAAA,IAA9C7P,SAASyW,MAAMtV,GAAGilB,yBAC4BvW,KAAAA,IAA9C7P,SAASyW,MAAMtV,GAAGklB,wBAAuC,CAEzD,IAoCcC,EApCRC,EAAcvmB,SAASyW,MAAMtV,GAGnC,GAAKqlB,CAAAA,gBAAgBD,CAAW,EAKhC,GAAKE,iBAAiBF,CAAW,EAC7BG,yBAAyBH,EAAaplB,EAAGnB,QAAQ,OAG9C,GAEmC6P,KAAAA,IAAtC0W,EAAYxJ,QAAQ4J,eACW,UAA9B,OAAOJ,EAAkB,QAAyE,CAAC,IAAxDA,EAAY/W,OAAOhL,QAAQ,sBAAsB,EAE7FoiB,qCAAqCL,EAAaplB,EAAGnB,QAAQ,OAG1D,GAC2B,UAA9B,OAAOumB,EAAkB,SACmB,CAAC,IAA3CA,EAAY/W,OAAOhL,QAAQ,SAAS,GACK,CAAC,IAA5C+hB,EAAY/W,OAAOhL,QAAQ,UAAU,GACvC,CACEtD,IAAI2lB,EAAMN,EAAY/W,OAAOoJ,MAAM,IAAI,GACvCiO,EAAMA,EAAI,GAAGjO,MAAM,GAAG,GACL,GAAGlU,YAAY,IAEnB2C,SAASyf,SAASpiB,YAAY,KACjCqiB,EAAW/mB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChBkjB,EAAStjB,MAAQ8iB,EAAY/W,OAC7BuX,EAASlQ,KAAO,SAChB0P,EAAYS,YAAYD,CAAQ,GAE1BT,EAAWtmB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChByiB,EAAS7iB,MAAQ8iB,EAAY7d,OAC7B4d,EAASzP,KAAO,SAEhB0P,EAAY7d,OAAS,OAErB6d,EAAYS,YAAYV,CAAQ,EAEhCC,EAAY/W,OAASxP,SAASqH,SAEtC,CACJ,CAGJ4f,oBAAoB,EAEpBzQ,uBAAuB,CAC3B,CAOA,SAASgQ,gBAAgBD,GAqBrBrlB,IAAI0U,EAAS,CAAA,EAEb,IAEQ2Q,EAAYzhB,eACiC,EAA7CyhB,EAAYzhB,cAAcjD,UAAUT,QACyB,CAAC,IAA9DmlB,EAAYzhB,cAAcjD,UAAU,GAAG2C,QAAQ,QAAQ,IACvDoR,EAAS,CAAA,GA3BM,CACnB,YACA,UACA,2BACA,WA0BetI,QAAQ,SAAS4Z,GAC5B,IAAMnG,EAASwF,EAAYhjB,aAAa,IAAI,EACvCwd,MAAAA,GAAsF,CAAC,IAAjCA,EAAOvc,QAAQ0iB,CAAW,IACjFtR,EAAS,CAAA,EAEjB,CAAC,EAxBqB,CACtB,cACA,UACA,uBACA,kBACA,iBACA,WAoBkBtI,QAAQ,SAAS6Z,GAC/BjmB,IAAIkmB,EAAa,GAMjB,IAAMC,EAJFD,EADAb,EAAYhjB,aAAa,OAAO,EACnBgjB,EAAYhjB,aAAa,OAAO,EAEhC+jB,kBAAkBf,EAAaY,CAAc,EAGzDE,MAAAA,GAAgG,CAAC,IAAvCA,EAAU7iB,QAAQ2iB,CAAc,IAC3FvR,EAAS,CAAA,EAEjB,CAAC,EAzCoB,CACrB,UA0CiBtI,QAAQ,SAASia,GAC9B,IAAMC,EAAWjB,EAAYhjB,aAAa,IAAI,EACzCikB,MAAAA,GAA2F,CAAC,IAArCA,EAAShjB,QAAQ+iB,CAAa,IACtF3R,EAAS,CAAA,EAEjB,CAAC,CAGL,CAFE,MAAO3G,GACLrF,QAAQ6d,MAAM,oCAAqCxY,CAAC,CACxD,CAEA,OAAO2G,CACX,CAQA,SAAS0R,kBAAkBf,EAAaY,GACpC,GAA2B,UAAvB,OAAM,GAA6BZ,EAAYxjB,cAAc,IAAMokB,CAAc,EACjF,OAAOA,CAEf,CAKA,SAASF,sBACL,IAAMS,EAAS1nB,SAAS2nB,qBAAqB,QAAQ,EAErD,GAAqB,EAAhBD,EAAOtmB,OACR,IAAMF,IAAI8hB,EAAI,EAAGA,EAAI0E,EAAOtmB,OAAQ4hB,CAAC,GACjC,GAAkC,MAA7B0E,EAAO1E,GAAG4E,gBAAf,CAIA,IAAMC,EAAcH,EAAO1E,GAAG4E,gBAAgBnR,MAC9C,GAA4B,IAAvBoR,EAAYzmB,OAIjB,IAAMF,IAAI4mB,EAAI,EAAGA,EAAID,EAAYzmB,OAAQ0mB,CAAC,GAAK,CAC3C,IAAMvB,EAAcsB,EAAYC,GAC3BtB,gBAAgBD,CAAW,GAGhCG,yBAAyBH,EAAauB,EAAGJ,EAAO1E,GAAG4E,eAAe,CACtE,CAbA,CAgBZ,CAQA,SAASlB,yBAAyBH,EAAawB,EAAUC,GACrD,IAAMC,EAAuBjoB,SAASoE,cAAc,GAAG,EAOjD8jB,GANND,EAAqBlmB,UAAY,wBACjCkmB,EAAqBxnB,MAAQ,gBAE7B8lB,EAAYzhB,cAAcqjB,aAAaF,EAAsB1B,CAAW,EAG3DA,EAAY6B,iBACnBC,EAAW9B,EAAYtD,UACvBqF,EAAe/B,EAMfgC,GAHNhC,EAAYzhB,cAAc0U,YAAY+M,CAAW,EAG7BvmB,SAASoE,cAAc,KAAK,GAI1CokB,GAHND,EAAYpM,UAAYkM,EACxBH,EAAK/iB,MAAMojB,EAAYE,iBAAiB,EAEpBzoB,SAASoE,cAAc,OAAO,GAClDokB,EAAY3kB,KAAO,SACnB2kB,EAAY/kB,MAAQ,6BACpB+kB,EAAY3R,KAAO,SAEnB,MAAM6R,EAAmBV,EAAevR,MAAMsR,GAE9CW,EAAiB1B,YAAYwB,CAAW,EACxCE,EAAiBC,UAAYT,EAC7BQ,EAAiBE,kBAAoBN,EAGrCpnB,IAAI2nB,EAA0B,CAAA,EACKhZ,KAAAA,IAA/B6Y,EAAiB7mB,WAES,CAAC,iBAAkB,iBAC3ByL,QAAQ,SAASwb,GAC3BJ,EAAiB7mB,UAAUkZ,SAAS+N,CAAe,IACnDD,EAA0BC,EAElC,CAAC,EAEAD,EAG+BhZ,KAAAA,KAF1BkZ,EAAyBf,EAAejlB,cAAc,QAAU8lB,CAAuB,EACxF9lB,cAAc,uBAAuB,IAEtCgmB,EAAuBpmB,iBAAiB,QAAS,SAASpD,GACtDA,EAAM+b,eAAe,EACrB0N,yBAAyBN,CAAgB,CAC7C,CAAC,EAGLV,EAAevR,MAAMsR,GAAUnO,SAAW,SAASra,GAC/CA,EAAM+b,eAAe,EACrB0N,yBAAyBzpB,EAAM0pB,aAAa,CAChD,CAER,CAQA,SAASrC,qCAAqCL,EAAawB,EAAUC,GACjE,IAOMnjB,EAWA2jB,EAKAE,EAvBAQ,EAAuB3C,EAAYxjB,cAAc,iBAAiB,EAClEomB,EAAmB5C,EAAYxjB,cAAc,iBAAiB,EAAEqW,KAAKQ,SAEpEsP,IAIDrkB,EAASqkB,EAAqBpkB,cAC9BskB,EAAmBF,EAAqBjG,UAG9CiG,EAAqBjnB,OAAO,GAGtBsmB,EAAcvoB,SAASoE,cAAc,KAAK,GACpC+X,UAAYiN,EACxBvkB,EAAOmiB,YAAYuB,EAAYE,iBAAiB,GAE1CD,EAAcxoB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnB2kB,EAAY/kB,MAAQ,6BACpB+kB,EAAY3R,KAAO,UAEb6R,EAAmBV,EAAevR,MAAMsR,IAE7Bf,YAAYwB,CAAW,EACxCE,EAAiBW,YAAcxkB,EAC/B6jB,EAAiBQ,qBAAuBA,EACxCR,EAAiBS,iBAAmBA,EAEpCnB,EAAevR,MAAMsR,GAAUnO,SAAW,SAASra,GAC/CA,EAAM+b,eAAe,EACrB0N,yBAAyBzpB,EAAM0pB,aAAa,CAChD,EACJ,CAOA,SAASK,sCAAsCC,EAAYC,GACjDC,EAAeF,EAAWtpB,iBAAiB,iCAAiC,EAClF,MAAMypB,EAAeF,EAAWvpB,iBAAiB,iCAAiC,EAElFwpB,EAAanc,QAAQ,IACjBoc,EAAapc,QAAQ,IACbqc,EAAW1G,YAAc2G,EAAW3G,YACZ,aAApB2G,EAAW/S,MAA2C,UAApB+S,EAAW/S,KAC7C+S,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWnmB,MAAQqmB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,CACL,CAmBA,SAASI,yBACL7oB,IAAI8oB,EAAUhqB,SAASC,iBAAiB,QAAQ,EAC3B,EAAjB+pB,EAAQ5oB,QACR4oB,EAAQ1c,QAAQ,SAAS2c,GACjBA,EAA4C,CAAC,IAA7CA,EAAOC,IAAI1lB,QAAQ,mBAAmB,GACS,CAAC,IAAhDylB,EAAOC,IAAI1lB,QAAQ,sBAAsB,GACU,CAAC,IAApDylB,EAAOC,IAAI1lB,QAAQ,0BAA0B,GAC7CylB,EAAOpoB,UAAUkZ,SAAS,gBAAgB,GACD,CAAC,IAAxCkP,EAAOC,IAAI1lB,QAAQ,cAAc,GAA2D,CAAC,IAAhDylB,EAAOC,IAAI1lB,QAAQ,sBAAsB,IAGpF,CAAA,IAAUgJ,kBAAkBmD,IAAI,yBAAyB,GACC,EAA1DnD,kBAAkBmD,IAAI,yBAAyB,EAAEvP,QAC5B,KAAA,IAAd6oB,EAAOnH,IAC0D,CAAC,IAAzEtV,kBAAkBmD,IAAI,yBAAyB,EAAEnM,QAAQylB,EAAOnH,KAIpEqH,8BAA8BF,CAAM,CAE5C,CAAC,CAET,CAjWAjqB,SAAS2C,iBAAiB,QAAS,SAAUsM,GACpCA,CAAAA,EAAEnM,QAA2B,4BAAhBmM,EAAEnM,OAAOggB,IAAoD,0BAAhB7T,EAAEnM,OAAOggB,IACpEf,eAAeiE,MAAM,CAE7B,CAAC,EACDhmB,SAAS2C,iBAAiB,8BAA+B,SAAUsM,GAC1D8S,eAAegC,QAAUhC,eAAeC,SACzChiB,SAASkW,eAAgB,yBAA0B,EAAEiG,UAAY4F,eAAeC,OAExF,CAAC,EAiTDxU,kBAAkBC,IAAI,0BAA2B,EAAE,EACnD7H,OAAOyE,OAAS,WACL,CAACuD,SAASwc,iCAIjBtkB,WAAW,WACPqgB,kBAAkB,EAClBkE,yBAAyB,EACzBC,4BAA4B,EAC5BP,uBAAuB,CAC3B,EAAG,GAAI,CACX,EA6BA7oB,IAAIqpB,4BAKJ,SAASJ,8BAA8BF,GACnC/oB,IAAIspB,EAAQxqB,SAASoE,cAAc,KAAK,EACxComB,EAAM/pB,MAAMkkB,MAAQ,OACpB6F,EAAM/pB,MAAMmkB,OAAS,OACrB4F,EAAM/pB,MAAMokB,WAAa,QACzB2F,EAAM/pB,MAAM+E,QAAU,EACtBglB,EAAM/pB,MAAM+jB,SAAW,WACvBgG,EAAM/pB,MAAMgkB,IAAM,EAClB+F,EAAMC,QAAU,SAASxb,GACrB,GAAoCY,KAAAA,IAAhC0a,4BAA2C,CAC3CrpB,IAAIwpB,EAAazb,EAAEga,cAEf0B,GADJD,EAAWjqB,MAAM+E,QAAU,GACXxF,SAASoE,cAAc,KAAK,GAC5CumB,EAAU5oB,UAAY,yBACtB2oB,EAAW1D,YAAY2D,CAAS,EAChCzpB,IAAI0pB,EAAmB,GACnB5qB,SAAS+C,cAAc,uCAAuC,IAC9D6nB,EAAmB5qB,SAAS+C,cAAc,uCAAuC,EAAEU,OASvF8L,sBANW,CACPC,OAAU,sCACVqb,0BAA6B5Q,gBAAgB,EAC7C6Q,4BAA+BF,CACnC,EAII,CACIjiB,MAAO,CAAA,EACPzF,SAAU,SAAS0S,GAEc,EAD7B2U,4BAA8B,CAAA,KAC1B3U,EAAO7N,MAAM+Z,QACb9hB,SAASC,iBAAiB,4BAA4B,EAAEqN,QAAQ,SAASyd,GACrEA,EAAG1P,WAAWpZ,OAAO,CACzB,CAAC,GAEDjC,SAASC,iBAAiB,4BAA4B,EAAEqN,QAAQ,IAC5Dyd,EAAG1P,WAAW5a,MAAM6b,MAAQ,QAC5ByO,EAAG1P,WAAWc,WAAavG,EAAO7N,MAAMkW,OAC5C,CAAC,EACDje,SAASC,iBAAiB,4BAA4B,EAAEqN,QAAQ,IAC5Dyd,EAAG9oB,OAAO,CACd,CAAC,EAET,CACJ,CACJ,CACJ,CACJ,EACAgoB,EAAO5O,WAAW5a,MAAM+jB,SAAW,WACnCyF,EAAO5O,WAAW2L,YAAYwD,CAAK,EACnCtpB,IAAI8oB,EAAUxc,kBAAkBmD,IAAI,yBAAyB,EACzD,CAAA,IAAUqZ,IACVA,EAAU,IAEW,KAAA,IAAdC,EAAOnH,KACdkH,EAAQ3pB,KAAK4pB,EAAOnH,EAAE,EACtBtV,kBAAkBC,IAAI,0BAA2Buc,CAAO,EAEhE,CAKA,SAASM,8BACLppB,IAAI8pB,EAAWhrB,SAASkW,eAAe,4BAA4B,EAC/D8U,GACAC,2BAA2BD,CAAQ,CAE3C,CAMA,SAASC,2BAA2BD,GAChC9pB,IAAIgqB,EAAgBF,EAAS/qB,iBAAiB,0BAA0B,EACpEkrB,EAAeH,EAAS/qB,iBAAiB,kCAAkC,EAC/EirB,EAAc5d,QAAQ,IAClByd,EAAGlgB,aAAa,2BAA4B,MAAM,EAClDkgB,EAAGpoB,iBAAiB,QAAS,IACzBpD,EAAM+b,eAAe,CACzB,CAAC,CACL,CAAC,EACD6P,EAAa7d,QAAQ,IACjByd,EAAGpoB,iBAAiB,QAAS,IACzBpD,EAAM+b,eAAe,EACrB/b,EAAMyD,gBAAgB,EACtBooB,YAAYL,CAAE,CAClB,CAAC,CACL,CAAC,CACL,CAMA,SAASM,4BAA4BC,GACjCA,EAASxmB,cAAc+F,aAAa,2BAA4B,OAAO,EACvEygB,EAASxmB,cAAckZ,MAAM,CACjC,CAOA,SAASuN,gCAAgCD,EAAUrlB,GAC/C/E,IAKQsqB,EALJ1mB,EAAgBwmB,EAASxmB,cACiC,SAA1DA,EAAcvB,aAAa,0BAA0B,GACrDuB,EAAc+F,aAAa,2BAA4B,MAAM,EAE5D7K,SAAS+C,cAAc,mBAAmB,KACvCyoB,EAAaxrB,SAASoE,cAAc,KAAK,GAClCrC,UAAY,mBACvBypB,EAAW/qB,MAAMokB,WAAa,MAC9B2G,EAAW/qB,MAAM6b,MAAQ,QACzBkP,EAAW/qB,MAAMwkB,QAAU,MAC3BuG,EAAWrP,UAAYlW,EACvBnB,EAAc2mB,sBAAsB,cAAeD,CAAU,EAErE,CAMA,SAASJ,YAAY9qB,GAMjBiP,sBALW,CACPC,OAAU,2BACVqb,0BAA6B7qB,SAAS0rB,kBAAkB,2BAA2B,EAAE,GAAGjoB,KAC5F,EAII,CACIkF,MAAO,CAAA,EACPzF,SAAU,SAAS0S,GACc,CAAA,IAAzBA,EAAO7N,MAAM+Z,QACbuJ,4BAA4B/qB,CAAI,EAEhCirB,gCAAgCjrB,EAAMsV,EAAO7N,MAAMkW,OAAO,CAElE,CACJ,CACJ,CACJ,CAOA,SAASwI,iBAAiBkF,GACtB,IAAMC,EAAuC,UAA1B,OAAOD,EAAc,OAAgBA,EAAQnc,OAAS,GACnEuR,EAAwC,OAA/B4K,EAAQpoB,aAAa,IAAI,EAAaooB,EAAQpoB,aAAa,IAAI,EAAI,GAElF,MACIqoB,CAAAA,EAA2C,CAAC,IAA5CA,EAAWpnB,QAAQ,kBAAkB,GACQ,CAAC,IAA9ConB,EAAWpnB,QAAQ,oBAAoB,GACJqL,KAAAA,IAAjC8b,EAAQE,WAAWhqB,WACrB8pB,EAAQE,WAAWhqB,UAAUkZ,SAAS,eAAe,GACZ,CAAC,IAA1C6Q,EAAWpnB,QAAQ,gBAAgB,GACQ,CAAC,IAA5ConB,EAAWpnB,QAAQ,kBAAkB,GACA,CAAC,IAAtConB,EAAWpnB,QAAQ,YAAY,GACY,CAAC,IAA5ConB,EAAWpnB,QAAQ,kBAAkB,GACQ,CAAC,IAA9ConB,EAAWpnB,QAAQ,oBAAoB,GACJ,CAAC,IAApConB,EAAWpnB,QAAQ,UAAU,GACU,CAAC,IAAxConB,EAAWpnB,QAAQ,cAAc,GACE,CAAC,IAApConB,EAAWpnB,QAAQ,UAAU,GACS,CAAC,IAAvConB,EAAWpnB,QAAQ,aAAa,GACM,CAAC,IAAvConB,EAAWpnB,QAAQ,aAAa,GACK,CAAC,IAAtConB,EAAWpnB,QAAQ,YAAY,GACW,CAAC,IAA3ConB,EAAWpnB,QAAQ,iBAAiB,GACH,CAAC,IAAlConB,EAAWpnB,QAAQ,QAAQ,GAA8C,CAAC,IAAnCuc,EAAOvc,QAAQ,aAAa,GACpB,CAAC,IAAhDuc,EAAOvc,QAAQ,0BAA0B,GACF,CAAC,IAAxConB,EAAWpnB,QAAQ,cAAc,GACW,CAAC,IAA7Cuc,EAAOvc,QAAQ,uBAAuB,GACtCmnB,EAAQxZ,aAAa,kBAAkB,EAM/C,CAQA,SAAS6W,yBAAyB5P,GAE9B,IAAMG,EAAgB,GACtBA,EAAc,GAAKE,6BAA6BL,CAAI,EACpDU,gCAAiCP,CAAc,EAE/C,MAAM3V,EAAO,CACTknB,4BAA+Btd,kBAAkBmD,IAAI,0BAA0B,CACnF,EACImb,EAAQ1S,EAAKha,UAGjB0sB,EAFQlsB,MAAMC,UAAUC,MAAMC,KAAK+rB,CAAK,GAElCxe,QAAS,SAAUhN,EAAMwnB,GACR,KAAdxnB,EAAKuD,KACND,EAAK,SAAWkkB,GAAKxnB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAED8L,sBACI3L,EACA,CACI+E,MAAO,CAAA,EACPzF,SAAU,SAAU0S,EAAQhS,EAAMoE,EAAQgI,GACtC,GAAsBH,KAAAA,IAAjB+F,EAAO7N,OAAuB,CAAE,CAAC6N,EAAO7N,MAAM+Z,QAAU,CAEzD,GAAoCjS,KAAAA,IAA/BuJ,EAAK2D,QAAQ4J,cAA8B,CAC5CzlB,IAAI6qB,EAAe3S,EAAKrW,cAAc,iBAAiB,EAMvD,OALAgpB,EAAa9pB,OAAO,EACLmX,EAAKiQ,YACbrC,YAAY5N,EAAK8P,oBAAoB,EAA5CrkB,KACAknB,EAAe3S,EAAKrW,cAAc,iBAAiB,GACtCib,MAAM,CAEvB,CAGA,GAAI5E,EAAKjH,aAAa,QAAQ,GACuC,CAAC,IAAjEiH,EAAK7V,aAAa,QAAQ,EAAEiB,QAAQ,sBAAsB,EAC7D,CACEtD,IAAI6qB,EAAe3S,EAAKrW,cAAc,iBAAiB,EAOvD,OANAgpB,EAAa9pB,OAAO,EACLmX,EAAKiQ,YACbrC,YAAY5N,EAAK8P,oBAAoB,EAC5C9P,EAAKQ,SAAWR,EAAK+P,iBADrBtkB,KAEAknB,EAAe3S,EAAKrW,cAAc,iBAAiB,GACtCib,MAAM,CAEvB,CAEA,IAAMgO,EAAU5S,EAEV8O,GADN9O,EAAKtU,cAAc0U,YAAYJ,CAAI,EACtBA,EAAKuP,WACZL,EAAelP,EAAKwP,kBAC1B1nB,IAAI+qB,EAAoB,CAAA,EAExB3C,sCAAsC0C,EAAS1D,CAAY,EAGjB,CAAC,IAAvCA,EAAaxF,GAAGte,QAAQ,QAAQ,IAChCynB,EAAoB,CAAA,GAGxB/D,EAAK/iB,MAAOmjB,CAAa,EAGzB,IAAK,MAAMyC,KAAMzC,EAAaroB,iBAAiB,oCAAoC,EAC/E8qB,EAAG9oB,OAAO,EAGd,IAAK,MAAM8oB,KAAMzC,EAAaroB,iBAAiB,2CAA2C,EACtF8qB,EAAG9oB,OAAO,EAIdf,IAAIgrB,EAAa5D,EAAaroB,iBAAiB,qBAAqB,EACpE,GAA2B,IAAtBisB,EAAW9qB,OAOZ,OANA8qB,EAAW,GAAGlO,MAAM,EAApBkO,KACID,GACAnmB,WAAW,WACPqgB,kBAAkB,CACtB,EAAG,IAAI,GAMf,GAA2B,KAD3B+F,EAAa5D,EAAaroB,iBAAiB,oBAAoB,GAC/CmB,OAEZ,OADA8qB,KAAAA,EAAW,GAAGlO,MAAM,EAMxB,GAA2B,KAD3BkO,EAAa5D,EAAaroB,iBAAiB,+BAA+B,GAC1DmB,OAEZ,OADA8qB,KAAAA,EAAW,GAAGlO,MAAM,EAMG,KAD3BkO,EAAa5D,EAAaroB,iBAAiB,oCAAoC,GAC/DmB,QACZ8qB,EAAW,GAAGlO,MAAM,CAE5B,CACqBnO,KAAAA,IAAjB+F,EAAO7N,OAAuB,CAAC6N,EAAO7N,MAAM+Z,SAC5CnK,oBAAoB/B,CAAM,CAElC,CACJ,CAAC,CACT,CAKA,SAASyU,2BAGL8B,gCAFcnsB,SAAS2nB,qBAAqB,MAAM,CAEb,EAFrC,IAIMD,EAAS1nB,SAAS2nB,qBAAqB,QAAQ,EACrD,GAAqB,EAAhBD,EAAOtmB,OACR,IAAMF,IAAI8hB,EAAI,EAAGA,EAAI0E,EAAOtmB,OAAQ4hB,CAAC,GACjC,GAAkC,MAA7B0E,EAAO1E,GAAG4E,gBAAf,CAIA,IAAMC,EAAcH,EAAO1E,GAAG4E,gBAAgBnR,MAE9C,GAA4B,IAAvBoR,EAAYzmB,OACb,OAGJ+qB,gCAAgCtE,EAAaH,EAAO1E,GAAG4E,eAAe,CARtE,CAWZ,CAOA,SAASuE,gCAAgC1V,EAAOuR,EAAiBhoB,UAC7D,IAAMosB,EAAgB,GACtB,IAAK,MAAMhT,KAAQ3C,EACmB,CAAC,IAA/B2C,EAAK0J,GAAGte,QAAQ,QAAQ,GACxB4nB,EAAc/rB,KAAK+Y,EAAK0J,EAAE,EAEQ,CAAC,IAAnC1J,EAAK0J,GAAGte,QAAQ,YAAY,GACZqL,KAAAA,IAAnBuJ,EAAKvX,WAA2BuX,EAAKvX,UAAUkZ,SAAS,sBAAsB,GAE3EqR,EAAc/rB,KAAK+Y,EAAK0J,EAAE,EAIlC,IAAK,MAAM/B,KAAUqL,EAAe,CAChC,IAAMhT,EAAO4O,EAAe9R,eAAe6K,CAAM,EACjD3H,EAAKiT,6BAA+BjT,EAAKQ,SACzCR,EAAKQ,SAAW0S,+BACpB,CACJ,CAMA,SAASA,gCAAgClT,GACrCA,EAAKkC,eAAe,EACpBlC,EAAKmT,yBAAyB,EAC9B,MAAMC,EAAYpT,EAClBA,EAAOA,EAAKtW,OAEZ,IAAM0lB,EAAcxoB,SAASoE,cAAc,OAAO,EAO5CmV,GANNiP,EAAY3kB,KAAO,SACnB2kB,EAAY/kB,MAAQ,6BACpB+kB,EAAY3R,KAAO,SACnBuC,EAAK4N,YAAYwB,CAAW,EAGN,IACtBjP,EAAc,GAAKE,6BAA6BL,CAAI,EACpDU,gCAAgCP,CAAa,EAC7CH,EAAK/T,OAAOgd,+BAA+B,QAAQ,CAAC,EAEpD,MAAMze,EAAO,GACTkoB,EAAQ1S,EAAKha,UAGjB0sB,EAFQlsB,MAAMC,UAAUC,MAAMC,KAAK+rB,CAAK,GAElCxe,QAAS,SAAUhN,EAAMwnB,GACR,KAAdxnB,EAAKuD,KACND,EAAK,SAAWkkB,GAAKxnB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAED8L,sBACI3L,EACA,CACI+E,MAAO,CAAA,EACPzF,SAAU,SAAS0S,GACf,GAAsB/F,KAAAA,IAAjB+F,EAAO7N,OAAuB,CAAE,CAAC6N,EAAO7N,MAAM+Z,QAAU,CACzD1I,EAAKQ,SAAW,KAGhB,IAAK,MAAMmR,KAAM3R,EAAKnZ,iBAAiB,oCAAoC,EACvE8qB,EAAG9oB,OAAO,EAEd,IAAK,MAAM8oB,KAAM3R,EAAKnZ,iBAAiB,2CAA2C,EAC9E8qB,EAAG9oB,OAAO,EAEd,IAAK,MAAM8oB,KAAM3R,EAAKnZ,iBAAiB,yCAAyC,EAC5E8qB,EAAG9oB,OAAO,EAIVmX,EAAKiT,wCAAwClS,WACzCsS,EAAU3mB,WAAW,WACrBsT,EAAKiT,6BAA6BtsB,KAAKqZ,EAAMoT,CAAS,CAC1D,EAAG,GAAG,EACNE,aAAaD,CAAO,GAJxB,IAOMP,EAAa9S,EAAKrW,cAAc,sBAAsB,EAC5D,GAAImpB,EAEA,OADAA,KAAAA,EAAWlO,MAAM,CAGzB,CAEqBnO,KAAAA,IAAjB+F,EAAO7N,OAAuB,CAAC6N,EAAO7N,MAAM+Z,SAC5CnK,oBAAoB/B,CAAM,CAElC,CACJ,CAAC,CACT,CAOA,SAASkU,SAASiB,GACd,OAAIA,EAAG4B,SAAW5B,EAAG6B,SACV7B,EAAG4B,QACL5oB,OAAO,GAAY8oB,EAAOC,QAAQ,EAClCC,IAAI,GAAYF,EAAOppB,KAAK,EACd,aAAZsnB,EAAGlU,MAAmC,UAAZkU,EAAGlU,KAC7BkU,EAAGlB,SAAuB,KAE1BkB,EAAGtnB,KAElB,CAMA,SAASupB,gBAAgBC,GAErB,IAAMC,EAAS,GACTpB,EAAQmB,EAAS7tB,SACvB8B,IAAIyI,EAEJ,IAAKA,KAAOmiB,EACgB,WAApBA,EAAMniB,GAAKkN,MACUhH,KAAAA,IAArBic,EAAMniB,GAAKlG,OACU,KAArBqoB,EAAMniB,GAAKlG,QACXypB,EAAOpB,EAAMniB,GAAK9F,MAAQopB,EAAS7tB,SAASuK,GAAKlG,OAGzDypB,EAAO1d,OAAS,oBAGhBD,sBACI2d,EACA,CACIhnB,IAAKwG,kBAAkB4D,UACvBpN,SAAU,SAASU,GACf,GAAqB,CAAA,IAAjBA,EAAK0Z,QAIL,OADA6P,MAAMvpB,EAAKA,IAAI,EACR,CAAA,EAHPqpB,EAASG,WAAW,CAK5B,CACJ,CACJ,CACJ,CA4CA,SAASC,8BAA8B7d,GAOnC,MALmC,CAC/B,eACA,wBAG8B8d,KAAK,GACmC,OAA/D9d,EAAOtL,MAAM,IAAI0L,OAAOhC,SAAS2f,UAAY,KAAOhgB,CAAI,CAAC,CACnE,CACL,CApDAvN,SAAS2C,iBAAiB,mBAAoB,WAC1CzB,IAAIssB,EAAe,GACfC,EAAa,GAEV,CAAC7f,SAAS8f,iCAIjB5nB,WAAW,KACP,IAAM5E,IAAIC,EAAI,EAAGA,EAAInB,SAASyW,MAAMrV,OAAQD,CAAC,GAAK,CAC9C,IAQcwsB,EAR2B,UAApC,OAAO3tB,SAASyW,MAAMtV,GAAS,SAChCssB,EAAaztB,SAASyW,MAAMtV,GAGc,QAF1CqsB,EAAeC,EAAWje,QAEThL,QAAQ,WAAW,GACwB,OAAxDgpB,EAAatpB,MAAM0J,SAAS2f,UAAY,SAAU,GAChDF,8BAA8BG,CAAY,IAEtCG,EAAYF,EAAWG,UAAU,CAAA,CAAI,EAC3CH,EAAWpS,WAAWwS,aAAaF,EAAWF,CAAU,EAExDE,EAAUP,WAAaK,EAAW/R,OAClCiS,EAAUjS,OAAS,KAEnBiS,EAAUhrB,iBAAiB,SAAU,SAASpD,GAK1C,OAJAA,EAAM+b,eAAe,EACrB/b,EAAMyD,gBAAgB,EACtBzD,EAAMgtB,yBAAyB,EAC/BS,gBAAgBztB,EAAMuD,MAAM,EACrB,CAAA,CACX,CAAC,GAGb,CACJ,EAAG,GAAG,CACV,CAAC"} ->>>>>>> fix diff --git a/js/apbct-public-bundle_comm-func.min.js b/js/apbct-public-bundle_comm-func.min.js new file mode 100644 index 000000000..855eda556 --- /dev/null +++ b/js/apbct-public-bundle_comm-func.min.js @@ -0,0 +1,2 @@ +function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=s,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),s=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),r=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),h=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==r?r:b,o.apbct_headless=void 0!==d?d:h,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=s,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},s=document.createElement("style"),i=(s.setAttribute("id","cleantalk-modal-styles"),s.innerHTML="body.cleantalk-modal-opened{"+i+"}",s.innerHTML+="#cleantalk-modal-overlay{"+t+"}",s.innerHTML+="#cleantalk-modal-close{"+c+"}",s.innerHTML+="#cleantalk-modal-close:before{"+n+"}",s.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(s),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}document.addEventListener("click",function(e){!e.target||"cleantalk-modal-overlay"!==e.target.id&&"cleantalk-modal-close"!==e.target.id||cleantalkModal.close()}),document.addEventListener("cleantalkModalContentLoaded",function(e){cleantalkModal.opened&&cleantalkModal.loaded&&(document.getElementById("cleantalk-modal-content").innerHTML=cleantalkModal.loaded)}),document.addEventListener("DOMContentLoaded",function(){let r=void 0,d=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(r="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:r)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(r=ctTrpAdminLocalize.theRealPerson,d=!0),r){let e='.apbct-trp *[class*="comment-author"]';document.querySelector(".apbct-trp .comment-author .comment-author-link")&&(e='.apbct-trp *[class*="comment-author-link"]');var t=document.querySelectorAll(e+',.apbct-trp *[class*="review__author"],.apbct-trp td[class*="column-author"] > strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,s,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",r.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(r.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(s=document.createElement("span")).append(r.phrases.trpContent1+" "),s.append(r.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",r.trpContentLink),l.setAttribute("target","_blank"),l.text=r.phrases.trpContentLearnMore,s.append(" "),s.append(l)),i.append(s),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}); +//# sourceMappingURL=apbct-public-bundle_comm-func.min.js.map diff --git a/js/apbct-public-bundle_comm-func.min.js.map b/js/apbct-public-bundle_comm-func.min.js.map new file mode 100644 index 000000000..7fd84ce6b --- /dev/null +++ b/js/apbct-public-bundle_comm-func.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"apbct-public-bundle_comm-func.min.js","sources":["apbct-public-bundle_comm-func.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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, 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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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"],"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","fillDecodedNodes","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","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","smartQuizBuilder","bookingPress","isArray","e","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","Event","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","contains","_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","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_site_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","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"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_ext-protection.min.js b/js/apbct-public-bundle_ext-protection.min.js index 2ea8709ba..f6223d028 100644 --- a/js/apbct-public-bundle_ext-protection.min.js +++ b/js/apbct-public-bundle_ext-protection.min.js @@ -1,2 +1,2 @@ -class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=r,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),r=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),s=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),f=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==s?s:b,o.apbct_headless=void 0!==d?d:f,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=r,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+c+"}",r.innerHTML+="#cleantalk-modal-close:before{"+n+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctProtectExternal(){for(let e=0;e{c.forEach(e=>{t.name===e.name&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})}):o.forEach(t=>{c.forEach(e=>{t.outerHTML===e.outerHTML&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})})}function ctProtectKlaviyoForm(){if(document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')){let t=setInterval(()=>{var e=document.querySelectorAll("form.klaviyo-form");e.length&&(clearInterval(t),e.forEach((e,t)=>{apbctProcessExternalFormKlaviyo(e,t,document)}))},500)}}function apbctProcessExternalFormKlaviyo(t,e,o){var c,n=t.querySelector('button[type="button"].needsclick');n&&(n.disabled=!0,(c=document.createElement("input")).name="action",c.value="cleantalk_force_ajax_check",c.type="hidden",t.appendChild(c),(c=document.createElement("div")).id="apbct-klaviyo-cover",c.style.width="100%",c.style.height="100%",c.style.background="black",c.style.opacity=0,c.style.position="absolute",c.style.top=0,c.style.cursor="pointer",c.onclick=function(e){sendAjaxCheckingFormData(t)},n.parentNode.style.position="relative",n.parentNode.appendChild(c))}function ctProtectOutsideIframe(){var e=document.querySelectorAll("iframe");0 strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,r,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",s.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(s.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(s.phrases.trpContent1+" "),r.append(s.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",s.trpContentLink),l.setAttribute("target","_blank"),l.text=s.phrases.trpContentLearnMore,r.append(" "),r.append(l)),i.append(r),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),apbctLocalStorage.set("apbct_iframes_protected",[]),window.addEventListener("load",function(){+ctPublic.settings__forms__check_external&&(setTimeout(function(){ctProtectExternal(),catchDynamicRenderedForm(),catchNextendSocialLoginForm(),ctProtectOutsideIframe()},2e3),ctProtectKlaviyoForm())});let ctProtectOutsideIframeCheck;function ctProtectOutsideIframeHandler(e){var t=document.createElement("div");t.style.width="100%",t.style.height="100%",t.style.background="black",t.style.opacity=0,t.style.position="absolute",t.style.top=0,t.onclick=function(t){if(void 0===ctProtectOutsideIframeCheck){var t=t.currentTarget,o=(t.style.opacity=.5,document.createElement("div"));o.className="apbct-iframe-preloader",t.appendChild(o);let e="";document.querySelector('[name*="ct_bot_detector_event_token"]')&&(e=document.querySelector('[name*="ct_bot_detector_event_token"]').value),apbct_public_sendAJAX({action:"cleantalk_outside_iframe_ajax_check",ct_no_cookie_hidden_field:getNoCookieData(),ct_bot_detector_event_token:e},{async:!1,callback:function(t){!(ctProtectOutsideIframeCheck=!0)===t.apbct.blocked?document.querySelectorAll("div.apbct-iframe-preloader").forEach(function(e){e.parentNode.remove()}):(document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.parentNode.style.color="white",e.parentNode.innerHTML+=t.apbct.comment}),document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.remove()}))}})}},e.parentNode.style.position="relative",e.parentNode.appendChild(t);let o=apbctLocalStorage.get("apbct_iframes_protected");!1===o&&(o=[]),void 0!==e.id&&(o.push(e.id),apbctLocalStorage.set("apbct_iframes_protected",o))}function catchNextendSocialLoginForm(){var e=document.getElementById("nsl-custom-login-form-main");e&&blockBtnNextendSocialLogin(e)}function blockBtnNextendSocialLogin(e){var t=e.querySelectorAll(".nsl-container-buttons a"),e=e.querySelectorAll('a[data-plugin="nsl"] .nsl-button');t.forEach(e=>{e.setAttribute("data-oauth-login-blocked","true"),e.addEventListener("click",e=>{e.preventDefault()})}),e.forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),ctCheckAjax(t)})})}function allowAjaxNextendSocialLogin(e){e.parentElement.setAttribute("data-oauth-login-blocked","false"),e.parentElement.click()}function forbiddenAjaxNextendSocialLogin(e,t){var o,e=e.parentElement;"false"==e.getAttribute("data-oauth-login-blocked")&&e.setAttribute("data-oauth-login-blocked","true"),document.querySelector(".ct-forbidden-msg")||((o=document.createElement("div")).className="ct-forbidden-msg",o.style.background="red",o.style.color="white",o.style.padding="5px",o.innerHTML=t,e.insertAdjacentElement("beforebegin",o))}function ctCheckAjax(t){apbct_public_sendAJAX({action:"cleantalk_nsl_ajax_check",ct_no_cookie_hidden_field:document.getElementsByName("ct_no_cookie_hidden_field")[0].value},{async:!1,callback:function(e){!1===e.apbct.blocked?allowAjaxNextendSocialLogin(t):forbiddenAjaxNextendSocialLogin(t,e.apbct.comment)}})}function isIntegratedForm(e){var t="string"==typeof e.action?e.action:"",o=null!==e.getAttribute("id")?e.getAttribute("id"):"",c="string"==typeof e.className?e.className:"";return!!(-1!==t.indexOf("app.convertkit.com")||-1!==t.indexOf("app.kit.com")||-1!==t.indexOf("api.kit.com")||void 0!==e.firstChild.classList&&e.firstChild.classList.contains("cb-form-group")||-1!==t.indexOf("mailerlite.com")||-1!==t.indexOf("colcolmail.co.uk")||-1!==t.indexOf("paypal.com")||-1!==t.indexOf("infusionsoft.com")||-1!==t.indexOf("secure2.convio.net")||-1!==t.indexOf("hookb.in")||-1!==t.indexOf("external.url")||-1!==t.indexOf("tp.media")||-1!==t.indexOf("flodesk.com")||-1!==t.indexOf("sendfox.com")||-1!==t.indexOf("aweber.com")||-1!==t.indexOf("secure.payu.com")||-1!==t.indexOf("mautic")||-1!==o.indexOf("mauticform_")||-1!==o.indexOf("ihf-contact-request-form")||-1!==t.indexOf("crm.zoho.com")||-1!==o.indexOf("delivra-external-form")||-1!==t.indexOf("eloqua.com")||-1!==t.indexOf("kulahub.net")||isFormHasDiviRedirect(e)||-1!==t.indexOf("eocampaign1.com")||-1!==t.indexOf("wufoo.com")||-1!==t.indexOf("activehosted.com")||-1!==t.indexOf("publisher.copernica.com")||-1!==t.indexOf("whatsapp.com")&&-1!==c.indexOf("chaty")||void 0!==e.classList&&e.classList.contains("sp-element-container")||apbctIsFormInDiv(e,"b24-form"))}function isFormHasDiviRedirect(e){let t=!1;var o=document.querySelector('div[id^="et_pb_contact_form"]');return t="object"==typeof e&&null!==e&&null!==o&&o.hasAttribute("data-redirect_url")&&""!==o.getAttribute("data-redirect_url")&&null!==o.querySelector('form[class^="et_pb_contact_form"]')?e===o.querySelector('form[class^="et_pb_contact_form"]'):t}function sendAjaxCheckingFormData(_){var e={};e[0]=apbct_collect_visible_fields(_),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=_.elements;(e=Array.prototype.slice.call(e)).forEach(function(e,t){""===e.name?o["input_"+t]=e.value:o[e.name]=e.value}),apbct_public_sendAJAX(o,{async:!1,callback:function(e,t,o,c){apbctMoosendSpinnerToggle(_);var n=_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of _.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of _.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of _.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==_.classList&&_.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=_.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==_.dataset.mailingListId){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),void(e=_.querySelector('[type="submit"]')).click()}if(_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("webto.salesforce.com")){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}if(n){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}var l,s,d=_,u=(_.parentElement.removeChild(_),_.apbctPrev),p=_.apbctFormOriginal;let e=!1;apbctReplaceInputsValuesFromOtherForm(d,p),p&&"string"==typeof p.id&&-1!==p.id.indexOf("mautic")&&(e=!0),u.after(p);for(l of p.querySelectorAll('input[name="apbct_visible_fields"]'))l.remove();for(s of p.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))s.remove();let t=p.querySelectorAll("button[type=submit]");if(0!==t.length)return t[0].click(),void(e&&setTimeout(function(){ctProtectExternal()},1500));if(0!==(t=p.querySelectorAll("input[type=submit]")).length)return void t[0].click();if(0!==(t=p.querySelectorAll('button[data-element="submit"]')).length)return void t[0].click();if(0!==(t=p.querySelectorAll("button#ck_subscribe_button")).length)return void t[0].click();0!==(t=p.querySelectorAll('input[type="image"][name="submit"]')).length&&t[0].click()}(void 0!==e.apbct&&+e.apbct.blocked||void 0!==e.data&&void 0!==e.data.message)&&(ctParseBlockMessage(e),n)&&setTimeout(function(){document.location.reload()},3e3)}})}function catchDynamicRenderedForm(){catchDynamicRenderedFormHandler(document.getElementsByTagName("form"));var t=document.getElementsByTagName("iframe");if(0e.selected).map(e=>e.value):"checkbox"===e.type||"radio"===e.type?e.checked||null:e.value}function apbctIsFormInDiv(e,t){let o=e.parentElement;for(;o;){if(o.classList.contains(t))return!0;o=o.parentElement}return!1}function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")} +class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=r,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),r=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),s=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),f=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==s?s:b,o.apbct_headless=void 0!==d?d:f,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=r,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+c+"}",r.innerHTML+="#cleantalk-modal-close:before{"+n+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctProtectExternal(){for(let e=0;e{c.forEach(e=>{t.name===e.name&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})}):o.forEach(t=>{c.forEach(e=>{t.outerHTML===e.outerHTML&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})})}function ctProtectKlaviyoForm(){if(document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')){let t=setInterval(()=>{var e=document.querySelectorAll("form.klaviyo-form");e.length&&(clearInterval(t),e.forEach((e,t)=>{apbctProcessExternalFormKlaviyo(e,t,document)}))},500)}}function apbctProcessExternalFormKlaviyo(t,e,o){var c,n=t.querySelector('button[type="button"].needsclick');n&&(n.disabled=!0,(c=document.createElement("input")).name="action",c.value="cleantalk_force_ajax_check",c.type="hidden",t.appendChild(c),(c=document.createElement("div")).id="apbct-klaviyo-cover",c.style.width="100%",c.style.height="100%",c.style.background="black",c.style.opacity=0,c.style.position="absolute",c.style.top=0,c.style.cursor="pointer",c.onclick=function(e){sendAjaxCheckingFormData(t)},n.parentNode.style.position="relative",n.parentNode.appendChild(c))}function ctProtectOutsideIframe(){var e=document.querySelectorAll("iframe");0 strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,r,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",s.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(s.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(s.phrases.trpContent1+" "),r.append(s.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",s.trpContentLink),l.setAttribute("target","_blank"),l.text=s.phrases.trpContentLearnMore,r.append(" "),r.append(l)),i.append(r),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),apbctLocalStorage.set("apbct_iframes_protected",[]),window.addEventListener("load",function(){+ctPublic.settings__forms__check_external&&(setTimeout(function(){ctProtectExternal(),catchDynamicRenderedForm(),catchNextendSocialLoginForm(),ctProtectOutsideIframe()},2e3),ctProtectKlaviyoForm())});let ctProtectOutsideIframeCheck;function ctProtectOutsideIframeHandler(e){var t=document.createElement("div");t.style.width="100%",t.style.height="100%",t.style.background="black",t.style.opacity=0,t.style.position="absolute",t.style.top=0,t.onclick=function(t){if(void 0===ctProtectOutsideIframeCheck){var t=t.currentTarget,o=(t.style.opacity=.5,document.createElement("div"));o.className="apbct-iframe-preloader",t.appendChild(o);let e="";document.querySelector('[name*="ct_bot_detector_event_token"]')&&(e=document.querySelector('[name*="ct_bot_detector_event_token"]').value),apbct_public_sendAJAX({action:"cleantalk_outside_iframe_ajax_check",ct_no_cookie_hidden_field:getNoCookieData(),ct_bot_detector_event_token:e},{async:!1,callback:function(t){!(ctProtectOutsideIframeCheck=!0)===t.apbct.blocked?document.querySelectorAll("div.apbct-iframe-preloader").forEach(function(e){e.parentNode.remove()}):(document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.parentNode.style.color="white",e.parentNode.innerHTML+=t.apbct.comment}),document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.remove()}))}})}},e.parentNode.style.position="relative",e.parentNode.appendChild(t);let o=apbctLocalStorage.get("apbct_iframes_protected");!1===o&&(o=[]),void 0!==e.id&&(o.push(e.id),apbctLocalStorage.set("apbct_iframes_protected",o))}function catchNextendSocialLoginForm(){var e=document.getElementById("nsl-custom-login-form-main");e&&blockBtnNextendSocialLogin(e)}function blockBtnNextendSocialLogin(e){var t=e.querySelectorAll(".nsl-container-buttons a"),e=e.querySelectorAll('a[data-plugin="nsl"] .nsl-button');t.forEach(e=>{e.setAttribute("data-oauth-login-blocked","true"),e.addEventListener("click",e=>{e.preventDefault()})}),e.forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),ctCheckAjax(t)})})}function allowAjaxNextendSocialLogin(e){e.parentElement.setAttribute("data-oauth-login-blocked","false"),e.parentElement.click()}function forbiddenAjaxNextendSocialLogin(e,t){var o,e=e.parentElement;"false"==e.getAttribute("data-oauth-login-blocked")&&e.setAttribute("data-oauth-login-blocked","true"),document.querySelector(".ct-forbidden-msg")||((o=document.createElement("div")).className="ct-forbidden-msg",o.style.background="red",o.style.color="white",o.style.padding="5px",o.innerHTML=t,e.insertAdjacentElement("beforebegin",o))}function ctCheckAjax(t){apbct_public_sendAJAX({action:"cleantalk_nsl_ajax_check",ct_no_cookie_hidden_field:document.getElementsByName("ct_no_cookie_hidden_field")[0].value},{async:!1,callback:function(e){!1===e.apbct.blocked?allowAjaxNextendSocialLogin(t):forbiddenAjaxNextendSocialLogin(t,e.apbct.comment)}})}function isIntegratedForm(e){var t="string"==typeof e.action?e.action:"",o=null!==e.getAttribute("id")?e.getAttribute("id"):"",c="string"==typeof e.className?e.className:"";return!!(-1!==t.indexOf("app.convertkit.com")||-1!==t.indexOf("app.kit.com")||-1!==t.indexOf("api.kit.com")||void 0!==e.firstChild.classList&&e.firstChild.classList.contains("cb-form-group")||-1!==t.indexOf("mailerlite.com")||-1!==t.indexOf("colcolmail.co.uk")||-1!==t.indexOf("paypal.com")||-1!==t.indexOf("infusionsoft.com")||-1!==t.indexOf("secure2.convio.net")||-1!==t.indexOf("hookb.in")||-1!==t.indexOf("external.url")||-1!==t.indexOf("tp.media")||-1!==t.indexOf("flodesk.com")||-1!==t.indexOf("sendfox.com")||-1!==t.indexOf("aweber.com")||-1!==t.indexOf("secure.payu.com")||-1!==t.indexOf("mautic")||-1!==o.indexOf("mauticform_")||-1!==o.indexOf("ihf-contact-request-form")||-1!==t.indexOf("crm.zoho.com")||-1!==o.indexOf("delivra-external-form")||-1!==t.indexOf("eloqua.com")||-1!==t.indexOf("kulahub.net")||isFormHasDiviRedirect(e)||-1!==t.indexOf("eocampaign1.com")||-1!==t.indexOf("wufoo.com")||-1!==t.indexOf("activehosted.com")||-1!==t.indexOf("publisher.copernica.com")||-1!==t.indexOf("whatsapp.com")&&-1!==c.indexOf("chaty")||void 0!==e.classList&&e.classList.contains("sp-element-container")||apbctIsFormInDiv(e,"b24-form"))}function isFormHasDiviRedirect(e){let t=!1;var o=document.querySelector('div[id^="et_pb_contact_form"]');return t="object"==typeof e&&null!==e&&null!==o&&o.hasAttribute("data-redirect_url")&&""!==o.getAttribute("data-redirect_url")&&null!==o.querySelector('form[class^="et_pb_contact_form"]')?e===o.querySelector('form[class^="et_pb_contact_form"]'):t}function sendAjaxCheckingFormData(_){var e={};e[0]=apbct_collect_visible_fields(_),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=_.elements;(e=Array.prototype.slice.call(e)).forEach(function(e,t){""===e.name?o["input_"+t]=e.value:o[e.name]=e.value}),apbct_public_sendAJAX(o,{async:!1,callback:function(e,t,o,c){apbctMoosendSpinnerToggle(_);var n=_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of _.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of _.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of _.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==_.classList&&_.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=_.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==_.dataset.mailingListId){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),void(e=_.querySelector('[type="submit"]')).click()}if(_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("webto.salesforce.com")){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}if(n){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}var l,s,d=_,u=(_.parentElement.removeChild(_),_.apbctPrev),p=_.apbctFormOriginal;let e=!1;apbctReplaceInputsValuesFromOtherForm(d,p),p&&"string"==typeof p.id&&-1!==p.id.indexOf("mautic")&&(e=!0),u.after(p);for(l of p.querySelectorAll('input[name="apbct_visible_fields"]'))l.remove();for(s of p.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))s.remove();let t=p.querySelectorAll("button[type=submit]");if(0!==t.length)return t[0].click(),void(e&&setTimeout(function(){ctProtectExternal()},1500));if(0!==(t=p.querySelectorAll("input[type=submit]")).length)return void t[0].click();if(0!==(t=p.querySelectorAll('button[data-element="submit"]')).length)return void t[0].click();if(0!==(t=p.querySelectorAll("button#ck_subscribe_button")).length)return void t[0].click();0!==(t=p.querySelectorAll('input[type="image"][name="submit"]')).length&&t[0].click()}(void 0!==e.apbct&&+e.apbct.blocked||void 0!==e.data&&void 0!==e.data.message)&&(ctParseBlockMessage(e),n)&&setTimeout(function(){document.location.reload()},3e3)}})}function catchDynamicRenderedForm(){catchDynamicRenderedFormHandler(document.getElementsByTagName("form"));var t=document.getElementsByTagName("iframe");if(0e.selected).map(e=>e.value):"checkbox"===e.type||"radio"===e.type?e.checked||null:e.value}function apbctIsFormInDiv(e,t){let o=e.parentElement;for(;o;){if(o.classList.contains(t))return!0;o=o.parentElement}return!1} //# sourceMappingURL=apbct-public-bundle_ext-protection.min.js.map diff --git a/js/apbct-public-bundle_ext-protection.min.js.map b/js/apbct-public-bundle_ext-protection.min.js.map index 3c609bf3b..f1d3efa68 100644 --- a/js/apbct-public-bundle_ext-protection.min.js.map +++ b/js/apbct-public-bundle_ext-protection.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public-bundle_ext-protection.min.js","sources":["apbct-public-bundle_ext-protection.js"],"sourcesContent":["/**\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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' &&\n (currentForm.action.indexOf('webto.salesforce.com') !== -1)) ||\n (typeof(currentForm.action) == 'string' &&\n currentForm.querySelector('[href*=\"activecampaign\"]')) ||\n (\n typeof(currentForm.action) == 'string' &&\n currentForm.action.indexOf('hsforms.com') !== -1 &&\n currentForm.getAttribute('data-hs-cf-bound')\n )\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n 'et_pb_searchform', // integration with elementor-search-form\n ];\n\n const exclusionsByAction = [\n 'paypal.com/cgi-bin/webscr', // search forms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n if (currentForm.getAttribute('action') !== null) {\n exclusionsByAction.forEach(function(exclusionAction) {\n if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) {\n result = true;\n }\n });\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n if (currentForm.getAttribute('data-hs-cf-bound')) {\n result = false;\n } else {\n result = true;\n }\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n\n let mailerliteSubmitButton = null;\n if ( mailerliteDetectedClass ) {\n mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n return;\n }\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n\n // MooSend spinner activate\n apbctMoosendSpinnerToggle(event.currentTarget);\n\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Activate or deactivate spinner for Moosend form during request checking\n * @param {HTMLElement} form\n */\nfunction apbctMoosendSpinnerToggle(form) {\n const buttonElement = form.querySelector('button[type=\"submit\"]');\n if ( buttonElement ) {\n const spinner = buttonElement.querySelector('i');\n const submitText = buttonElement.querySelector('span');\n if (spinner && submitText) {\n if ( spinner.style.zIndex == 1 ) {\n submitText.style.opacity = 1;\n spinner.style.zIndex = -1;\n spinner.style.opacity = 0;\n } else {\n submitText.style.opacity = 0;\n spinner.style.zIndex = 1;\n spinner.style.opacity = 1;\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n if (formSource.outerHTML.indexOf('action=\"https://www.kulahub.net') !== -1 ||\n isFormHasDiviRedirect(formSource) ||\n formSource.outerHTML.indexOf('class=\"et_pb_contact_form') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://api.kit.com') !== -1 ||\n formSource.outerHTML.indexOf('activehosted.com') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://crm.zoho.com') !== -1\n ) {\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.name === elemTarget.name) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n\n return;\n }\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.addEventListener('load', function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n\n ctProtectKlaviyoForm();\n});\n\n/**\n * Protect klaviyo forms\n */\nfunction ctProtectKlaviyoForm() {\n if (!document.querySelector('link[rel=\"dns-prefetch\"][href=\"//static.klaviyo.com\"]')) {\n return;\n }\n\n let i = setInterval(() => {\n const klaviyoForms = document.querySelectorAll('form.klaviyo-form');\n if (klaviyoForms.length) {\n clearInterval(i);\n klaviyoForms.forEach((form, index) => {\n apbctProcessExternalFormKlaviyo(form, index, document);\n });\n }\n }, 500);\n}\n\n/**\n * Protect klaviyo forms\n * @param {HTMLElement} form\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormKlaviyo(form, iterator, documentObject) {\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (!btn) {\n return;\n }\n btn.disabled = true;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n let cover = document.createElement('div');\n cover.id = 'apbct-klaviyo-cover';\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.style.cursor = 'pointer';\n cover.onclick = function(e) {\n sendAjaxCheckingFormData(form);\n };\n btn.parentNode.style.position = 'relative';\n btn.parentNode.appendChild(cover);\n}\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.src.indexOf('hello.dubsado.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n const formClassName = typeof(formObj.className) == 'string' ? formObj.className : '';\n\n if (\n (\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form\n formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form\n ) ||\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227\n // ( formObj.classList !== undefined &&\n // !formObj.classList.contains('woocommerce-checkout') &&\n // formObj.hasAttribute('data-hs-cf-bound')\n // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form\n formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration\n formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration\n isFormHasDiviRedirect(formObj) || // Divi contact form\n formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form\n formAction.indexOf('wufoo.com') !== -1 || // Wufoo form\n formAction.indexOf('activehosted.com') !== -1 || // Activehosted form\n formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica\n (\n formAction.indexOf('whatsapp.com') !== -1 &&\n formClassName.indexOf('chaty') !== -1\n ) || // chaty plugin whatsapp form\n (\n formObj.classList !== undefined &&\n formObj.classList.contains('sp-element-container')\n ) || // Sendpulse form\n apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * This function detect if the form has DIVI redirect. If so, the form will work as external.\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isFormHasDiviRedirect(formObj) {\n let result = false;\n const diviRedirectedSignSet = document.querySelector('div[id^=\"et_pb_contact_form\"]');\n if (\n typeof formObj === 'object' && formObj !== null &&\n diviRedirectedSignSet !== null &&\n diviRedirectedSignSet.hasAttribute('data-redirect_url') &&\n diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' &&\n diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]') !== null\n ) {\n result = formObj === diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]');\n }\n return result;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n // MooSend spinner deactivate\n apbctMoosendSpinnerToggle(form);\n // hubspot flag\n const isHubSpotEmbedForm = (\n form.hasAttribute('action') &&\n form.getAttribute('action').indexOf('hsforms') !== -1\n );\n if ((result.apbct === undefined && result.data === undefined) ||\n (result.apbct !== undefined && ! +result.apbct.blocked)\n ) {\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Klaviyo integration\n if (form.classList !== undefined && form.classList.contains('klaviyo-form')) {\n const cover = document.getElementById('apbct-klaviyo-cover');\n if (cover) {\n cover.remove();\n }\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (btn) {\n btn.disabled = false;\n btn.click();\n }\n return;\n }\n\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Hubspot bounded integration\n if (isHubSpotEmbedForm) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal &&\n typeof formOriginal.id === 'string' &&\n formOriginal.id.indexOf('mautic') !== -1\n ) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n submButton = formOriginal.querySelectorAll('button#ck_subscribe_button');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if ((result.apbct !== undefined && +result.apbct.blocked) ||\n (result.data !== undefined && result.data.message !== undefined)\n ) {\n ctParseBlockMessage(result);\n // hubspot embed form needs to reload page to prevent forms mishandling\n if (isHubSpotEmbedForm) {\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n }\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Handles dynamic rendered forms by attaching an onsubmit event handler to them.\n *\n * @param {HTMLCollection} forms - A collection of form elements to be processed.\n * @param {Document} [documentObject=document] - The document object to use for querying elements.\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n const formIdAttr = form.getAttribute('id');\n if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) {\n neededFormIds.push(formIdAttr);\n }\n if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(formIdAttr);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\n }\n}\n\n/**\n * Checks if a form object is inside a div with a specified class name.\n *\n * @param {HTMLElement} formObj - The form element to check.\n * @param {string} divClassName - The class name of the div to look for.\n * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise.\n */\nfunction apbctIsFormInDiv(formObj, divClassName) {\n let parent = formObj.parentElement;\n while (parent) {\n if (parent.classList.contains(divClassName)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\n}\n\n/**\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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, email + '$1');\n}\n"],"names":["ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","event","constructor","this","select","HTMLCollection","Array","prototype","slice","call","document","querySelectorAll","deselect","addElement","elemToAdd","push","elem","reduce","css","style","getRaw","styleName","Object","hasOwn","DomStyleName","replace","group","toUpperCase","let","i","length","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","classList","add","className","removeClass","remove","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","addEventListener","onChecker","bind","target","querySelector","stopPropagation","ready","callback","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","data","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","createElement","Boolean","HTMLElement","HTMLUnknownElement","indexOf","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","append","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","setTimeout","fadeOut","ctProcessError","msg","url","log","ctJsErrors","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","JSON","stringify","errorObj","error","location","href","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","selectActualNonce","defaultNonce","ctPublicFunctions","hasOwnProperty","_fresh_nonce","data__ajax_type","_ajax_nonce","_rest_nonce","apbct","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","method","async","user","password","button","spinner","progressbar","context","onErrorCallback","responseType","headers","timeout","methods_to_convert_data_to_URL","body","http_code","status_text","parameters","key","prepare","keys","deleteDoubleJSONEncoding","convertData","console","open","setHeaders","onreadystatechange","isWpNonceError","getFreshNonceAndRerunXHR","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","setAttribute","cursor","complete","status","statusText","removeAttribute","on_ready_state_change","on_progress","response","restErrror","ajaxErrror","readyState","initialRequestParams","noncePrev","spbc_remote_call_action","plugin_name","nonce_prev","initial_request_params","notJson","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","outerHTML","innerHTML","addClicks","trackMouseMovement","ctCollectingUserActivityData","clicks","selected","mouseMovementsInsideForm","ctSetCookie","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","forEach","item","apbctLocalStorage","set","ctSetAlternativeCookie","ctPublic","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","encodeURIComponent","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bloomPopup","pafeFormsFormElementor","otterForm","smartQuizBuilder","bookingPress","isArray","getJavascriptClientData","e","apbct_force_alt_cookies","apbct_pixel_url","decodeURIComponent","apbct_public_sendREST","apbct_public_sendAJAX","action","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","element","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","ApbctForceProtection","wrappers","findWrappers","checkBot","event_javascript_data","post_url","referrer","checkBotCallback","result","decodeForms","allow","Event","showMessageForBot","form","wrapper","dataset","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","removeEventListener","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","getElementById","setEventTokenField","clearInterval","checkEmail","currentEmail","test","email","now","checkEmailExist","hint","getResultCheckEmailExist","viewCheckEmailExist","envelope","text_result","state","textResult","inputEmail","top","getBoundingClientRect","ctEmailExistSetElementsPositions","onmouseover","textContent","height","color","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","split","trim","pixel__url","data__email_check_before_post","data__email_check_exist_post","tokenForForceAlt","encodedEmailNodes","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","contains","preventDefault","ctFillDecodedEmailHandler","_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","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_site_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","comment","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","id","hiddenFieldType","formAction","j","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","formClasses","classExists","classForm","sessionCurrentPage","el","loading","opened","opening","ignoreURLConvert","load","apbct_admin_sendAJAX","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","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","appendChild","apbctProcessIframes","exclusionAction","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","mailerliteDetectedClass","apbctPrev","apbctFormOriginal","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctMoosendSpinnerToggle","buttonElement","submitText","zIndex","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","isFormHasDiviRedirect","elemSource","elemTarget","checked","apbctVal","ctProtectKlaviyoForm","klaviyoForms","index","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","popup","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","currentDiv","preloader","botDetectorToken","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","click","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formClassName","firstChild","apbctIsFormInDiv","diviRedirectedSignSet","elems","isHubSpotEmbedForm","submitButton","formNew","mauticIntegration","submButton","reload","catchDynamicRenderedFormHandler","neededFormIds","formIdAttr","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","multiple","option","map","divClassName","apbctSetEmailDecoderPopupAnimation","animationElements","animationWrapper","apbctEEAnimationDogOne","innerText","clickSource","ctWlBrandname","encodedEmail","encodedEmailNodesIsMixed","wl_brandname","ctAdminCommon","encodedEmailNode","popupHeaderWrapper","popupTextWrapper","popupTextWaiting","popupTextDecoding","encoderPopup","text__ee_wait_for_decoding","waitingPopup","popupHeader","text__ee_decoding_process","apbctAjaxEmailDecodeBulk","encodedEmails","encodedEmailsCollection","apbctTooltip","originalString","emailEncoderPassKey","apbctEmailEncoderCallbackBulk","res","resetEncodedNodes","ctShowDecodeComment","0","success","is_allowed","currentResultData","row","encoded_email","decoded_email","firstNode","selectableEmail","text__ee_click_to_select","title","text__ee_original_email","secondNode","buttonWrapper","text__ee_got_it","fillDecodedNodes","text__ee_blocked","text__ee_cannot_connect","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","baseElementContent","encodedEmailTextInsideMailto","targetElement","ctFillDecodedEmail"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"apbct-public-bundle_ext-protection.min.js","sources":["apbct-public-bundle_ext-protection.js"],"sourcesContent":["/**\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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' &&\n (currentForm.action.indexOf('webto.salesforce.com') !== -1)) ||\n (typeof(currentForm.action) == 'string' &&\n currentForm.querySelector('[href*=\"activecampaign\"]')) ||\n (\n typeof(currentForm.action) == 'string' &&\n currentForm.action.indexOf('hsforms.com') !== -1 &&\n currentForm.getAttribute('data-hs-cf-bound')\n )\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n 'et_pb_searchform', // integration with elementor-search-form\n ];\n\n const exclusionsByAction = [\n 'paypal.com/cgi-bin/webscr', // search forms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n if (currentForm.getAttribute('action') !== null) {\n exclusionsByAction.forEach(function(exclusionAction) {\n if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) {\n result = true;\n }\n });\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n if (currentForm.getAttribute('data-hs-cf-bound')) {\n result = false;\n } else {\n result = true;\n }\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n\n let mailerliteSubmitButton = null;\n if ( mailerliteDetectedClass ) {\n mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n return;\n }\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n\n // MooSend spinner activate\n apbctMoosendSpinnerToggle(event.currentTarget);\n\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Activate or deactivate spinner for Moosend form during request checking\n * @param {HTMLElement} form\n */\nfunction apbctMoosendSpinnerToggle(form) {\n const buttonElement = form.querySelector('button[type=\"submit\"]');\n if ( buttonElement ) {\n const spinner = buttonElement.querySelector('i');\n const submitText = buttonElement.querySelector('span');\n if (spinner && submitText) {\n if ( spinner.style.zIndex == 1 ) {\n submitText.style.opacity = 1;\n spinner.style.zIndex = -1;\n spinner.style.opacity = 0;\n } else {\n submitText.style.opacity = 0;\n spinner.style.zIndex = 1;\n spinner.style.opacity = 1;\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n if (formSource.outerHTML.indexOf('action=\"https://www.kulahub.net') !== -1 ||\n isFormHasDiviRedirect(formSource) ||\n formSource.outerHTML.indexOf('class=\"et_pb_contact_form') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://api.kit.com') !== -1 ||\n formSource.outerHTML.indexOf('activehosted.com') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://crm.zoho.com') !== -1\n ) {\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.name === elemTarget.name) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n\n return;\n }\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.addEventListener('load', function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n\n ctProtectKlaviyoForm();\n});\n\n/**\n * Protect klaviyo forms\n */\nfunction ctProtectKlaviyoForm() {\n if (!document.querySelector('link[rel=\"dns-prefetch\"][href=\"//static.klaviyo.com\"]')) {\n return;\n }\n\n let i = setInterval(() => {\n const klaviyoForms = document.querySelectorAll('form.klaviyo-form');\n if (klaviyoForms.length) {\n clearInterval(i);\n klaviyoForms.forEach((form, index) => {\n apbctProcessExternalFormKlaviyo(form, index, document);\n });\n }\n }, 500);\n}\n\n/**\n * Protect klaviyo forms\n * @param {HTMLElement} form\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormKlaviyo(form, iterator, documentObject) {\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (!btn) {\n return;\n }\n btn.disabled = true;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n let cover = document.createElement('div');\n cover.id = 'apbct-klaviyo-cover';\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.style.cursor = 'pointer';\n cover.onclick = function(e) {\n sendAjaxCheckingFormData(form);\n };\n btn.parentNode.style.position = 'relative';\n btn.parentNode.appendChild(cover);\n}\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.src.indexOf('hello.dubsado.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n const formClassName = typeof(formObj.className) == 'string' ? formObj.className : '';\n\n if (\n (\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form\n formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form\n ) ||\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227\n // ( formObj.classList !== undefined &&\n // !formObj.classList.contains('woocommerce-checkout') &&\n // formObj.hasAttribute('data-hs-cf-bound')\n // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form\n formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration\n formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration\n isFormHasDiviRedirect(formObj) || // Divi contact form\n formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form\n formAction.indexOf('wufoo.com') !== -1 || // Wufoo form\n formAction.indexOf('activehosted.com') !== -1 || // Activehosted form\n formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica\n (\n formAction.indexOf('whatsapp.com') !== -1 &&\n formClassName.indexOf('chaty') !== -1\n ) || // chaty plugin whatsapp form\n (\n formObj.classList !== undefined &&\n formObj.classList.contains('sp-element-container')\n ) || // Sendpulse form\n apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * This function detect if the form has DIVI redirect. If so, the form will work as external.\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isFormHasDiviRedirect(formObj) {\n let result = false;\n const diviRedirectedSignSet = document.querySelector('div[id^=\"et_pb_contact_form\"]');\n if (\n typeof formObj === 'object' && formObj !== null &&\n diviRedirectedSignSet !== null &&\n diviRedirectedSignSet.hasAttribute('data-redirect_url') &&\n diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' &&\n diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]') !== null\n ) {\n result = formObj === diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]');\n }\n return result;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n // MooSend spinner deactivate\n apbctMoosendSpinnerToggle(form);\n // hubspot flag\n const isHubSpotEmbedForm = (\n form.hasAttribute('action') &&\n form.getAttribute('action').indexOf('hsforms') !== -1\n );\n if ((result.apbct === undefined && result.data === undefined) ||\n (result.apbct !== undefined && ! +result.apbct.blocked)\n ) {\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Klaviyo integration\n if (form.classList !== undefined && form.classList.contains('klaviyo-form')) {\n const cover = document.getElementById('apbct-klaviyo-cover');\n if (cover) {\n cover.remove();\n }\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (btn) {\n btn.disabled = false;\n btn.click();\n }\n return;\n }\n\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Hubspot bounded integration\n if (isHubSpotEmbedForm) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal &&\n typeof formOriginal.id === 'string' &&\n formOriginal.id.indexOf('mautic') !== -1\n ) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n submButton = formOriginal.querySelectorAll('button#ck_subscribe_button');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if ((result.apbct !== undefined && +result.apbct.blocked) ||\n (result.data !== undefined && result.data.message !== undefined)\n ) {\n ctParseBlockMessage(result);\n // hubspot embed form needs to reload page to prevent forms mishandling\n if (isHubSpotEmbedForm) {\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n }\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Handles dynamic rendered forms by attaching an onsubmit event handler to them.\n *\n * @param {HTMLCollection} forms - A collection of form elements to be processed.\n * @param {Document} [documentObject=document] - The document object to use for querying elements.\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n const formIdAttr = form.getAttribute('id');\n if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) {\n neededFormIds.push(formIdAttr);\n }\n if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(formIdAttr);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\n }\n}\n\n/**\n * Checks if a form object is inside a div with a specified class name.\n *\n * @param {HTMLElement} formObj - The form element to check.\n * @param {string} divClassName - The class name of the div to look for.\n * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise.\n */\nfunction apbctIsFormInDiv(formObj, divClassName) {\n let parent = formObj.parentElement;\n while (parent) {\n if (parent.classList.contains(divClassName)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\n}\n"],"names":["ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","event","constructor","this","select","HTMLCollection","Array","prototype","slice","call","document","querySelectorAll","deselect","addElement","elemToAdd","push","elem","reduce","css","style","getRaw","styleName","Object","hasOwn","DomStyleName","replace","group","toUpperCase","let","i","length","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","classList","add","className","removeClass","remove","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","addEventListener","onChecker","bind","target","querySelector","stopPropagation","ready","callback","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","data","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","createElement","Boolean","HTMLElement","HTMLUnknownElement","indexOf","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","append","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","setTimeout","fadeOut","ctProcessError","msg","url","log","ctJsErrors","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","JSON","stringify","errorObj","error","location","href","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","selectActualNonce","defaultNonce","ctPublicFunctions","hasOwnProperty","_fresh_nonce","data__ajax_type","_ajax_nonce","_rest_nonce","apbct","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","method","async","user","password","button","spinner","progressbar","context","onErrorCallback","responseType","headers","timeout","methods_to_convert_data_to_URL","body","http_code","status_text","parameters","key","prepare","keys","deleteDoubleJSONEncoding","convertData","console","open","setHeaders","onreadystatechange","isWpNonceError","getFreshNonceAndRerunXHR","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","setAttribute","cursor","complete","status","statusText","removeAttribute","on_ready_state_change","on_progress","response","restErrror","ajaxErrror","readyState","initialRequestParams","noncePrev","spbc_remote_call_action","plugin_name","nonce_prev","initial_request_params","notJson","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","outerHTML","innerHTML","addClicks","trackMouseMovement","ctCollectingUserActivityData","clicks","selected","mouseMovementsInsideForm","ctSetCookie","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","forEach","item","apbctLocalStorage","set","ctSetAlternativeCookie","ctPublic","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","encodeURIComponent","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bloomPopup","pafeFormsFormElementor","otterForm","smartQuizBuilder","bookingPress","isArray","getJavascriptClientData","e","apbct_force_alt_cookies","apbct_pixel_url","decodeURIComponent","apbct_public_sendREST","apbct_public_sendAJAX","action","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","element","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","ApbctForceProtection","wrappers","findWrappers","checkBot","event_javascript_data","post_url","referrer","checkBotCallback","result","decodeForms","allow","Event","showMessageForBot","form","wrapper","dataset","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","removeEventListener","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","getElementById","setEventTokenField","clearInterval","checkEmail","currentEmail","test","email","now","checkEmailExist","hint","getResultCheckEmailExist","viewCheckEmailExist","envelope","text_result","state","textResult","inputEmail","top","getBoundingClientRect","ctEmailExistSetElementsPositions","onmouseover","textContent","height","color","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","split","trim","pixel__url","data__email_check_before_post","data__email_check_exist_post","tokenForForceAlt","encodedEmailNodes","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","contains","preventDefault","ctFillDecodedEmailHandler","_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","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_site_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","comment","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","id","hiddenFieldType","formAction","j","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","formClasses","classExists","classForm","sessionCurrentPage","el","loading","opened","opening","ignoreURLConvert","load","apbct_admin_sendAJAX","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","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","appendChild","apbctProcessIframes","exclusionAction","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","mailerliteDetectedClass","apbctPrev","apbctFormOriginal","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctMoosendSpinnerToggle","buttonElement","submitText","zIndex","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","isFormHasDiviRedirect","elemSource","elemTarget","checked","apbctVal","ctProtectKlaviyoForm","klaviyoForms","index","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","popup","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","currentDiv","preloader","botDetectorToken","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","click","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formClassName","firstChild","apbctIsFormInDiv","diviRedirectedSignSet","elems","isHubSpotEmbedForm","submitButton","formNew","mauticIntegration","submButton","reload","catchDynamicRenderedFormHandler","neededFormIds","formIdAttr","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","multiple","option","map","divClassName"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_ext-protection_comm-func.min.js b/js/apbct-public-bundle_ext-protection_comm-func.min.js new file mode 100644 index 000000000..094af34c4 --- /dev/null +++ b/js/apbct-public-bundle_ext-protection_comm-func.min.js @@ -0,0 +1,2 @@ +function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=r,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),r=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),s=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),f=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==s?s:b,o.apbct_headless=void 0!==d?d:f,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=r,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+c+"}",r.innerHTML+="#cleantalk-modal-close:before{"+n+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctProtectExternal(){for(let e=0;e{c.forEach(e=>{t.name===e.name&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})}):o.forEach(t=>{c.forEach(e=>{t.outerHTML===e.outerHTML&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})})}function ctProtectKlaviyoForm(){if(document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')){let t=setInterval(()=>{var e=document.querySelectorAll("form.klaviyo-form");e.length&&(clearInterval(t),e.forEach((e,t)=>{apbctProcessExternalFormKlaviyo(e,t,document)}))},500)}}function apbctProcessExternalFormKlaviyo(t,e,o){var c,n=t.querySelector('button[type="button"].needsclick');n&&(n.disabled=!0,(c=document.createElement("input")).name="action",c.value="cleantalk_force_ajax_check",c.type="hidden",t.appendChild(c),(c=document.createElement("div")).id="apbct-klaviyo-cover",c.style.width="100%",c.style.height="100%",c.style.background="black",c.style.opacity=0,c.style.position="absolute",c.style.top=0,c.style.cursor="pointer",c.onclick=function(e){sendAjaxCheckingFormData(t)},n.parentNode.style.position="relative",n.parentNode.appendChild(c))}function ctProtectOutsideIframe(){var e=document.querySelectorAll("iframe");0 strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,r,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",s.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(s.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(s.phrases.trpContent1+" "),r.append(s.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",s.trpContentLink),l.setAttribute("target","_blank"),l.text=s.phrases.trpContentLearnMore,r.append(" "),r.append(l)),i.append(r),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),apbctLocalStorage.set("apbct_iframes_protected",[]),window.addEventListener("load",function(){+ctPublic.settings__forms__check_external&&(setTimeout(function(){ctProtectExternal(),catchDynamicRenderedForm(),catchNextendSocialLoginForm(),ctProtectOutsideIframe()},2e3),ctProtectKlaviyoForm())});let ctProtectOutsideIframeCheck;function ctProtectOutsideIframeHandler(e){var t=document.createElement("div");t.style.width="100%",t.style.height="100%",t.style.background="black",t.style.opacity=0,t.style.position="absolute",t.style.top=0,t.onclick=function(t){if(void 0===ctProtectOutsideIframeCheck){var t=t.currentTarget,o=(t.style.opacity=.5,document.createElement("div"));o.className="apbct-iframe-preloader",t.appendChild(o);let e="";document.querySelector('[name*="ct_bot_detector_event_token"]')&&(e=document.querySelector('[name*="ct_bot_detector_event_token"]').value),apbct_public_sendAJAX({action:"cleantalk_outside_iframe_ajax_check",ct_no_cookie_hidden_field:getNoCookieData(),ct_bot_detector_event_token:e},{async:!1,callback:function(t){!(ctProtectOutsideIframeCheck=!0)===t.apbct.blocked?document.querySelectorAll("div.apbct-iframe-preloader").forEach(function(e){e.parentNode.remove()}):(document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.parentNode.style.color="white",e.parentNode.innerHTML+=t.apbct.comment}),document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.remove()}))}})}},e.parentNode.style.position="relative",e.parentNode.appendChild(t);let o=apbctLocalStorage.get("apbct_iframes_protected");!1===o&&(o=[]),void 0!==e.id&&(o.push(e.id),apbctLocalStorage.set("apbct_iframes_protected",o))}function catchNextendSocialLoginForm(){var e=document.getElementById("nsl-custom-login-form-main");e&&blockBtnNextendSocialLogin(e)}function blockBtnNextendSocialLogin(e){var t=e.querySelectorAll(".nsl-container-buttons a"),e=e.querySelectorAll('a[data-plugin="nsl"] .nsl-button');t.forEach(e=>{e.setAttribute("data-oauth-login-blocked","true"),e.addEventListener("click",e=>{e.preventDefault()})}),e.forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),ctCheckAjax(t)})})}function allowAjaxNextendSocialLogin(e){e.parentElement.setAttribute("data-oauth-login-blocked","false"),e.parentElement.click()}function forbiddenAjaxNextendSocialLogin(e,t){var o,e=e.parentElement;"false"==e.getAttribute("data-oauth-login-blocked")&&e.setAttribute("data-oauth-login-blocked","true"),document.querySelector(".ct-forbidden-msg")||((o=document.createElement("div")).className="ct-forbidden-msg",o.style.background="red",o.style.color="white",o.style.padding="5px",o.innerHTML=t,e.insertAdjacentElement("beforebegin",o))}function ctCheckAjax(t){apbct_public_sendAJAX({action:"cleantalk_nsl_ajax_check",ct_no_cookie_hidden_field:document.getElementsByName("ct_no_cookie_hidden_field")[0].value},{async:!1,callback:function(e){!1===e.apbct.blocked?allowAjaxNextendSocialLogin(t):forbiddenAjaxNextendSocialLogin(t,e.apbct.comment)}})}function isIntegratedForm(e){var t="string"==typeof e.action?e.action:"",o=null!==e.getAttribute("id")?e.getAttribute("id"):"",c="string"==typeof e.className?e.className:"";return!!(-1!==t.indexOf("app.convertkit.com")||-1!==t.indexOf("app.kit.com")||-1!==t.indexOf("api.kit.com")||void 0!==e.firstChild.classList&&e.firstChild.classList.contains("cb-form-group")||-1!==t.indexOf("mailerlite.com")||-1!==t.indexOf("colcolmail.co.uk")||-1!==t.indexOf("paypal.com")||-1!==t.indexOf("infusionsoft.com")||-1!==t.indexOf("secure2.convio.net")||-1!==t.indexOf("hookb.in")||-1!==t.indexOf("external.url")||-1!==t.indexOf("tp.media")||-1!==t.indexOf("flodesk.com")||-1!==t.indexOf("sendfox.com")||-1!==t.indexOf("aweber.com")||-1!==t.indexOf("secure.payu.com")||-1!==t.indexOf("mautic")||-1!==o.indexOf("mauticform_")||-1!==o.indexOf("ihf-contact-request-form")||-1!==t.indexOf("crm.zoho.com")||-1!==o.indexOf("delivra-external-form")||-1!==t.indexOf("eloqua.com")||-1!==t.indexOf("kulahub.net")||isFormHasDiviRedirect(e)||-1!==t.indexOf("eocampaign1.com")||-1!==t.indexOf("wufoo.com")||-1!==t.indexOf("activehosted.com")||-1!==t.indexOf("publisher.copernica.com")||-1!==t.indexOf("whatsapp.com")&&-1!==c.indexOf("chaty")||void 0!==e.classList&&e.classList.contains("sp-element-container")||apbctIsFormInDiv(e,"b24-form"))}function isFormHasDiviRedirect(e){let t=!1;var o=document.querySelector('div[id^="et_pb_contact_form"]');return t="object"==typeof e&&null!==e&&null!==o&&o.hasAttribute("data-redirect_url")&&""!==o.getAttribute("data-redirect_url")&&null!==o.querySelector('form[class^="et_pb_contact_form"]')?e===o.querySelector('form[class^="et_pb_contact_form"]'):t}function sendAjaxCheckingFormData(_){var e={};e[0]=apbct_collect_visible_fields(_),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=_.elements;(e=Array.prototype.slice.call(e)).forEach(function(e,t){""===e.name?o["input_"+t]=e.value:o[e.name]=e.value}),apbct_public_sendAJAX(o,{async:!1,callback:function(e,t,o,c){apbctMoosendSpinnerToggle(_);var n=_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of _.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of _.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of _.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==_.classList&&_.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=_.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==_.dataset.mailingListId){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),void(e=_.querySelector('[type="submit"]')).click()}if(_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("webto.salesforce.com")){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}if(n){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}var l,s,d=_,u=(_.parentElement.removeChild(_),_.apbctPrev),p=_.apbctFormOriginal;let e=!1;apbctReplaceInputsValuesFromOtherForm(d,p),p&&"string"==typeof p.id&&-1!==p.id.indexOf("mautic")&&(e=!0),u.after(p);for(l of p.querySelectorAll('input[name="apbct_visible_fields"]'))l.remove();for(s of p.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))s.remove();let t=p.querySelectorAll("button[type=submit]");if(0!==t.length)return t[0].click(),void(e&&setTimeout(function(){ctProtectExternal()},1500));if(0!==(t=p.querySelectorAll("input[type=submit]")).length)return void t[0].click();if(0!==(t=p.querySelectorAll('button[data-element="submit"]')).length)return void t[0].click();if(0!==(t=p.querySelectorAll("button#ck_subscribe_button")).length)return void t[0].click();0!==(t=p.querySelectorAll('input[type="image"][name="submit"]')).length&&t[0].click()}(void 0!==e.apbct&&+e.apbct.blocked||void 0!==e.data&&void 0!==e.data.message)&&(ctParseBlockMessage(e),n)&&setTimeout(function(){document.location.reload()},3e3)}})}function catchDynamicRenderedForm(){catchDynamicRenderedFormHandler(document.getElementsByTagName("form"));var t=document.getElementsByTagName("iframe");if(0e.selected).map(e=>e.value):"checkbox"===e.type||"radio"===e.type?e.checked||null:e.value}function apbctIsFormInDiv(e,t){let o=e.parentElement;for(;o;){if(o.classList.contains(t))return!0;o=o.parentElement}return!1} +//# sourceMappingURL=apbct-public-bundle_ext-protection_comm-func.min.js.map diff --git a/js/apbct-public-bundle_ext-protection_comm-func.min.js.map b/js/apbct-public-bundle_ext-protection_comm-func.min.js.map new file mode 100644 index 000000000..dc49d7196 --- /dev/null +++ b/js/apbct-public-bundle_ext-protection_comm-func.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"apbct-public-bundle_ext-protection_comm-func.min.js","sources":["apbct-public-bundle_ext-protection_comm-func.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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, 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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' &&\n (currentForm.action.indexOf('webto.salesforce.com') !== -1)) ||\n (typeof(currentForm.action) == 'string' &&\n currentForm.querySelector('[href*=\"activecampaign\"]')) ||\n (\n typeof(currentForm.action) == 'string' &&\n currentForm.action.indexOf('hsforms.com') !== -1 &&\n currentForm.getAttribute('data-hs-cf-bound')\n )\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n 'et_pb_searchform', // integration with elementor-search-form\n ];\n\n const exclusionsByAction = [\n 'paypal.com/cgi-bin/webscr', // search forms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n if (currentForm.getAttribute('action') !== null) {\n exclusionsByAction.forEach(function(exclusionAction) {\n if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) {\n result = true;\n }\n });\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n if (currentForm.getAttribute('data-hs-cf-bound')) {\n result = false;\n } else {\n result = true;\n }\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n\n let mailerliteSubmitButton = null;\n if ( mailerliteDetectedClass ) {\n mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n return;\n }\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n\n // MooSend spinner activate\n apbctMoosendSpinnerToggle(event.currentTarget);\n\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Activate or deactivate spinner for Moosend form during request checking\n * @param {HTMLElement} form\n */\nfunction apbctMoosendSpinnerToggle(form) {\n const buttonElement = form.querySelector('button[type=\"submit\"]');\n if ( buttonElement ) {\n const spinner = buttonElement.querySelector('i');\n const submitText = buttonElement.querySelector('span');\n if (spinner && submitText) {\n if ( spinner.style.zIndex == 1 ) {\n submitText.style.opacity = 1;\n spinner.style.zIndex = -1;\n spinner.style.opacity = 0;\n } else {\n submitText.style.opacity = 0;\n spinner.style.zIndex = 1;\n spinner.style.opacity = 1;\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n if (formSource.outerHTML.indexOf('action=\"https://www.kulahub.net') !== -1 ||\n isFormHasDiviRedirect(formSource) ||\n formSource.outerHTML.indexOf('class=\"et_pb_contact_form') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://api.kit.com') !== -1 ||\n formSource.outerHTML.indexOf('activehosted.com') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://crm.zoho.com') !== -1\n ) {\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.name === elemTarget.name) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n\n return;\n }\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.addEventListener('load', function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n\n ctProtectKlaviyoForm();\n});\n\n/**\n * Protect klaviyo forms\n */\nfunction ctProtectKlaviyoForm() {\n if (!document.querySelector('link[rel=\"dns-prefetch\"][href=\"//static.klaviyo.com\"]')) {\n return;\n }\n\n let i = setInterval(() => {\n const klaviyoForms = document.querySelectorAll('form.klaviyo-form');\n if (klaviyoForms.length) {\n clearInterval(i);\n klaviyoForms.forEach((form, index) => {\n apbctProcessExternalFormKlaviyo(form, index, document);\n });\n }\n }, 500);\n}\n\n/**\n * Protect klaviyo forms\n * @param {HTMLElement} form\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormKlaviyo(form, iterator, documentObject) {\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (!btn) {\n return;\n }\n btn.disabled = true;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n let cover = document.createElement('div');\n cover.id = 'apbct-klaviyo-cover';\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.style.cursor = 'pointer';\n cover.onclick = function(e) {\n sendAjaxCheckingFormData(form);\n };\n btn.parentNode.style.position = 'relative';\n btn.parentNode.appendChild(cover);\n}\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.src.indexOf('hello.dubsado.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n const formClassName = typeof(formObj.className) == 'string' ? formObj.className : '';\n\n if (\n (\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form\n formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form\n ) ||\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227\n // ( formObj.classList !== undefined &&\n // !formObj.classList.contains('woocommerce-checkout') &&\n // formObj.hasAttribute('data-hs-cf-bound')\n // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form\n formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration\n formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration\n isFormHasDiviRedirect(formObj) || // Divi contact form\n formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form\n formAction.indexOf('wufoo.com') !== -1 || // Wufoo form\n formAction.indexOf('activehosted.com') !== -1 || // Activehosted form\n formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica\n (\n formAction.indexOf('whatsapp.com') !== -1 &&\n formClassName.indexOf('chaty') !== -1\n ) || // chaty plugin whatsapp form\n (\n formObj.classList !== undefined &&\n formObj.classList.contains('sp-element-container')\n ) || // Sendpulse form\n apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * This function detect if the form has DIVI redirect. If so, the form will work as external.\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isFormHasDiviRedirect(formObj) {\n let result = false;\n const diviRedirectedSignSet = document.querySelector('div[id^=\"et_pb_contact_form\"]');\n if (\n typeof formObj === 'object' && formObj !== null &&\n diviRedirectedSignSet !== null &&\n diviRedirectedSignSet.hasAttribute('data-redirect_url') &&\n diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' &&\n diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]') !== null\n ) {\n result = formObj === diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]');\n }\n return result;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n // MooSend spinner deactivate\n apbctMoosendSpinnerToggle(form);\n // hubspot flag\n const isHubSpotEmbedForm = (\n form.hasAttribute('action') &&\n form.getAttribute('action').indexOf('hsforms') !== -1\n );\n if ((result.apbct === undefined && result.data === undefined) ||\n (result.apbct !== undefined && ! +result.apbct.blocked)\n ) {\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Klaviyo integration\n if (form.classList !== undefined && form.classList.contains('klaviyo-form')) {\n const cover = document.getElementById('apbct-klaviyo-cover');\n if (cover) {\n cover.remove();\n }\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (btn) {\n btn.disabled = false;\n btn.click();\n }\n return;\n }\n\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Hubspot bounded integration\n if (isHubSpotEmbedForm) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal &&\n typeof formOriginal.id === 'string' &&\n formOriginal.id.indexOf('mautic') !== -1\n ) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n submButton = formOriginal.querySelectorAll('button#ck_subscribe_button');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if ((result.apbct !== undefined && +result.apbct.blocked) ||\n (result.data !== undefined && result.data.message !== undefined)\n ) {\n ctParseBlockMessage(result);\n // hubspot embed form needs to reload page to prevent forms mishandling\n if (isHubSpotEmbedForm) {\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n }\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Handles dynamic rendered forms by attaching an onsubmit event handler to them.\n *\n * @param {HTMLCollection} forms - A collection of form elements to be processed.\n * @param {Document} [documentObject=document] - The document object to use for querying elements.\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n const formIdAttr = form.getAttribute('id');\n if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) {\n neededFormIds.push(formIdAttr);\n }\n if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(formIdAttr);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\n }\n}\n\n/**\n * Checks if a form object is inside a div with a specified class name.\n *\n * @param {HTMLElement} formObj - The form element to check.\n * @param {string} divClassName - The class name of the div to look for.\n * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise.\n */\nfunction apbctIsFormInDiv(formObj, divClassName) {\n let parent = formObj.parentElement;\n while (parent) {\n if (parent.classList.contains(divClassName)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\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","fillDecodedNodes","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","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","smartQuizBuilder","bookingPress","isArray","e","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","Event","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","contains","_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","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_site_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","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","apbctProcessIframes","exclusionAction","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","mailerliteDetectedClass","apbctPrev","apbctFormOriginal","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctMoosendSpinnerToggle","buttonElement","submitText","zIndex","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","isFormHasDiviRedirect","elemSource","elemTarget","checked","apbctVal","ctProtectKlaviyoForm","klaviyoForms","index","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","currentDiv","preloader","botDetectorToken","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formClassName","firstChild","apbctIsFormInDiv","diviRedirectedSignSet","elems","isHubSpotEmbedForm","submitButton","formNew","mauticIntegration","submButton","reload","catchDynamicRenderedFormHandler","neededFormIds","formIdAttr","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","multiple","option","map","divClassName"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_full-protection.min.js b/js/apbct-public-bundle_full-protection.min.js index 686eb2726..a14288a25 100644 --- a/js/apbct-public-bundle_full-protection.min.js +++ b/js/apbct-public-bundle_full-protection.min.js @@ -1,2 +1,2 @@ -function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=r,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),r=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),s=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),f=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==s?s:b,o.apbct_headless=void 0!==d?d:f,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=r,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+c+"}",r.innerHTML+="#cleantalk-modal-close:before{"+n+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctProtectExternal(){for(let e=0;e{c.forEach(e=>{t.name===e.name&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})}):o.forEach(t=>{c.forEach(e=>{t.outerHTML===e.outerHTML&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})})}function ctProtectKlaviyoForm(){if(document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')){let t=setInterval(()=>{var e=document.querySelectorAll("form.klaviyo-form");e.length&&(clearInterval(t),e.forEach((e,t)=>{apbctProcessExternalFormKlaviyo(e,t,document)}))},500)}}function apbctProcessExternalFormKlaviyo(t,e,o){var c,n=t.querySelector('button[type="button"].needsclick');n&&(n.disabled=!0,(c=document.createElement("input")).name="action",c.value="cleantalk_force_ajax_check",c.type="hidden",t.appendChild(c),(c=document.createElement("div")).id="apbct-klaviyo-cover",c.style.width="100%",c.style.height="100%",c.style.background="black",c.style.opacity=0,c.style.position="absolute",c.style.top=0,c.style.cursor="pointer",c.onclick=function(e){sendAjaxCheckingFormData(t)},n.parentNode.style.position="relative",n.parentNode.appendChild(c))}function ctProtectOutsideIframe(){var e=document.querySelectorAll("iframe");0 strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,r,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",s.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(s.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(s.phrases.trpContent1+" "),r.append(s.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",s.trpContentLink),l.setAttribute("target","_blank"),l.text=s.phrases.trpContentLearnMore,r.append(" "),r.append(l)),i.append(r),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),apbctLocalStorage.set("apbct_iframes_protected",[]),window.addEventListener("load",function(){+ctPublic.settings__forms__check_external&&(setTimeout(function(){ctProtectExternal(),catchDynamicRenderedForm(),catchNextendSocialLoginForm(),ctProtectOutsideIframe()},2e3),ctProtectKlaviyoForm())});let ctProtectOutsideIframeCheck;function ctProtectOutsideIframeHandler(e){var t=document.createElement("div");t.style.width="100%",t.style.height="100%",t.style.background="black",t.style.opacity=0,t.style.position="absolute",t.style.top=0,t.onclick=function(t){if(void 0===ctProtectOutsideIframeCheck){var t=t.currentTarget,o=(t.style.opacity=.5,document.createElement("div"));o.className="apbct-iframe-preloader",t.appendChild(o);let e="";document.querySelector('[name*="ct_bot_detector_event_token"]')&&(e=document.querySelector('[name*="ct_bot_detector_event_token"]').value),apbct_public_sendAJAX({action:"cleantalk_outside_iframe_ajax_check",ct_no_cookie_hidden_field:getNoCookieData(),ct_bot_detector_event_token:e},{async:!1,callback:function(t){!(ctProtectOutsideIframeCheck=!0)===t.apbct.blocked?document.querySelectorAll("div.apbct-iframe-preloader").forEach(function(e){e.parentNode.remove()}):(document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.parentNode.style.color="white",e.parentNode.innerHTML+=t.apbct.comment}),document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.remove()}))}})}},e.parentNode.style.position="relative",e.parentNode.appendChild(t);let o=apbctLocalStorage.get("apbct_iframes_protected");!1===o&&(o=[]),void 0!==e.id&&(o.push(e.id),apbctLocalStorage.set("apbct_iframes_protected",o))}function catchNextendSocialLoginForm(){var e=document.getElementById("nsl-custom-login-form-main");e&&blockBtnNextendSocialLogin(e)}function blockBtnNextendSocialLogin(e){var t=e.querySelectorAll(".nsl-container-buttons a"),e=e.querySelectorAll('a[data-plugin="nsl"] .nsl-button');t.forEach(e=>{e.setAttribute("data-oauth-login-blocked","true"),e.addEventListener("click",e=>{e.preventDefault()})}),e.forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),ctCheckAjax(t)})})}function allowAjaxNextendSocialLogin(e){e.parentElement.setAttribute("data-oauth-login-blocked","false"),e.parentElement.click()}function forbiddenAjaxNextendSocialLogin(e,t){var o,e=e.parentElement;"false"==e.getAttribute("data-oauth-login-blocked")&&e.setAttribute("data-oauth-login-blocked","true"),document.querySelector(".ct-forbidden-msg")||((o=document.createElement("div")).className="ct-forbidden-msg",o.style.background="red",o.style.color="white",o.style.padding="5px",o.innerHTML=t,e.insertAdjacentElement("beforebegin",o))}function ctCheckAjax(t){apbct_public_sendAJAX({action:"cleantalk_nsl_ajax_check",ct_no_cookie_hidden_field:document.getElementsByName("ct_no_cookie_hidden_field")[0].value},{async:!1,callback:function(e){!1===e.apbct.blocked?allowAjaxNextendSocialLogin(t):forbiddenAjaxNextendSocialLogin(t,e.apbct.comment)}})}function isIntegratedForm(e){var t="string"==typeof e.action?e.action:"",o=null!==e.getAttribute("id")?e.getAttribute("id"):"",c="string"==typeof e.className?e.className:"";return!!(-1!==t.indexOf("app.convertkit.com")||-1!==t.indexOf("app.kit.com")||-1!==t.indexOf("api.kit.com")||void 0!==e.firstChild.classList&&e.firstChild.classList.contains("cb-form-group")||-1!==t.indexOf("mailerlite.com")||-1!==t.indexOf("colcolmail.co.uk")||-1!==t.indexOf("paypal.com")||-1!==t.indexOf("infusionsoft.com")||-1!==t.indexOf("secure2.convio.net")||-1!==t.indexOf("hookb.in")||-1!==t.indexOf("external.url")||-1!==t.indexOf("tp.media")||-1!==t.indexOf("flodesk.com")||-1!==t.indexOf("sendfox.com")||-1!==t.indexOf("aweber.com")||-1!==t.indexOf("secure.payu.com")||-1!==t.indexOf("mautic")||-1!==o.indexOf("mauticform_")||-1!==o.indexOf("ihf-contact-request-form")||-1!==t.indexOf("crm.zoho.com")||-1!==o.indexOf("delivra-external-form")||-1!==t.indexOf("eloqua.com")||-1!==t.indexOf("kulahub.net")||isFormHasDiviRedirect(e)||-1!==t.indexOf("eocampaign1.com")||-1!==t.indexOf("wufoo.com")||-1!==t.indexOf("activehosted.com")||-1!==t.indexOf("publisher.copernica.com")||-1!==t.indexOf("whatsapp.com")&&-1!==c.indexOf("chaty")||void 0!==e.classList&&e.classList.contains("sp-element-container")||apbctIsFormInDiv(e,"b24-form"))}function isFormHasDiviRedirect(e){let t=!1;var o=document.querySelector('div[id^="et_pb_contact_form"]');return t="object"==typeof e&&null!==e&&null!==o&&o.hasAttribute("data-redirect_url")&&""!==o.getAttribute("data-redirect_url")&&null!==o.querySelector('form[class^="et_pb_contact_form"]')?e===o.querySelector('form[class^="et_pb_contact_form"]'):t}function sendAjaxCheckingFormData(_){var e={};e[0]=apbct_collect_visible_fields(_),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=_.elements;(e=Array.prototype.slice.call(e)).forEach(function(e,t){""===e.name?o["input_"+t]=e.value:o[e.name]=e.value}),apbct_public_sendAJAX(o,{async:!1,callback:function(e,t,o,c){apbctMoosendSpinnerToggle(_);var n=_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of _.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of _.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of _.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==_.classList&&_.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=_.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==_.dataset.mailingListId){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),void(e=_.querySelector('[type="submit"]')).click()}if(_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("webto.salesforce.com")){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}if(n){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}var l,s,d=_,u=(_.parentElement.removeChild(_),_.apbctPrev),p=_.apbctFormOriginal;let e=!1;apbctReplaceInputsValuesFromOtherForm(d,p),p&&"string"==typeof p.id&&-1!==p.id.indexOf("mautic")&&(e=!0),u.after(p);for(l of p.querySelectorAll('input[name="apbct_visible_fields"]'))l.remove();for(s of p.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))s.remove();let t=p.querySelectorAll("button[type=submit]");if(0!==t.length)return t[0].click(),void(e&&setTimeout(function(){ctProtectExternal()},1500));if(0!==(t=p.querySelectorAll("input[type=submit]")).length)return void t[0].click();if(0!==(t=p.querySelectorAll('button[data-element="submit"]')).length)return void t[0].click();if(0!==(t=p.querySelectorAll("button#ck_subscribe_button")).length)return void t[0].click();0!==(t=p.querySelectorAll('input[type="image"][name="submit"]')).length&&t[0].click()}(void 0!==e.apbct&&+e.apbct.blocked||void 0!==e.data&&void 0!==e.data.message)&&(ctParseBlockMessage(e),n)&&setTimeout(function(){document.location.reload()},3e3)}})}function catchDynamicRenderedForm(){catchDynamicRenderedFormHandler(document.getElementsByTagName("form"));var t=document.getElementsByTagName("iframe");if(0e.selected).map(e=>e.value):"checkbox"===e.type||"radio"===e.type?e.checked||null:e.value}function apbctIsFormInDiv(e,t){let o=e.parentElement;for(;o;){if(o.classList.contains(t))return!0;o=o.parentElement}return!1}function ctCheckInternal(t){var e={},o=t.elements;let c;for(c in o)"submit"!==o[c].type&&void 0!==o[c].value&&""!==o[c].value&&(e[o[c].name]=t.elements[c].value);e.action="ct_check_internal",apbct_public_sendAJAX(e,{url:ctPublicFunctions._ajax_url,callback:function(e){if(!0!==e.success)return alert(e.data),!1;t.origSubmit()}})}function ctProtectInternalForms(){var t,o="",c="";for(let e=0;enull!==t.match(new RegExp(ctPublic.blog_home+".*"+e)))}document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); +class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=r,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),r=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),s=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),f=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==s?s:b,o.apbct_headless=void 0!==d?d:f,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=r,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+c+"}",r.innerHTML+="#cleantalk-modal-close:before{"+n+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctProtectExternal(){for(let e=0;e{c.forEach(e=>{t.name===e.name&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})}):o.forEach(t=>{c.forEach(e=>{t.outerHTML===e.outerHTML&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})})}function ctProtectKlaviyoForm(){if(document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')){let t=setInterval(()=>{var e=document.querySelectorAll("form.klaviyo-form");e.length&&(clearInterval(t),e.forEach((e,t)=>{apbctProcessExternalFormKlaviyo(e,t,document)}))},500)}}function apbctProcessExternalFormKlaviyo(t,e,o){var c,n=t.querySelector('button[type="button"].needsclick');n&&(n.disabled=!0,(c=document.createElement("input")).name="action",c.value="cleantalk_force_ajax_check",c.type="hidden",t.appendChild(c),(c=document.createElement("div")).id="apbct-klaviyo-cover",c.style.width="100%",c.style.height="100%",c.style.background="black",c.style.opacity=0,c.style.position="absolute",c.style.top=0,c.style.cursor="pointer",c.onclick=function(e){sendAjaxCheckingFormData(t)},n.parentNode.style.position="relative",n.parentNode.appendChild(c))}function ctProtectOutsideIframe(){var e=document.querySelectorAll("iframe");0 strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,r,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",s.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(s.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(s.phrases.trpContent1+" "),r.append(s.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",s.trpContentLink),l.setAttribute("target","_blank"),l.text=s.phrases.trpContentLearnMore,r.append(" "),r.append(l)),i.append(r),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),apbctLocalStorage.set("apbct_iframes_protected",[]),window.addEventListener("load",function(){+ctPublic.settings__forms__check_external&&(setTimeout(function(){ctProtectExternal(),catchDynamicRenderedForm(),catchNextendSocialLoginForm(),ctProtectOutsideIframe()},2e3),ctProtectKlaviyoForm())});let ctProtectOutsideIframeCheck;function ctProtectOutsideIframeHandler(e){var t=document.createElement("div");t.style.width="100%",t.style.height="100%",t.style.background="black",t.style.opacity=0,t.style.position="absolute",t.style.top=0,t.onclick=function(t){if(void 0===ctProtectOutsideIframeCheck){var t=t.currentTarget,o=(t.style.opacity=.5,document.createElement("div"));o.className="apbct-iframe-preloader",t.appendChild(o);let e="";document.querySelector('[name*="ct_bot_detector_event_token"]')&&(e=document.querySelector('[name*="ct_bot_detector_event_token"]').value),apbct_public_sendAJAX({action:"cleantalk_outside_iframe_ajax_check",ct_no_cookie_hidden_field:getNoCookieData(),ct_bot_detector_event_token:e},{async:!1,callback:function(t){!(ctProtectOutsideIframeCheck=!0)===t.apbct.blocked?document.querySelectorAll("div.apbct-iframe-preloader").forEach(function(e){e.parentNode.remove()}):(document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.parentNode.style.color="white",e.parentNode.innerHTML+=t.apbct.comment}),document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.remove()}))}})}},e.parentNode.style.position="relative",e.parentNode.appendChild(t);let o=apbctLocalStorage.get("apbct_iframes_protected");!1===o&&(o=[]),void 0!==e.id&&(o.push(e.id),apbctLocalStorage.set("apbct_iframes_protected",o))}function catchNextendSocialLoginForm(){var e=document.getElementById("nsl-custom-login-form-main");e&&blockBtnNextendSocialLogin(e)}function blockBtnNextendSocialLogin(e){var t=e.querySelectorAll(".nsl-container-buttons a"),e=e.querySelectorAll('a[data-plugin="nsl"] .nsl-button');t.forEach(e=>{e.setAttribute("data-oauth-login-blocked","true"),e.addEventListener("click",e=>{e.preventDefault()})}),e.forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),ctCheckAjax(t)})})}function allowAjaxNextendSocialLogin(e){e.parentElement.setAttribute("data-oauth-login-blocked","false"),e.parentElement.click()}function forbiddenAjaxNextendSocialLogin(e,t){var o,e=e.parentElement;"false"==e.getAttribute("data-oauth-login-blocked")&&e.setAttribute("data-oauth-login-blocked","true"),document.querySelector(".ct-forbidden-msg")||((o=document.createElement("div")).className="ct-forbidden-msg",o.style.background="red",o.style.color="white",o.style.padding="5px",o.innerHTML=t,e.insertAdjacentElement("beforebegin",o))}function ctCheckAjax(t){apbct_public_sendAJAX({action:"cleantalk_nsl_ajax_check",ct_no_cookie_hidden_field:document.getElementsByName("ct_no_cookie_hidden_field")[0].value},{async:!1,callback:function(e){!1===e.apbct.blocked?allowAjaxNextendSocialLogin(t):forbiddenAjaxNextendSocialLogin(t,e.apbct.comment)}})}function isIntegratedForm(e){var t="string"==typeof e.action?e.action:"",o=null!==e.getAttribute("id")?e.getAttribute("id"):"",c="string"==typeof e.className?e.className:"";return!!(-1!==t.indexOf("app.convertkit.com")||-1!==t.indexOf("app.kit.com")||-1!==t.indexOf("api.kit.com")||void 0!==e.firstChild.classList&&e.firstChild.classList.contains("cb-form-group")||-1!==t.indexOf("mailerlite.com")||-1!==t.indexOf("colcolmail.co.uk")||-1!==t.indexOf("paypal.com")||-1!==t.indexOf("infusionsoft.com")||-1!==t.indexOf("secure2.convio.net")||-1!==t.indexOf("hookb.in")||-1!==t.indexOf("external.url")||-1!==t.indexOf("tp.media")||-1!==t.indexOf("flodesk.com")||-1!==t.indexOf("sendfox.com")||-1!==t.indexOf("aweber.com")||-1!==t.indexOf("secure.payu.com")||-1!==t.indexOf("mautic")||-1!==o.indexOf("mauticform_")||-1!==o.indexOf("ihf-contact-request-form")||-1!==t.indexOf("crm.zoho.com")||-1!==o.indexOf("delivra-external-form")||-1!==t.indexOf("eloqua.com")||-1!==t.indexOf("kulahub.net")||isFormHasDiviRedirect(e)||-1!==t.indexOf("eocampaign1.com")||-1!==t.indexOf("wufoo.com")||-1!==t.indexOf("activehosted.com")||-1!==t.indexOf("publisher.copernica.com")||-1!==t.indexOf("whatsapp.com")&&-1!==c.indexOf("chaty")||void 0!==e.classList&&e.classList.contains("sp-element-container")||apbctIsFormInDiv(e,"b24-form"))}function isFormHasDiviRedirect(e){let t=!1;var o=document.querySelector('div[id^="et_pb_contact_form"]');return t="object"==typeof e&&null!==e&&null!==o&&o.hasAttribute("data-redirect_url")&&""!==o.getAttribute("data-redirect_url")&&null!==o.querySelector('form[class^="et_pb_contact_form"]')?e===o.querySelector('form[class^="et_pb_contact_form"]'):t}function sendAjaxCheckingFormData(_){var e={};e[0]=apbct_collect_visible_fields(_),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=_.elements;(e=Array.prototype.slice.call(e)).forEach(function(e,t){""===e.name?o["input_"+t]=e.value:o[e.name]=e.value}),apbct_public_sendAJAX(o,{async:!1,callback:function(e,t,o,c){apbctMoosendSpinnerToggle(_);var n=_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of _.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of _.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of _.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==_.classList&&_.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=_.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==_.dataset.mailingListId){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),void(e=_.querySelector('[type="submit"]')).click()}if(_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("webto.salesforce.com")){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}if(n){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}var l,s,d=_,u=(_.parentElement.removeChild(_),_.apbctPrev),p=_.apbctFormOriginal;let e=!1;apbctReplaceInputsValuesFromOtherForm(d,p),p&&"string"==typeof p.id&&-1!==p.id.indexOf("mautic")&&(e=!0),u.after(p);for(l of p.querySelectorAll('input[name="apbct_visible_fields"]'))l.remove();for(s of p.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))s.remove();let t=p.querySelectorAll("button[type=submit]");if(0!==t.length)return t[0].click(),void(e&&setTimeout(function(){ctProtectExternal()},1500));if(0!==(t=p.querySelectorAll("input[type=submit]")).length)return void t[0].click();if(0!==(t=p.querySelectorAll('button[data-element="submit"]')).length)return void t[0].click();if(0!==(t=p.querySelectorAll("button#ck_subscribe_button")).length)return void t[0].click();0!==(t=p.querySelectorAll('input[type="image"][name="submit"]')).length&&t[0].click()}(void 0!==e.apbct&&+e.apbct.blocked||void 0!==e.data&&void 0!==e.data.message)&&(ctParseBlockMessage(e),n)&&setTimeout(function(){document.location.reload()},3e3)}})}function catchDynamicRenderedForm(){catchDynamicRenderedFormHandler(document.getElementsByTagName("form"));var t=document.getElementsByTagName("iframe");if(0e.selected).map(e=>e.value):"checkbox"===e.type||"radio"===e.type?e.checked||null:e.value}function apbctIsFormInDiv(e,t){let o=e.parentElement;for(;o;){if(o.classList.contains(t))return!0;o=o.parentElement}return!1}function ctCheckInternal(t){var e={},o=t.elements;let c;for(c in o)"submit"!==o[c].type&&void 0!==o[c].value&&""!==o[c].value&&(e[o[c].name]=t.elements[c].value);e.action="ct_check_internal",apbct_public_sendAJAX(e,{url:ctPublicFunctions._ajax_url,callback:function(e){if(!0!==e.success)return alert(e.data),!1;t.origSubmit()}})}function ctProtectInternalForms(){var t,o="",c="";for(let e=0;enull!==t.match(new RegExp(ctPublic.blog_home+".*"+e)))}document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); //# sourceMappingURL=apbct-public-bundle_full-protection.min.js.map diff --git a/js/apbct-public-bundle_full-protection.min.js.map b/js/apbct-public-bundle_full-protection.min.js.map index e17e3d62d..62ca7a81a 100644 --- a/js/apbct-public-bundle_full-protection.min.js.map +++ b/js/apbct-public-bundle_full-protection.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public-bundle_full-protection.min.js","sources":["apbct-public-bundle_full-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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, 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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' &&\n (currentForm.action.indexOf('webto.salesforce.com') !== -1)) ||\n (typeof(currentForm.action) == 'string' &&\n currentForm.querySelector('[href*=\"activecampaign\"]')) ||\n (\n typeof(currentForm.action) == 'string' &&\n currentForm.action.indexOf('hsforms.com') !== -1 &&\n currentForm.getAttribute('data-hs-cf-bound')\n )\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n 'et_pb_searchform', // integration with elementor-search-form\n ];\n\n const exclusionsByAction = [\n 'paypal.com/cgi-bin/webscr', // search forms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n if (currentForm.getAttribute('action') !== null) {\n exclusionsByAction.forEach(function(exclusionAction) {\n if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) {\n result = true;\n }\n });\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n if (currentForm.getAttribute('data-hs-cf-bound')) {\n result = false;\n } else {\n result = true;\n }\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n\n let mailerliteSubmitButton = null;\n if ( mailerliteDetectedClass ) {\n mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n return;\n }\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n\n // MooSend spinner activate\n apbctMoosendSpinnerToggle(event.currentTarget);\n\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Activate or deactivate spinner for Moosend form during request checking\n * @param {HTMLElement} form\n */\nfunction apbctMoosendSpinnerToggle(form) {\n const buttonElement = form.querySelector('button[type=\"submit\"]');\n if ( buttonElement ) {\n const spinner = buttonElement.querySelector('i');\n const submitText = buttonElement.querySelector('span');\n if (spinner && submitText) {\n if ( spinner.style.zIndex == 1 ) {\n submitText.style.opacity = 1;\n spinner.style.zIndex = -1;\n spinner.style.opacity = 0;\n } else {\n submitText.style.opacity = 0;\n spinner.style.zIndex = 1;\n spinner.style.opacity = 1;\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n if (formSource.outerHTML.indexOf('action=\"https://www.kulahub.net') !== -1 ||\n isFormHasDiviRedirect(formSource) ||\n formSource.outerHTML.indexOf('class=\"et_pb_contact_form') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://api.kit.com') !== -1 ||\n formSource.outerHTML.indexOf('activehosted.com') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://crm.zoho.com') !== -1\n ) {\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.name === elemTarget.name) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n\n return;\n }\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.addEventListener('load', function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n\n ctProtectKlaviyoForm();\n});\n\n/**\n * Protect klaviyo forms\n */\nfunction ctProtectKlaviyoForm() {\n if (!document.querySelector('link[rel=\"dns-prefetch\"][href=\"//static.klaviyo.com\"]')) {\n return;\n }\n\n let i = setInterval(() => {\n const klaviyoForms = document.querySelectorAll('form.klaviyo-form');\n if (klaviyoForms.length) {\n clearInterval(i);\n klaviyoForms.forEach((form, index) => {\n apbctProcessExternalFormKlaviyo(form, index, document);\n });\n }\n }, 500);\n}\n\n/**\n * Protect klaviyo forms\n * @param {HTMLElement} form\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormKlaviyo(form, iterator, documentObject) {\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (!btn) {\n return;\n }\n btn.disabled = true;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n let cover = document.createElement('div');\n cover.id = 'apbct-klaviyo-cover';\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.style.cursor = 'pointer';\n cover.onclick = function(e) {\n sendAjaxCheckingFormData(form);\n };\n btn.parentNode.style.position = 'relative';\n btn.parentNode.appendChild(cover);\n}\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.src.indexOf('hello.dubsado.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n const formClassName = typeof(formObj.className) == 'string' ? formObj.className : '';\n\n if (\n (\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form\n formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form\n ) ||\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227\n // ( formObj.classList !== undefined &&\n // !formObj.classList.contains('woocommerce-checkout') &&\n // formObj.hasAttribute('data-hs-cf-bound')\n // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form\n formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration\n formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration\n isFormHasDiviRedirect(formObj) || // Divi contact form\n formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form\n formAction.indexOf('wufoo.com') !== -1 || // Wufoo form\n formAction.indexOf('activehosted.com') !== -1 || // Activehosted form\n formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica\n (\n formAction.indexOf('whatsapp.com') !== -1 &&\n formClassName.indexOf('chaty') !== -1\n ) || // chaty plugin whatsapp form\n (\n formObj.classList !== undefined &&\n formObj.classList.contains('sp-element-container')\n ) || // Sendpulse form\n apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * This function detect if the form has DIVI redirect. If so, the form will work as external.\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isFormHasDiviRedirect(formObj) {\n let result = false;\n const diviRedirectedSignSet = document.querySelector('div[id^=\"et_pb_contact_form\"]');\n if (\n typeof formObj === 'object' && formObj !== null &&\n diviRedirectedSignSet !== null &&\n diviRedirectedSignSet.hasAttribute('data-redirect_url') &&\n diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' &&\n diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]') !== null\n ) {\n result = formObj === diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]');\n }\n return result;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n // MooSend spinner deactivate\n apbctMoosendSpinnerToggle(form);\n // hubspot flag\n const isHubSpotEmbedForm = (\n form.hasAttribute('action') &&\n form.getAttribute('action').indexOf('hsforms') !== -1\n );\n if ((result.apbct === undefined && result.data === undefined) ||\n (result.apbct !== undefined && ! +result.apbct.blocked)\n ) {\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Klaviyo integration\n if (form.classList !== undefined && form.classList.contains('klaviyo-form')) {\n const cover = document.getElementById('apbct-klaviyo-cover');\n if (cover) {\n cover.remove();\n }\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (btn) {\n btn.disabled = false;\n btn.click();\n }\n return;\n }\n\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Hubspot bounded integration\n if (isHubSpotEmbedForm) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal &&\n typeof formOriginal.id === 'string' &&\n formOriginal.id.indexOf('mautic') !== -1\n ) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n submButton = formOriginal.querySelectorAll('button#ck_subscribe_button');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if ((result.apbct !== undefined && +result.apbct.blocked) ||\n (result.data !== undefined && result.data.message !== undefined)\n ) {\n ctParseBlockMessage(result);\n // hubspot embed form needs to reload page to prevent forms mishandling\n if (isHubSpotEmbedForm) {\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n }\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Handles dynamic rendered forms by attaching an onsubmit event handler to them.\n *\n * @param {HTMLCollection} forms - A collection of form elements to be processed.\n * @param {Document} [documentObject=document] - The document object to use for querying elements.\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n const formIdAttr = form.getAttribute('id');\n if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) {\n neededFormIds.push(formIdAttr);\n }\n if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(formIdAttr);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\n }\n}\n\n/**\n * Checks if a form object is inside a div with a specified class name.\n *\n * @param {HTMLElement} formObj - The form element to check.\n * @param {string} divClassName - The class name of the div to look for.\n * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise.\n */\nfunction apbctIsFormInDiv(formObj, divClassName) {\n let parent = formObj.parentElement;\n while (parent) {\n if (parent.classList.contains(divClassName)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\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 if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n ctProtectInternalForms();\n }, 500);\n\n document.addEventListener('apbctForceProtectionAllowed', function() {\n ctProtectInternalForms();\n });\n});\n\n/**\n * Protect internal forms\n * @return {void}\n */\nfunction ctProtectInternalForms() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\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}\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","fillDecodedNodes","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","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","smartQuizBuilder","bookingPress","isArray","e","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","Event","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","contains","_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","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_site_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","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","apbctProcessIframes","exclusionAction","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","mailerliteDetectedClass","apbctPrev","apbctFormOriginal","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctMoosendSpinnerToggle","buttonElement","submitText","zIndex","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","isFormHasDiviRedirect","elemSource","elemTarget","checked","apbctVal","ctProtectKlaviyoForm","klaviyoForms","index","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","currentDiv","preloader","botDetectorToken","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formClassName","firstChild","apbctIsFormInDiv","diviRedirectedSignSet","elems","isHubSpotEmbedForm","submitButton","formNew","mauticIntegration","submButton","reload","catchDynamicRenderedFormHandler","neededFormIds","formIdAttr","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","multiple","option","map","divClassName","ctCheckInternal","currForm","ctData","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","some","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"apbct-public-bundle_full-protection.min.js","sources":["apbct-public-bundle_full-protection.js"],"sourcesContent":["/**\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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' &&\n (currentForm.action.indexOf('webto.salesforce.com') !== -1)) ||\n (typeof(currentForm.action) == 'string' &&\n currentForm.querySelector('[href*=\"activecampaign\"]')) ||\n (\n typeof(currentForm.action) == 'string' &&\n currentForm.action.indexOf('hsforms.com') !== -1 &&\n currentForm.getAttribute('data-hs-cf-bound')\n )\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n 'et_pb_searchform', // integration with elementor-search-form\n ];\n\n const exclusionsByAction = [\n 'paypal.com/cgi-bin/webscr', // search forms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n if (currentForm.getAttribute('action') !== null) {\n exclusionsByAction.forEach(function(exclusionAction) {\n if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) {\n result = true;\n }\n });\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n if (currentForm.getAttribute('data-hs-cf-bound')) {\n result = false;\n } else {\n result = true;\n }\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n\n let mailerliteSubmitButton = null;\n if ( mailerliteDetectedClass ) {\n mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n return;\n }\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n\n // MooSend spinner activate\n apbctMoosendSpinnerToggle(event.currentTarget);\n\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Activate or deactivate spinner for Moosend form during request checking\n * @param {HTMLElement} form\n */\nfunction apbctMoosendSpinnerToggle(form) {\n const buttonElement = form.querySelector('button[type=\"submit\"]');\n if ( buttonElement ) {\n const spinner = buttonElement.querySelector('i');\n const submitText = buttonElement.querySelector('span');\n if (spinner && submitText) {\n if ( spinner.style.zIndex == 1 ) {\n submitText.style.opacity = 1;\n spinner.style.zIndex = -1;\n spinner.style.opacity = 0;\n } else {\n submitText.style.opacity = 0;\n spinner.style.zIndex = 1;\n spinner.style.opacity = 1;\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n if (formSource.outerHTML.indexOf('action=\"https://www.kulahub.net') !== -1 ||\n isFormHasDiviRedirect(formSource) ||\n formSource.outerHTML.indexOf('class=\"et_pb_contact_form') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://api.kit.com') !== -1 ||\n formSource.outerHTML.indexOf('activehosted.com') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://crm.zoho.com') !== -1\n ) {\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.name === elemTarget.name) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n\n return;\n }\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.addEventListener('load', function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n\n ctProtectKlaviyoForm();\n});\n\n/**\n * Protect klaviyo forms\n */\nfunction ctProtectKlaviyoForm() {\n if (!document.querySelector('link[rel=\"dns-prefetch\"][href=\"//static.klaviyo.com\"]')) {\n return;\n }\n\n let i = setInterval(() => {\n const klaviyoForms = document.querySelectorAll('form.klaviyo-form');\n if (klaviyoForms.length) {\n clearInterval(i);\n klaviyoForms.forEach((form, index) => {\n apbctProcessExternalFormKlaviyo(form, index, document);\n });\n }\n }, 500);\n}\n\n/**\n * Protect klaviyo forms\n * @param {HTMLElement} form\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormKlaviyo(form, iterator, documentObject) {\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (!btn) {\n return;\n }\n btn.disabled = true;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n let cover = document.createElement('div');\n cover.id = 'apbct-klaviyo-cover';\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.style.cursor = 'pointer';\n cover.onclick = function(e) {\n sendAjaxCheckingFormData(form);\n };\n btn.parentNode.style.position = 'relative';\n btn.parentNode.appendChild(cover);\n}\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.src.indexOf('hello.dubsado.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n const formClassName = typeof(formObj.className) == 'string' ? formObj.className : '';\n\n if (\n (\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form\n formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form\n ) ||\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227\n // ( formObj.classList !== undefined &&\n // !formObj.classList.contains('woocommerce-checkout') &&\n // formObj.hasAttribute('data-hs-cf-bound')\n // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form\n formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration\n formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration\n isFormHasDiviRedirect(formObj) || // Divi contact form\n formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form\n formAction.indexOf('wufoo.com') !== -1 || // Wufoo form\n formAction.indexOf('activehosted.com') !== -1 || // Activehosted form\n formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica\n (\n formAction.indexOf('whatsapp.com') !== -1 &&\n formClassName.indexOf('chaty') !== -1\n ) || // chaty plugin whatsapp form\n (\n formObj.classList !== undefined &&\n formObj.classList.contains('sp-element-container')\n ) || // Sendpulse form\n apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * This function detect if the form has DIVI redirect. If so, the form will work as external.\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isFormHasDiviRedirect(formObj) {\n let result = false;\n const diviRedirectedSignSet = document.querySelector('div[id^=\"et_pb_contact_form\"]');\n if (\n typeof formObj === 'object' && formObj !== null &&\n diviRedirectedSignSet !== null &&\n diviRedirectedSignSet.hasAttribute('data-redirect_url') &&\n diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' &&\n diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]') !== null\n ) {\n result = formObj === diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]');\n }\n return result;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n // MooSend spinner deactivate\n apbctMoosendSpinnerToggle(form);\n // hubspot flag\n const isHubSpotEmbedForm = (\n form.hasAttribute('action') &&\n form.getAttribute('action').indexOf('hsforms') !== -1\n );\n if ((result.apbct === undefined && result.data === undefined) ||\n (result.apbct !== undefined && ! +result.apbct.blocked)\n ) {\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Klaviyo integration\n if (form.classList !== undefined && form.classList.contains('klaviyo-form')) {\n const cover = document.getElementById('apbct-klaviyo-cover');\n if (cover) {\n cover.remove();\n }\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (btn) {\n btn.disabled = false;\n btn.click();\n }\n return;\n }\n\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Hubspot bounded integration\n if (isHubSpotEmbedForm) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal &&\n typeof formOriginal.id === 'string' &&\n formOriginal.id.indexOf('mautic') !== -1\n ) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n submButton = formOriginal.querySelectorAll('button#ck_subscribe_button');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if ((result.apbct !== undefined && +result.apbct.blocked) ||\n (result.data !== undefined && result.data.message !== undefined)\n ) {\n ctParseBlockMessage(result);\n // hubspot embed form needs to reload page to prevent forms mishandling\n if (isHubSpotEmbedForm) {\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n }\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Handles dynamic rendered forms by attaching an onsubmit event handler to them.\n *\n * @param {HTMLCollection} forms - A collection of form elements to be processed.\n * @param {Document} [documentObject=document] - The document object to use for querying elements.\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n const formIdAttr = form.getAttribute('id');\n if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) {\n neededFormIds.push(formIdAttr);\n }\n if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(formIdAttr);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\n }\n}\n\n/**\n * Checks if a form object is inside a div with a specified class name.\n *\n * @param {HTMLElement} formObj - The form element to check.\n * @param {string} divClassName - The class name of the div to look for.\n * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise.\n */\nfunction apbctIsFormInDiv(formObj, divClassName) {\n let parent = formObj.parentElement;\n while (parent) {\n if (parent.classList.contains(divClassName)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\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 if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n ctProtectInternalForms();\n }, 500);\n\n document.addEventListener('apbctForceProtectionAllowed', function() {\n ctProtectInternalForms();\n });\n});\n\n/**\n * Protect internal forms\n * @return {void}\n */\nfunction ctProtectInternalForms() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\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}\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":["ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","event","constructor","this","select","HTMLCollection","Array","prototype","slice","call","document","querySelectorAll","deselect","addElement","elemToAdd","push","elem","reduce","css","style","getRaw","styleName","Object","hasOwn","DomStyleName","replace","group","toUpperCase","let","i","length","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","classList","add","className","removeClass","remove","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","addEventListener","onChecker","bind","target","querySelector","stopPropagation","ready","callback","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","data","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","createElement","Boolean","HTMLElement","HTMLUnknownElement","indexOf","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","append","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","setTimeout","fadeOut","ctProcessError","msg","url","log","ctJsErrors","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","JSON","stringify","errorObj","error","location","href","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","selectActualNonce","defaultNonce","ctPublicFunctions","hasOwnProperty","_fresh_nonce","data__ajax_type","_ajax_nonce","_rest_nonce","apbct","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","method","async","user","password","button","spinner","progressbar","context","onErrorCallback","responseType","headers","timeout","methods_to_convert_data_to_URL","body","http_code","status_text","parameters","key","prepare","keys","deleteDoubleJSONEncoding","convertData","console","open","setHeaders","onreadystatechange","isWpNonceError","getFreshNonceAndRerunXHR","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","setAttribute","cursor","complete","status","statusText","removeAttribute","on_ready_state_change","on_progress","response","restErrror","ajaxErrror","readyState","initialRequestParams","noncePrev","spbc_remote_call_action","plugin_name","nonce_prev","initial_request_params","notJson","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","outerHTML","innerHTML","addClicks","trackMouseMovement","ctCollectingUserActivityData","clicks","selected","mouseMovementsInsideForm","ctSetCookie","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","forEach","item","apbctLocalStorage","set","ctSetAlternativeCookie","ctPublic","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","encodeURIComponent","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bloomPopup","pafeFormsFormElementor","otterForm","smartQuizBuilder","bookingPress","isArray","getJavascriptClientData","e","apbct_force_alt_cookies","apbct_pixel_url","decodeURIComponent","apbct_public_sendREST","apbct_public_sendAJAX","action","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","element","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","ApbctForceProtection","wrappers","findWrappers","checkBot","event_javascript_data","post_url","referrer","checkBotCallback","result","decodeForms","allow","Event","showMessageForBot","form","wrapper","dataset","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","removeEventListener","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","getElementById","setEventTokenField","clearInterval","checkEmail","currentEmail","test","email","now","checkEmailExist","hint","getResultCheckEmailExist","viewCheckEmailExist","envelope","text_result","state","textResult","inputEmail","top","getBoundingClientRect","ctEmailExistSetElementsPositions","onmouseover","textContent","height","color","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","split","trim","pixel__url","data__email_check_before_post","data__email_check_exist_post","tokenForForceAlt","encodedEmailNodes","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","contains","preventDefault","ctFillDecodedEmailHandler","_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","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_site_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","comment","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","id","hiddenFieldType","formAction","j","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","formClasses","classExists","classForm","sessionCurrentPage","el","loading","opened","opening","ignoreURLConvert","load","apbct_admin_sendAJAX","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","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","appendChild","apbctProcessIframes","exclusionAction","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","mailerliteDetectedClass","apbctPrev","apbctFormOriginal","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctMoosendSpinnerToggle","buttonElement","submitText","zIndex","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","isFormHasDiviRedirect","elemSource","elemTarget","checked","apbctVal","ctProtectKlaviyoForm","klaviyoForms","index","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","popup","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","currentDiv","preloader","botDetectorToken","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","click","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formClassName","firstChild","apbctIsFormInDiv","diviRedirectedSignSet","elems","isHubSpotEmbedForm","submitButton","formNew","mauticIntegration","submButton","reload","catchDynamicRenderedFormHandler","neededFormIds","formIdAttr","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","multiple","option","map","divClassName","ctCheckInternal","currForm","ctData","success","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","some","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_full-protection_comm-func.min.js b/js/apbct-public-bundle_full-protection_comm-func.min.js new file mode 100644 index 000000000..0e6fd0971 --- /dev/null +++ b/js/apbct-public-bundle_full-protection_comm-func.min.js @@ -0,0 +1,2 @@ +function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=r,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),r=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),s=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),f=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==s?s:b,o.apbct_headless=void 0!==d?d:f,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=r,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},r=document.createElement("style"),i=(r.setAttribute("id","cleantalk-modal-styles"),r.innerHTML="body.cleantalk-modal-opened{"+i+"}",r.innerHTML+="#cleantalk-modal-overlay{"+t+"}",r.innerHTML+="#cleantalk-modal-close{"+c+"}",r.innerHTML+="#cleantalk-modal-close:before{"+n+"}",r.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(r),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctProtectExternal(){for(let e=0;e{c.forEach(e=>{t.name===e.name&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})}):o.forEach(t=>{c.forEach(e=>{t.outerHTML===e.outerHTML&&("checkbox"===e.type||"radio"===e.type?e.checked=apbctVal(t):e.value=apbctVal(t))})})}function ctProtectKlaviyoForm(){if(document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')){let t=setInterval(()=>{var e=document.querySelectorAll("form.klaviyo-form");e.length&&(clearInterval(t),e.forEach((e,t)=>{apbctProcessExternalFormKlaviyo(e,t,document)}))},500)}}function apbctProcessExternalFormKlaviyo(t,e,o){var c,n=t.querySelector('button[type="button"].needsclick');n&&(n.disabled=!0,(c=document.createElement("input")).name="action",c.value="cleantalk_force_ajax_check",c.type="hidden",t.appendChild(c),(c=document.createElement("div")).id="apbct-klaviyo-cover",c.style.width="100%",c.style.height="100%",c.style.background="black",c.style.opacity=0,c.style.position="absolute",c.style.top=0,c.style.cursor="pointer",c.onclick=function(e){sendAjaxCheckingFormData(t)},n.parentNode.style.position="relative",n.parentNode.appendChild(c))}function ctProtectOutsideIframe(){var e=document.querySelectorAll("iframe");0 strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,r,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",s.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(s.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(r=document.createElement("span")).append(s.phrases.trpContent1+" "),r.append(s.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",s.trpContentLink),l.setAttribute("target","_blank"),l.text=s.phrases.trpContentLearnMore,r.append(" "),r.append(l)),i.append(r),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),apbctLocalStorage.set("apbct_iframes_protected",[]),window.addEventListener("load",function(){+ctPublic.settings__forms__check_external&&(setTimeout(function(){ctProtectExternal(),catchDynamicRenderedForm(),catchNextendSocialLoginForm(),ctProtectOutsideIframe()},2e3),ctProtectKlaviyoForm())});let ctProtectOutsideIframeCheck;function ctProtectOutsideIframeHandler(e){var t=document.createElement("div");t.style.width="100%",t.style.height="100%",t.style.background="black",t.style.opacity=0,t.style.position="absolute",t.style.top=0,t.onclick=function(t){if(void 0===ctProtectOutsideIframeCheck){var t=t.currentTarget,o=(t.style.opacity=.5,document.createElement("div"));o.className="apbct-iframe-preloader",t.appendChild(o);let e="";document.querySelector('[name*="ct_bot_detector_event_token"]')&&(e=document.querySelector('[name*="ct_bot_detector_event_token"]').value),apbct_public_sendAJAX({action:"cleantalk_outside_iframe_ajax_check",ct_no_cookie_hidden_field:getNoCookieData(),ct_bot_detector_event_token:e},{async:!1,callback:function(t){!(ctProtectOutsideIframeCheck=!0)===t.apbct.blocked?document.querySelectorAll("div.apbct-iframe-preloader").forEach(function(e){e.parentNode.remove()}):(document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.parentNode.style.color="white",e.parentNode.innerHTML+=t.apbct.comment}),document.querySelectorAll("div.apbct-iframe-preloader").forEach(e=>{e.remove()}))}})}},e.parentNode.style.position="relative",e.parentNode.appendChild(t);let o=apbctLocalStorage.get("apbct_iframes_protected");!1===o&&(o=[]),void 0!==e.id&&(o.push(e.id),apbctLocalStorage.set("apbct_iframes_protected",o))}function catchNextendSocialLoginForm(){var e=document.getElementById("nsl-custom-login-form-main");e&&blockBtnNextendSocialLogin(e)}function blockBtnNextendSocialLogin(e){var t=e.querySelectorAll(".nsl-container-buttons a"),e=e.querySelectorAll('a[data-plugin="nsl"] .nsl-button');t.forEach(e=>{e.setAttribute("data-oauth-login-blocked","true"),e.addEventListener("click",e=>{e.preventDefault()})}),e.forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),ctCheckAjax(t)})})}function allowAjaxNextendSocialLogin(e){e.parentElement.setAttribute("data-oauth-login-blocked","false"),e.parentElement.click()}function forbiddenAjaxNextendSocialLogin(e,t){var o,e=e.parentElement;"false"==e.getAttribute("data-oauth-login-blocked")&&e.setAttribute("data-oauth-login-blocked","true"),document.querySelector(".ct-forbidden-msg")||((o=document.createElement("div")).className="ct-forbidden-msg",o.style.background="red",o.style.color="white",o.style.padding="5px",o.innerHTML=t,e.insertAdjacentElement("beforebegin",o))}function ctCheckAjax(t){apbct_public_sendAJAX({action:"cleantalk_nsl_ajax_check",ct_no_cookie_hidden_field:document.getElementsByName("ct_no_cookie_hidden_field")[0].value},{async:!1,callback:function(e){!1===e.apbct.blocked?allowAjaxNextendSocialLogin(t):forbiddenAjaxNextendSocialLogin(t,e.apbct.comment)}})}function isIntegratedForm(e){var t="string"==typeof e.action?e.action:"",o=null!==e.getAttribute("id")?e.getAttribute("id"):"",c="string"==typeof e.className?e.className:"";return!!(-1!==t.indexOf("app.convertkit.com")||-1!==t.indexOf("app.kit.com")||-1!==t.indexOf("api.kit.com")||void 0!==e.firstChild.classList&&e.firstChild.classList.contains("cb-form-group")||-1!==t.indexOf("mailerlite.com")||-1!==t.indexOf("colcolmail.co.uk")||-1!==t.indexOf("paypal.com")||-1!==t.indexOf("infusionsoft.com")||-1!==t.indexOf("secure2.convio.net")||-1!==t.indexOf("hookb.in")||-1!==t.indexOf("external.url")||-1!==t.indexOf("tp.media")||-1!==t.indexOf("flodesk.com")||-1!==t.indexOf("sendfox.com")||-1!==t.indexOf("aweber.com")||-1!==t.indexOf("secure.payu.com")||-1!==t.indexOf("mautic")||-1!==o.indexOf("mauticform_")||-1!==o.indexOf("ihf-contact-request-form")||-1!==t.indexOf("crm.zoho.com")||-1!==o.indexOf("delivra-external-form")||-1!==t.indexOf("eloqua.com")||-1!==t.indexOf("kulahub.net")||isFormHasDiviRedirect(e)||-1!==t.indexOf("eocampaign1.com")||-1!==t.indexOf("wufoo.com")||-1!==t.indexOf("activehosted.com")||-1!==t.indexOf("publisher.copernica.com")||-1!==t.indexOf("whatsapp.com")&&-1!==c.indexOf("chaty")||void 0!==e.classList&&e.classList.contains("sp-element-container")||apbctIsFormInDiv(e,"b24-form"))}function isFormHasDiviRedirect(e){let t=!1;var o=document.querySelector('div[id^="et_pb_contact_form"]');return t="object"==typeof e&&null!==e&&null!==o&&o.hasAttribute("data-redirect_url")&&""!==o.getAttribute("data-redirect_url")&&null!==o.querySelector('form[class^="et_pb_contact_form"]')?e===o.querySelector('form[class^="et_pb_contact_form"]'):t}function sendAjaxCheckingFormData(_){var e={};e[0]=apbct_collect_visible_fields(_),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=_.elements;(e=Array.prototype.slice.call(e)).forEach(function(e,t){""===e.name?o["input_"+t]=e.value:o[e.name]=e.value}),apbct_public_sendAJAX(o,{async:!1,callback:function(e,t,o,c){apbctMoosendSpinnerToggle(_);var n=_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of _.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of _.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of _.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==_.classList&&_.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=_.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==_.dataset.mailingListId){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),void(e=_.querySelector('[type="submit"]')).click()}if(_.hasAttribute("action")&&-1!==_.getAttribute("action").indexOf("webto.salesforce.com")){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}if(n){let e=_.querySelector('[type="submit"]');return e.remove(),_.apbctParent.appendChild(_.submitButtonOriginal),_.onsubmit=_.onsubmitOriginal,void(e=_.querySelector('[type="submit"]')).click()}var l,s,d=_,u=(_.parentElement.removeChild(_),_.apbctPrev),p=_.apbctFormOriginal;let e=!1;apbctReplaceInputsValuesFromOtherForm(d,p),p&&"string"==typeof p.id&&-1!==p.id.indexOf("mautic")&&(e=!0),u.after(p);for(l of p.querySelectorAll('input[name="apbct_visible_fields"]'))l.remove();for(s of p.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))s.remove();let t=p.querySelectorAll("button[type=submit]");if(0!==t.length)return t[0].click(),void(e&&setTimeout(function(){ctProtectExternal()},1500));if(0!==(t=p.querySelectorAll("input[type=submit]")).length)return void t[0].click();if(0!==(t=p.querySelectorAll('button[data-element="submit"]')).length)return void t[0].click();if(0!==(t=p.querySelectorAll("button#ck_subscribe_button")).length)return void t[0].click();0!==(t=p.querySelectorAll('input[type="image"][name="submit"]')).length&&t[0].click()}(void 0!==e.apbct&&+e.apbct.blocked||void 0!==e.data&&void 0!==e.data.message)&&(ctParseBlockMessage(e),n)&&setTimeout(function(){document.location.reload()},3e3)}})}function catchDynamicRenderedForm(){catchDynamicRenderedFormHandler(document.getElementsByTagName("form"));var t=document.getElementsByTagName("iframe");if(0e.selected).map(e=>e.value):"checkbox"===e.type||"radio"===e.type?e.checked||null:e.value}function apbctIsFormInDiv(e,t){let o=e.parentElement;for(;o;){if(o.classList.contains(t))return!0;o=o.parentElement}return!1}function ctCheckInternal(t){var e={},o=t.elements;let c;for(c in o)"submit"!==o[c].type&&void 0!==o[c].value&&""!==o[c].value&&(e[o[c].name]=t.elements[c].value);e.action="ct_check_internal",apbct_public_sendAJAX(e,{url:ctPublicFunctions._ajax_url,callback:function(e){if(!0!==e.success)return alert(e.data),!1;t.origSubmit()}})}function ctProtectInternalForms(){var t,o="",c="";for(let e=0;enull!==t.match(new RegExp(ctPublic.blog_home+".*"+e)))}document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); +//# sourceMappingURL=apbct-public-bundle_full-protection_comm-func.min.js.map diff --git a/js/apbct-public-bundle_full-protection_comm-func.min.js.map b/js/apbct-public-bundle_full-protection_comm-func.min.js.map new file mode 100644 index 000000000..8e46eb2e1 --- /dev/null +++ b/js/apbct-public-bundle_full-protection_comm-func.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"apbct-public-bundle_full-protection_comm-func.min.js","sources":["apbct-public-bundle_full-protection_comm-func.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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, 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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 * Handle external forms\n */\nfunction ctProtectExternal() {\n for (let i = 0; i < document.forms.length; i++) {\n if (document.forms[i].cleantalk_hidden_action === undefined &&\n document.forms[i].cleantalk_hidden_method === undefined) {\n // current form\n const currentForm = document.forms[i];\n\n // skip excluded forms\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n\n // Ajax checking for the integrated forms - will be changed the whole form object to make protection\n if ( isIntegratedForm(currentForm) ) {\n apbctProcessExternalForm(currentForm, i, document);\n\n // Ajax checking for the integrated forms - will be changed only submit button to make protection\n } else if (\n // MooForm 3rd party service\n currentForm.dataset.mailingListId !== undefined ||\n (typeof(currentForm.action) == 'string' &&\n (currentForm.action.indexOf('webto.salesforce.com') !== -1)) ||\n (typeof(currentForm.action) == 'string' &&\n currentForm.querySelector('[href*=\"activecampaign\"]')) ||\n (\n typeof(currentForm.action) == 'string' &&\n currentForm.action.indexOf('hsforms.com') !== -1 &&\n currentForm.getAttribute('data-hs-cf-bound')\n )\n ) {\n apbctProcessExternalFormByFakeButton(currentForm, i, document);\n // Common flow - modify form's action\n } else if (\n typeof(currentForm.action) == 'string' &&\n ( currentForm.action.indexOf('http://') !== -1 ||\n currentForm.action.indexOf('https://') !== -1 )\n ) {\n let tmp = currentForm.action.split('//');\n tmp = tmp[1].split('/');\n const host = tmp[0].toLowerCase();\n\n if (host !== location.hostname.toLowerCase()) {\n const ctAction = document.createElement('input');\n ctAction.name = 'cleantalk_hidden_action';\n ctAction.value = currentForm.action;\n ctAction.type = 'hidden';\n currentForm.appendChild(ctAction);\n\n const ctMethod = document.createElement('input');\n ctMethod.name = 'cleantalk_hidden_method';\n ctMethod.value = currentForm.method;\n ctMethod.type = 'hidden';\n\n currentForm.method = 'POST';\n\n currentForm.appendChild(ctMethod);\n\n currentForm.action = document.location;\n }\n }\n }\n }\n // Trying to process external form into an iframe\n apbctProcessIframes();\n // if form is still not processed by fields listening, do it here\n ctStartFieldsListening();\n}\n\n/**\n * Exclusion forms\n * @param {HTMLElement} currentForm\n * @return {boolean}\n */\nfunction formIsExclusion(currentForm) {\n const exclusionsById = [\n 'give-form', // give form exclusion because of direct integration\n 'frmCalc', // nobletitle-calc\n 'ihf-contact-request-form',\n 'wpforms', // integration with wpforms\n ];\n\n const exclusionsByRole = [\n 'search', // search forms\n ];\n\n const exclusionsByClass = [\n 'search-form', // search forms\n 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic\n 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic\n 'nf-form-content', // integration with Ninja Forms for js events\n 'elementor-form', // integration with elementor-form\n 'wpforms', // integration with wpforms\n 'et_pb_searchform', // integration with elementor-search-form\n ];\n\n const exclusionsByAction = [\n 'paypal.com/cgi-bin/webscr', // search forms\n ];\n\n let result = false;\n\n try {\n // mewto forms exclusion\n if (currentForm.parentElement &&\n currentForm.parentElement.classList.length > 0 &&\n currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) {\n result = true;\n }\n\n if (currentForm.getAttribute('action') !== null) {\n exclusionsByAction.forEach(function(exclusionAction) {\n if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) {\n result = true;\n }\n });\n }\n\n exclusionsById.forEach(function(exclusionId) {\n const formId = currentForm.getAttribute('id');\n if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) {\n result = true;\n }\n });\n\n exclusionsByClass.forEach(function(exclusionClass) {\n let foundClass = '';\n if (currentForm.getAttribute('class')) {\n foundClass = currentForm.getAttribute('class');\n } else {\n foundClass = apbctGetFormClass(currentForm, exclusionClass);\n }\n const formClass = foundClass;\n if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) {\n if (currentForm.getAttribute('data-hs-cf-bound')) {\n result = false;\n } else {\n result = true;\n }\n }\n });\n\n exclusionsByRole.forEach(function(exclusionRole) {\n const formRole = currentForm.getAttribute('id');\n if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) {\n result = true;\n }\n });\n } catch (e) {\n console.table('APBCT ERROR: formIsExclusion() - ', e);\n }\n\n return result;\n}\n\n/**\n * Gets the form class if it is not in \n * @param {HTMLElement} currentForm\n * @param {string} exclusionClass\n * @return {string}\n */\nfunction apbctGetFormClass(currentForm, exclusionClass) {\n if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) {\n return exclusionClass;\n }\n}\n\n/**\n * Handle external forms in iframes\n */\nfunction apbctProcessIframes() {\n const frames = document.getElementsByTagName('iframe');\n\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n if ( iframeForms.length === 0 ) {\n continue;\n }\n\n for ( let y = 0; y < iframeForms.length; y++ ) {\n const currentForm = iframeForms[y];\n if ( formIsExclusion(currentForm)) {\n continue;\n }\n apbctProcessExternalForm(currentForm, y, frames[j].contentDocument);\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalForm(currentForm, iterator, documentObject) {\n const cleantalkPlaceholder = document.createElement('i');\n cleantalkPlaceholder.className = 'cleantalk_placeholder';\n cleantalkPlaceholder.style = 'display: none';\n\n currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm);\n\n // Deleting form to prevent submit event\n const prev = currentForm.previousSibling;\n const formHtml = currentForm.outerHTML;\n const formOriginal = currentForm;\n\n // Remove the original form\n currentForm.parentElement.removeChild(currentForm);\n\n // Insert a clone\n const placeholder = document.createElement('div');\n placeholder.innerHTML = formHtml;\n prev.after(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctPrev = prev;\n reUseCurrentForm.apbctFormOriginal = formOriginal;\n\n // mailerlite integration - disable click on submit button\n let mailerliteDetectedClass = false;\n if (reUseCurrentForm.classList !== undefined) {\n // list there all the mailerlite classes\n const mailerliteClasses = ['newsletterform', 'ml-block-form'];\n mailerliteClasses.forEach(function(mailerliteClass) {\n if (reUseCurrentForm.classList.contains(mailerliteClass)) {\n mailerliteDetectedClass = mailerliteClass;\n }\n });\n }\n\n let mailerliteSubmitButton = null;\n if ( mailerliteDetectedClass ) {\n mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type=\"submit\"]');\n if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) {\n mailerliteSubmitButton.addEventListener('click', function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(reUseCurrentForm);\n });\n }\n return;\n }\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Process external forms via fake button replacing\n * @param {HTMLElement} currentForm\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) {\n const submitButtonOriginal = currentForm.querySelector('[type=\"submit\"]');\n const onsubmitOriginal = currentForm.querySelector('[type=\"submit\"]').form.onsubmit;\n\n if ( ! submitButtonOriginal ) {\n return;\n }\n\n const parent = submitButtonOriginal.parentElement;\n const submitButtonHtml = submitButtonOriginal.outerHTML;\n\n // Remove the original submit button\n submitButtonOriginal.remove();\n\n // Insert a clone of the submit button\n const placeholder = document.createElement('div');\n placeholder.innerHTML = submitButtonHtml;\n parent.appendChild(placeholder.firstElementChild);\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n\n const reUseCurrentForm = documentObject.forms[iterator];\n\n reUseCurrentForm.appendChild(forceAction);\n reUseCurrentForm.apbctParent = parent;\n reUseCurrentForm.submitButtonOriginal = submitButtonOriginal;\n reUseCurrentForm.onsubmitOriginal = onsubmitOriginal;\n\n documentObject.forms[iterator].onsubmit = function(event) {\n event.preventDefault();\n\n // MooSend spinner activate\n apbctMoosendSpinnerToggle(event.currentTarget);\n\n sendAjaxCheckingFormData(event.currentTarget);\n };\n}\n\n/**\n * Activate or deactivate spinner for Moosend form during request checking\n * @param {HTMLElement} form\n */\nfunction apbctMoosendSpinnerToggle(form) {\n const buttonElement = form.querySelector('button[type=\"submit\"]');\n if ( buttonElement ) {\n const spinner = buttonElement.querySelector('i');\n const submitText = buttonElement.querySelector('span');\n if (spinner && submitText) {\n if ( spinner.style.zIndex == 1 ) {\n submitText.style.opacity = 1;\n spinner.style.zIndex = -1;\n spinner.style.opacity = 0;\n } else {\n submitText.style.opacity = 0;\n spinner.style.zIndex = 1;\n spinner.style.opacity = 1;\n }\n }\n }\n}\n\n/**\n * Process external forms\n * @param {HTMLElement} formSource\n * @param {HTMLElement} formTarget\n */\nfunction apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) {\n const inputsSource = formSource.querySelectorAll('button, input, textarea, select');\n const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select');\n\n if (formSource.outerHTML.indexOf('action=\"https://www.kulahub.net') !== -1 ||\n isFormHasDiviRedirect(formSource) ||\n formSource.outerHTML.indexOf('class=\"et_pb_contact_form') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://api.kit.com') !== -1 ||\n formSource.outerHTML.indexOf('activehosted.com') !== -1 ||\n formSource.outerHTML.indexOf('action=\"https://crm.zoho.com') !== -1\n ) {\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.name === elemTarget.name) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n\n return;\n }\n\n inputsSource.forEach((elemSource) => {\n inputsTarget.forEach((elemTarget) => {\n if (elemSource.outerHTML === elemTarget.outerHTML) {\n if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') {\n elemTarget.checked = apbctVal(elemSource);\n } else {\n elemTarget.value = apbctVal(elemSource);\n }\n }\n });\n });\n}\n// clear protected iframes list\napbctLocalStorage.set('apbct_iframes_protected', []);\nwindow.addEventListener('load', function() {\n if ( ! +ctPublic.settings__forms__check_external ) {\n return;\n }\n\n setTimeout(function() {\n ctProtectExternal();\n catchDynamicRenderedForm();\n catchNextendSocialLoginForm();\n ctProtectOutsideIframe();\n }, 2000);\n\n ctProtectKlaviyoForm();\n});\n\n/**\n * Protect klaviyo forms\n */\nfunction ctProtectKlaviyoForm() {\n if (!document.querySelector('link[rel=\"dns-prefetch\"][href=\"//static.klaviyo.com\"]')) {\n return;\n }\n\n let i = setInterval(() => {\n const klaviyoForms = document.querySelectorAll('form.klaviyo-form');\n if (klaviyoForms.length) {\n clearInterval(i);\n klaviyoForms.forEach((form, index) => {\n apbctProcessExternalFormKlaviyo(form, index, document);\n });\n }\n }, 500);\n}\n\n/**\n * Protect klaviyo forms\n * @param {HTMLElement} form\n * @param {int} iterator\n * @param {HTMLElement} documentObject\n */\nfunction apbctProcessExternalFormKlaviyo(form, iterator, documentObject) {\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (!btn) {\n return;\n }\n btn.disabled = true;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n let cover = document.createElement('div');\n cover.id = 'apbct-klaviyo-cover';\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.style.cursor = 'pointer';\n cover.onclick = function(e) {\n sendAjaxCheckingFormData(form);\n };\n btn.parentNode.style.position = 'relative';\n btn.parentNode.appendChild(cover);\n}\n\n/**\n * Protect forms placed in iframe with outside src\n */\nfunction ctProtectOutsideIframe() {\n let iframes = document.querySelectorAll('iframe');\n if (iframes.length > 0) {\n iframes.forEach(function(iframe) {\n if (iframe.src.indexOf('form.typeform.com') !== -1 ||\n iframe.src.indexOf('forms.zohopublic.com') !== -1 ||\n iframe.src.indexOf('link.surepathconnect.com') !== -1 ||\n iframe.src.indexOf('hello.dubsado.com') !== -1 ||\n iframe.classList.contains('hs-form-iframe') ||\n ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1)\n ) {\n // pass if is already protected\n if (false !== apbctLocalStorage.get('apbct_iframes_protected') &&\n apbctLocalStorage.get('apbct_iframes_protected').length > 0 &&\n typeof iframe.id !== 'undefined' &&\n apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1\n ) {\n return;\n }\n ctProtectOutsideIframeHandler(iframe);\n }\n });\n }\n}\n\nlet ctProtectOutsideIframeCheck;\n/**\n * Protect forms placed in iframe with outside src handler\n * @param {HTMLElement} iframe\n */\nfunction ctProtectOutsideIframeHandler(iframe) {\n let cover = document.createElement('div');\n cover.style.width = '100%';\n cover.style.height = '100%';\n cover.style.background = 'black';\n cover.style.opacity = 0;\n cover.style.position = 'absolute';\n cover.style.top = 0;\n cover.onclick = function(e) {\n if (ctProtectOutsideIframeCheck === undefined) {\n let currentDiv = e.currentTarget;\n currentDiv.style.opacity = 0.5;\n let preloader = document.createElement('div');\n preloader.className = 'apbct-iframe-preloader';\n currentDiv.appendChild(preloader);\n let botDetectorToken = '';\n if (document.querySelector('[name*=\"ct_bot_detector_event_token\"]')) {\n botDetectorToken = document.querySelector('[name*=\"ct_bot_detector_event_token\"]').value;\n }\n\n let data = {\n 'action': 'cleantalk_outside_iframe_ajax_check',\n 'ct_no_cookie_hidden_field': getNoCookieData(),\n 'ct_bot_detector_event_token': botDetectorToken,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n ctProtectOutsideIframeCheck = true;\n if (result.apbct.blocked === false) {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) {\n el.parentNode.remove();\n });\n } else {\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.parentNode.style.color = 'white';\n el.parentNode.innerHTML += result.apbct.comment;\n });\n document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => {\n el.remove();\n });\n }\n },\n },\n );\n }\n };\n iframe.parentNode.style.position = 'relative';\n iframe.parentNode.appendChild(cover);\n let iframes = apbctLocalStorage.get('apbct_iframes_protected');\n if (false === iframes) {\n iframes = [];\n }\n if (typeof iframe.id !== 'undefined') {\n iframes.push(iframe.id);\n apbctLocalStorage.set('apbct_iframes_protected', iframes);\n }\n}\n\n/**\n * Catch NSL form integration\n */\nfunction catchNextendSocialLoginForm() {\n let blockNSL = document.getElementById('nsl-custom-login-form-main');\n if (blockNSL) {\n blockBtnNextendSocialLogin(blockNSL);\n }\n}\n\n/**\n * Blocking NSL plugin buttons\n * @param {HTMLElement} blockNSL\n */\nfunction blockBtnNextendSocialLogin(blockNSL) {\n let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a');\n let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin=\"nsl\"] .nsl-button');\n parentBtnsNSL.forEach((el) => {\n el.setAttribute('data-oauth-login-blocked', 'true');\n el.addEventListener('click', (event) => {\n event.preventDefault();\n });\n });\n childBtnsNSL.forEach((el) => {\n el.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n ctCheckAjax(el);\n });\n });\n}\n\n/**\n * Unlocking the button and clicking on it after an ajax response\n * @param {HTMLElement} childBtn\n */\nfunction allowAjaxNextendSocialLogin(childBtn) {\n childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false');\n childBtn.parentElement.click();\n}\n\n/**\n * Locking the button and entering a message after an ajax response\n * @param {HTMLElement} childBtn\n * @param {string} msg\n */\nfunction forbiddenAjaxNextendSocialLogin(childBtn, msg) {\n let parentElement = childBtn.parentElement;\n if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') {\n parentElement.setAttribute('data-oauth-login-blocked', 'true');\n }\n if (!document.querySelector('.ct-forbidden-msg')) {\n let elemForMsg = document.createElement('div');\n elemForMsg.className = 'ct-forbidden-msg';\n elemForMsg.style.background = 'red';\n elemForMsg.style.color = 'white';\n elemForMsg.style.padding = '5px';\n elemForMsg.innerHTML = msg;\n parentElement.insertAdjacentElement('beforebegin', elemForMsg);\n }\n}\n\n/**\n * User verification using user data and ajax\n * @param {HTMLElement} elem\n */\nfunction ctCheckAjax(elem) {\n let data = {\n 'action': 'cleantalk_nsl_ajax_check',\n 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value,\n };\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if (result.apbct.blocked === false) {\n allowAjaxNextendSocialLogin(elem);\n } else {\n forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment);\n }\n },\n },\n );\n}\n\n/**\n * Checking the form integration\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isIntegratedForm(formObj) {\n const formAction = typeof(formObj.action) == 'string' ? formObj.action : '';\n const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : '';\n const formClassName = typeof(formObj.className) == 'string' ? formObj.className : '';\n\n if (\n (\n formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form\n formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form\n formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form\n ) ||\n ( formObj.firstChild.classList !== undefined &&\n formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form\n formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration\n formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration\n formAction.indexOf('paypal.com') !== -1 ||\n formAction.indexOf('infusionsoft.com') !== -1 ||\n formAction.indexOf('secure2.convio.net') !== -1 ||\n formAction.indexOf('hookb.in') !== -1 ||\n formAction.indexOf('external.url') !== -1 ||\n formAction.indexOf('tp.media') !== -1 ||\n formAction.indexOf('flodesk.com') !== -1 ||\n formAction.indexOf('sendfox.com') !== -1 ||\n formAction.indexOf('aweber.com') !== -1 ||\n formAction.indexOf('secure.payu.com') !== -1 ||\n formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 ||\n formId.indexOf('ihf-contact-request-form') !== -1 ||\n formAction.indexOf('crm.zoho.com') !== -1 ||\n formId.indexOf('delivra-external-form') !== -1 ||\n // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227\n // ( formObj.classList !== undefined &&\n // !formObj.classList.contains('woocommerce-checkout') &&\n // formObj.hasAttribute('data-hs-cf-bound')\n // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form\n formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration\n formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration\n isFormHasDiviRedirect(formObj) || // Divi contact form\n formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form\n formAction.indexOf('wufoo.com') !== -1 || // Wufoo form\n formAction.indexOf('activehosted.com') !== -1 || // Activehosted form\n formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica\n (\n formAction.indexOf('whatsapp.com') !== -1 &&\n formClassName.indexOf('chaty') !== -1\n ) || // chaty plugin whatsapp form\n (\n formObj.classList !== undefined &&\n formObj.classList.contains('sp-element-container')\n ) || // Sendpulse form\n apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * This function detect if the form has DIVI redirect. If so, the form will work as external.\n * @param {HTMLElement} formObj\n * @return {boolean}\n */\nfunction isFormHasDiviRedirect(formObj) {\n let result = false;\n const diviRedirectedSignSet = document.querySelector('div[id^=\"et_pb_contact_form\"]');\n if (\n typeof formObj === 'object' && formObj !== null &&\n diviRedirectedSignSet !== null &&\n diviRedirectedSignSet.hasAttribute('data-redirect_url') &&\n diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' &&\n diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]') !== null\n ) {\n result = formObj === diviRedirectedSignSet.querySelector('form[class^=\"et_pb_contact_form\"]');\n }\n return result;\n}\n\n/**\n * Sending Ajax for checking form data\n * @param {HTMLElement} form\n * @param {HTMLElement} prev\n * @param {HTMLElement} formOriginal\n */\nfunction sendAjaxCheckingFormData(form) {\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie( visibleFields );\n\n const data = {\n 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'),\n };\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function( result, data, params, obj ) {\n // MooSend spinner deactivate\n apbctMoosendSpinnerToggle(form);\n // hubspot flag\n const isHubSpotEmbedForm = (\n form.hasAttribute('action') &&\n form.getAttribute('action').indexOf('hsforms') !== -1\n );\n if ((result.apbct === undefined && result.data === undefined) ||\n (result.apbct !== undefined && ! +result.apbct.blocked)\n ) {\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Klaviyo integration\n if (form.classList !== undefined && form.classList.contains('klaviyo-form')) {\n const cover = document.getElementById('apbct-klaviyo-cover');\n if (cover) {\n cover.remove();\n }\n const btn = form.querySelector('button[type=\"button\"].needsclick');\n if (btn) {\n btn.disabled = false;\n btn.click();\n }\n return;\n }\n\n // MooSend integration\n if ( form.dataset.mailingListId !== undefined ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Salesforce integration\n if (form.hasAttribute('action') &&\n (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1)\n ) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n // Hubspot bounded integration\n if (isHubSpotEmbedForm) {\n let submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.remove();\n const parent = form.apbctParent;\n parent.appendChild(form.submitButtonOriginal);\n form.onsubmit = form.onsubmitOriginal;\n submitButton = form.querySelector('[type=\"submit\"]');\n submitButton.click();\n return;\n }\n\n const formNew = form;\n form.parentElement.removeChild(form);\n const prev = form.apbctPrev;\n const formOriginal = form.apbctFormOriginal;\n let mauticIntegration = false;\n\n apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal);\n\n // mautic forms integration\n if (formOriginal &&\n typeof formOriginal.id === 'string' &&\n formOriginal.id.indexOf('mautic') !== -1\n ) {\n mauticIntegration = true;\n }\n\n prev.after( formOriginal );\n\n // Clear visible_fields input\n for (const el of formOriginal.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n\n for (const el of formOriginal.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n\n // Common click event\n let submButton = formOriginal.querySelectorAll('button[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n if (mauticIntegration) {\n setTimeout(function() {\n ctProtectExternal();\n }, 1500);\n }\n return;\n }\n\n submButton = formOriginal.querySelectorAll('input[type=submit]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // ConvertKit direct integration\n submButton = formOriginal.querySelectorAll('button[data-element=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n submButton = formOriginal.querySelectorAll('button#ck_subscribe_button');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n return;\n }\n\n // Paypal integration\n submButton = formOriginal.querySelectorAll('input[type=\"image\"][name=\"submit\"]');\n if ( submButton.length !== 0 ) {\n submButton[0].click();\n }\n }\n if ((result.apbct !== undefined && +result.apbct.blocked) ||\n (result.data !== undefined && result.data.message !== undefined)\n ) {\n ctParseBlockMessage(result);\n // hubspot embed form needs to reload page to prevent forms mishandling\n if (isHubSpotEmbedForm) {\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n }\n }\n },\n });\n}\n\n/**\n * Handle dynamic rendered form\n */\nfunction catchDynamicRenderedForm() {\n const forms = document.getElementsByTagName('form');\n\n catchDynamicRenderedFormHandler(forms);\n\n const frames = document.getElementsByTagName('iframe');\n if ( frames.length > 0 ) {\n for ( let j = 0; j < frames.length; j++ ) {\n if ( frames[j].contentDocument == null ) {\n continue;\n }\n\n const iframeForms = frames[j].contentDocument.forms;\n\n if ( iframeForms.length === 0 ) {\n return;\n }\n\n catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument);\n }\n }\n}\n\n/**\n * Handles dynamic rendered forms by attaching an onsubmit event handler to them.\n *\n * @param {HTMLCollection} forms - A collection of form elements to be processed.\n * @param {Document} [documentObject=document] - The document object to use for querying elements.\n */\nfunction catchDynamicRenderedFormHandler(forms, documentObject = document) {\n const neededFormIds = [];\n for (const form of forms) {\n const formIdAttr = form.getAttribute('id');\n if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) {\n neededFormIds.push(formIdAttr);\n }\n if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 &&\n (form.classList !== undefined && form.classList.contains('ihc-form-create-edit'))\n ) {\n neededFormIds.push(formIdAttr);\n }\n }\n\n for (const formId of neededFormIds) {\n const form = documentObject.getElementById(formId);\n form.apbct_external_onsubmit_prev = form.onsubmit;\n form.onsubmit = sendAjaxCheckingDynamicFormData;\n }\n}\n\n/**\n * Sending Ajax for checking form data on dynamic rendered form\n * @param {HTMLElement} form\n */\nfunction sendAjaxCheckingDynamicFormData(form) {\n form.preventDefault();\n form.stopImmediatePropagation();\n const formEvent = form;\n form = form.target;\n\n const forceAction = document.createElement('input');\n forceAction.name = 'action';\n forceAction.value = 'cleantalk_force_ajax_check';\n forceAction.type = 'hidden';\n form.appendChild(forceAction);\n\n // Get visible fields and set cookie\n const visibleFields = {};\n visibleFields[0] = apbct_collect_visible_fields(form);\n apbct_visible_fields_set_cookie(visibleFields);\n form.append(ctNoCookieConstructHiddenField('hidden'));\n\n const data = {};\n let elems = form.elements;\n elems = Array.prototype.slice.call(elems);\n\n elems.forEach( function( elem, y ) {\n if ( elem.name === '' ) {\n data['input_' + y] = elem.value;\n } else {\n data[elem.name] = elem.value;\n }\n });\n\n apbct_public_sendAJAX(\n data,\n {\n async: false,\n callback: function(result) {\n if ( result.apbct === undefined || ! +result.apbct.blocked ) {\n form.onsubmit = null;\n\n // Clear service fields\n for (const el of form.querySelectorAll('input[name=\"apbct_visible_fields\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[value=\"cleantalk_force_ajax_check\"]')) {\n el.remove();\n }\n for (const el of form.querySelectorAll('input[name=\"ct_no_cookie_hidden_field\"]')) {\n el.remove();\n }\n\n // Call previous submit action\n if (form.apbct_external_onsubmit_prev instanceof Function) {\n let timerId = setTimeout(function() {\n form.apbct_external_onsubmit_prev.call(form, formEvent);\n }, 500);\n clearTimeout(timerId);\n }\n\n const submButton = form.querySelector('input[type=\"submit\"]');\n if (submButton) {\n submButton.click();\n return;\n }\n }\n\n if (result.apbct !== undefined && +result.apbct.blocked) {\n ctParseBlockMessage(result);\n }\n },\n });\n}\n\n/**\n * Implement jQuery val() function\n * @param {HTMLElement} el\n * @return {HTMLElements}\n */\nfunction apbctVal(el) {\n if (el.options && el.multiple) {\n return el.options\n .filter((option) => option.selected)\n .map((option) => option.value);\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n return el.checked ? el.checked : null;\n } else {\n return el.value;\n }\n}\n\n/**\n * Checks if a form object is inside a div with a specified class name.\n *\n * @param {HTMLElement} formObj - The form element to check.\n * @param {string} divClassName - The class name of the div to look for.\n * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise.\n */\nfunction apbctIsFormInDiv(formObj, divClassName) {\n let parent = formObj.parentElement;\n while (parent) {\n if (parent.classList.contains(divClassName)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\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 if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n ctProtectInternalForms();\n }, 500);\n\n document.addEventListener('apbctForceProtectionAllowed', function() {\n ctProtectInternalForms();\n });\n});\n\n/**\n * Protect internal forms\n * @return {void}\n */\nfunction ctProtectInternalForms() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\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}\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","fillDecodedNodes","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","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","smartQuizBuilder","bookingPress","isArray","e","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","Event","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","contains","_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","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_site_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","ctProtectExternal","cleantalk_hidden_action","cleantalk_hidden_method","ctMethod","currentForm","formIsExclusion","isIntegratedForm","apbctProcessExternalForm","mailingListId","apbctProcessExternalFormByFakeButton","tmp","hostname","ctAction","apbctProcessIframes","exclusionAction","exclusionId","exclusionClass","foundClass","formClass","apbctGetFormClass","exclusionRole","formRole","table","frames","getElementsByTagName","contentDocument","iframeForms","y","iterator","documentObject","cleantalkPlaceholder","prev","insertBefore","previousSibling","formHtml","formOriginal","placeholder","forceAction","firstElementChild","reUseCurrentForm","mailerliteDetectedClass","apbctPrev","apbctFormOriginal","mailerliteClass","mailerliteSubmitButton","sendAjaxCheckingFormData","currentTarget","submitButtonOriginal","onsubmitOriginal","submitButtonHtml","apbctParent","apbctMoosendSpinnerToggle","buttonElement","submitText","zIndex","apbctReplaceInputsValuesFromOtherForm","formSource","formTarget","inputsSource","inputsTarget","isFormHasDiviRedirect","elemSource","elemTarget","checked","apbctVal","ctProtectKlaviyoForm","klaviyoForms","index","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_external","catchDynamicRenderedForm","catchNextendSocialLoginForm","ctProtectOutsideIframeCheck","currentDiv","preloader","botDetectorToken","blockNSL","blockBtnNextendSocialLogin","parentBtnsNSL","childBtnsNSL","ctCheckAjax","allowAjaxNextendSocialLogin","childBtn","forbiddenAjaxNextendSocialLogin","elemForMsg","insertAdjacentElement","getElementsByName","formObj","formClassName","firstChild","apbctIsFormInDiv","diviRedirectedSignSet","elems","isHubSpotEmbedForm","submitButton","formNew","mauticIntegration","submButton","reload","catchDynamicRenderedFormHandler","neededFormIds","formIdAttr","apbct_external_onsubmit_prev","sendAjaxCheckingDynamicFormData","stopImmediatePropagation","formEvent","timerId","multiple","option","map","divClassName","ctCheckInternal","currForm","ctData","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","some","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_int-protection.min.js b/js/apbct-public-bundle_int-protection.min.js index 5ca1499e1..a7f987334 100644 --- a/js/apbct-public-bundle_int-protection.min.js +++ b/js/apbct-public-bundle_int-protection.min.js @@ -1,2 +1,2 @@ -function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=s,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),s=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),r=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),h=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==r?r:b,o.apbct_headless=void 0!==d?d:h,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=s,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},s=document.createElement("style"),i=(s.setAttribute("id","cleantalk-modal-styles"),s.innerHTML="body.cleantalk-modal-opened{"+i+"}",s.innerHTML+="#cleantalk-modal-overlay{"+t+"}",s.innerHTML+="#cleantalk-modal-close{"+c+"}",s.innerHTML+="#cleantalk-modal-close:before{"+n+"}",s.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(s),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctCheckInternal(t){var e={},o=t.elements;let c;for(c in o)"submit"!==o[c].type&&void 0!==o[c].value&&""!==o[c].value&&(e[o[c].name]=t.elements[c].value);e.action="ct_check_internal",apbct_public_sendAJAX(e,{url:ctPublicFunctions._ajax_url,callback:function(e){if(!0!==e.success)return alert(e.data),!1;t.origSubmit()}})}function ctProtectInternalForms(){var t,o="",c="";for(let e=0;enull!==t.match(new RegExp(ctPublic.blog_home+".*"+e)))}document.addEventListener("click",function(e){!e.target||"cleantalk-modal-overlay"!==e.target.id&&"cleantalk-modal-close"!==e.target.id||cleantalkModal.close()}),document.addEventListener("cleantalkModalContentLoaded",function(e){cleantalkModal.opened&&cleantalkModal.loaded&&(document.getElementById("cleantalk-modal-content").innerHTML=cleantalkModal.loaded)}),document.addEventListener("DOMContentLoaded",function(){let r=void 0,d=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(r="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:r)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(r=ctTrpAdminLocalize.theRealPerson,d=!0),r){let e='.apbct-trp *[class*="comment-author"]';document.querySelector(".apbct-trp .comment-author .comment-author-link")&&(e='.apbct-trp *[class*="comment-author-link"]');var t=document.querySelectorAll(e+',.apbct-trp *[class*="review__author"],.apbct-trp td[class*="column-author"] > strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,s,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",r.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(r.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(s=document.createElement("span")).append(r.phrases.trpContent1+" "),s.append(r.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",r.trpContentLink),l.setAttribute("target","_blank"),l.text=r.phrases.trpContentLearnMore,s.append(" "),s.append(l)),i.append(s),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); +class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(t){this.select(t)}select(t){return t instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(t)):"object"==typeof t?(this.selector=null,this.elements=[],this.elements[0]=t):"string"==typeof t?(this.selector=t,this.elements=Array.prototype.slice.call(document.querySelectorAll(t))):this.deselect(),this}addElement(t){"object"==typeof t?this.elements.push(t):"string"==typeof t?(this.selector=t,this.elements=Array.prototype.slice.call(document.querySelectorAll(t))):this.deselect()}push(t){this.elements.push(t)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,e){if(e=e||!1,"object"==typeof o){for(let e in o)if(Object.hasOwn(o,e)){var c=e.replace(/([-_][a-z])/g,t=>t.toUpperCase().replace("-","").replace("_",""));for(let t=0;t(t=document.createElement(t).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(t))))(e)?o||=t.tagName.toLowerCase()===e.toLowerCase():e.match(/^[a-z]/)?o||=Boolean(t[e]):o||=null!==this.selector?null!==document.querySelector(this.selector+e):this.isWithoutSelector(t,e)),o}isWithoutSelector(t,e){var o;let c=!1;for(o of document.querySelectorAll(e))c||=t===o;return c}filter(e){this.selector=null;for(let t=this.elements.length-1;0<=t;t--)this.isElem(this.elements[t],e)||this.elements.splice(Number(t),1);return this}parent(t){return this.select(this.elements[0].parentElement),void 0===t||this.is(t)||this.deselect(),this}parents(t){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==t&&this.filter(t),this}children(t){return this.select(this.elements[0].children),void 0!==t&&this.filter(t),this}siblings(t){var e=this.elements[0];return this.parent(),this.children(t),this.elements.splice(this.elements.indexOf(e),1),this}remove(){for(var t of this.elements)t.remove()}after(t){for(var e of this.elements)e.after(t)}append(t){for(var e of this.elements)e.append(t)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let t=+new Date,e=function(){o.style.opacity=+o.style.opacity+(new Date-t)/c,t=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(e)||setTimeout(e,16))};e()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let t=+new Date,e=function(){o.style.opacity=+o.style.opacity-(new Date-t)/c,t=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(e)||setTimeout(e,16):o.style.display="none"};e()}}}function ctProcessError(t,e){var o={},t=(t&&t.message?o.err={msg:t.message,file:t.fileName||!1,ln:t.lineNumber||lineNo||!1,col:t.columnNumber||columnNo||!1,stacktrace:t.stack||!1,cause:!!e&&JSON.stringify(e),errorObj:error||!1}:(o.err={msg:t},e&&(o.err.file=e)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(t);null===c&&(c="[]"),c=JSON.parse(c);for(let t=0;t{this.checkElementInForms(t,"addClicks")}),this.elementBody.addEventListener("mouseup",t=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",t=>{this.checkElementInForms(t,"trackMouseMovement")})}checkElementInForms(e,t){let o;for(let t=0;tMath.floor((new Date).getTime()/1e3)},isSet:function(t){return null!==localStorage.getItem(t)},delete:function(t){localStorage.removeItem(t)},getCleanTalkData:function(){var e={};for(let t=0;tthis.checkBotCallback(t)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(t.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(t,{callback:t=>this.checkBotCallback(t)}))}checkBotCallback(t){if(t.data&&t.data.status&&200!==t.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof t)try{t=JSON.parse(t)}catch(t){return console.log("ApbctForceProtection decodeForms error",t),void this.decodeForms()}"object"==typeof t&&t.allow&&1===t.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(t.message)}}decodeForms(){let e;this.wrappers.forEach(t=>{e=t.querySelector("div.ct-encoded-form").dataset.encodedForm;try{e&&"string"==typeof e&&(t.outerHTML=atob(e))}catch(t){console.log(t)}})}showMessageForBot(e){let o;this.wrappers.forEach(t=>{(o=t.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(t.outerHTML='
'+e+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((t,e)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((t,e)=>{t.addEventListener("paste",()=>{this.data[e].isUseBuffer=!0})}),this.fields.forEach((t,e)=>{t.addEventListener("onautocomplete",()=>{this.data[e].isAutoFill=!0})}),this.fields.forEach((t,o)=>{t.addEventListener("input",()=>{this.data[o].countOfKey++;var t,e=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=e,this.data[o].firstKeyTimestamp=e):(t=e-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=e,this.data[o].lastDelta=t):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),t.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(t.target)&&(void 0!==t.target.classList&&t.target.classList.contains("brave_form_form")&&t.preventDefault(),setTimeout(function(){t.target.onsubmit_prev.call(t.target,t)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=a).length)for(let t=0;tctSearchFormOnSubmitHandler(t,e));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let t=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(t))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((t,e)=>("object"==typeof t&&null!==t&&t.hasOwnProperty("data")&&t.hasOwnProperty("path")&&(t.data.hasOwnProperty("requests")&&0{null!==t&&t.parentNode.removeChild(t),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},n=s,null!==e&&(n.apbct_search_form__honeypot_value=e),n.ct_bot_detector_event_token=r,"string"==typeof n.apbct_pixel_url&&-1!==n.apbct_pixel_url.indexOf("%3A")&&(n.apbct_pixel_url=decodeURIComponent(n.apbct_pixel_url)),void 0!==(i=JSON.stringify(n))&&0!==i.length?ctSetAlternativeCookie(i,{callback:a,onErrorCallback:a,forceAltCookies:!0}):a())}catch(t){console.warn("APBCT search form onsubmit handler error. "+t)}}function getJavascriptClientData(e=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var t=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),a=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),n=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),s=apbctSessionStorage.get("apbct_site_referer"),r=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),h=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),b=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==t?t:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==a?a:m,o.apbct_pixel_url=void 0!==l?l:h,o.apbct_headless=void 0!==d?d:b,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=n,o.apbct_prev_referer=i,o.apbct_site_referer=s,o.apbct_ct_js_errors=r,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof e)for(let t=0;t{c.addEventListener("click",function(t){let e=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===e.indexOf("?")?e+="?":e+="&",e+="ct_bot_detector_event_token="+o,c.setAttribute("href",e))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(t){var e;this.loaded||(this.loading=!0,e=function(t,e,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=t,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:t},{callback:e,notJson:!0}))},open:function(){function t(){let t="";for(var e in this.styles)t+=e+":"+this.styles[e]+";";return t}var e={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:t},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:t},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:t},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:t},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:t},i={styles:{overflow:"hidden"},toString:t},s=document.createElement("style"),i=(s.setAttribute("id","cleantalk-modal-styles"),s.innerHTML="body.cleantalk-modal-opened{"+i+"}",s.innerHTML+="#cleantalk-modal-overlay{"+e+"}",s.innerHTML+="#cleantalk-modal-close{"+c+"}",s.innerHTML+="#cleantalk-modal-close:before{"+a+"}",s.innerHTML+="#cleantalk-modal-close:after{"+n+"}",document.body.append(s),document.createElement("div")),e=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(e.setAttribute("id","cleantalk-modal-inner"),e.setAttribute("style",o),i.append(e),document.createElement("div")),a=(c.setAttribute("id","cleantalk-modal-close"),e.append(c),document.createElement("div"));this.loaded?(n=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?a.innerHTML=this.loaded:a.innerHTML=this.loaded.replace(n,'$1')):(a.innerHTML="Loading...",this.load("get_options_template")),a.setAttribute("id","cleantalk-modal-content"),e.append(a),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var t=document.querySelectorAll(".apbct-real-user-popup.visible");0{t.classList.remove("visible")})}function ctCheckInternal(e){var t={},o=e.elements;let c;for(c in o)"submit"!==o[c].type&&void 0!==o[c].value&&""!==o[c].value&&(t[o[c].name]=e.elements[c].value);t.action="ct_check_internal",apbct_public_sendAJAX(t,{url:ctPublicFunctions._ajax_url,callback:function(t){if(!0!==t.success)return alert(t.data),!1;e.origSubmit()}})}function ctProtectInternalForms(){var e,o="",c="";for(let t=0;tnull!==e.match(new RegExp(ctPublic.blog_home+".*"+t)))}document.addEventListener("click",function(t){!t.target||"cleantalk-modal-overlay"!==t.target.id&&"cleantalk-modal-close"!==t.target.id||cleantalkModal.close()}),document.addEventListener("cleantalkModalContentLoaded",function(t){cleantalkModal.opened&&cleantalkModal.loaded&&(document.getElementById("cleantalk-modal-content").innerHTML=cleantalkModal.loaded)}),document.addEventListener("DOMContentLoaded",function(){let l=void 0,d=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(l="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:l)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(l=ctTrpAdminLocalize.theRealPerson,d=!0),l){let t='.apbct-trp *[class*="comment-author"]';document.querySelector(".apbct-trp .comment-author .comment-author-link")&&(t='.apbct-trp *[class*="comment-author-link"]');var e=document.querySelectorAll(t+',.apbct-trp *[class*="review__author"],.apbct-trp td[class*="column-author"] > strong');0!==e.length&&(e.forEach((t,e)=>{var o,c,a,n,i,s,r;"undefined"==typeof pagenow&&t.parentElement.className.indexOf("group")<0&&"DIV"!=t.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",l.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(a=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(n=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),n.append(l.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(s=document.createElement("span")).append(l.phrases.trpContent1+" "),s.append(l.phrases.trpContent2),d&&((r=document.createElement("a")).setAttribute("href",l.trpContentLink),r.setAttribute("target","_blank"),r.text=l.phrases.trpContentLearnMore,s.append(" "),s.append(r)),i.append(s),a.append(n,i),o.append(c),t.append(o),t.append(a))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,t=(this.body.addEventListener("click",function(t){-1==t.target.className.indexOf("apbct-real-user")&&-1==t.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var t=this.nextElementSibling;t&&t.classList.contains("apbct-real-user-popup")&&t.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var t=this.nextElementSibling;t&&t.classList.contains("apbct-real-user-popup")&&t.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var t=this.nextElementSibling;t&&t.classList.contains("apbct-real-user-popup")&&t.classList.remove("visible")},1e3)}),o.nextElementSibling);t.addEventListener("mouseenter",function(){clearTimeout(c),t.classList.add("visible")}),t.addEventListener("mouseleave",function(){c=setTimeout(()=>{t.classList.contains("apbct-real-user-popup")&&t.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var t=this.nextElementSibling,e=window.getSelection();t&&e&&t.classList.contains("apbct-real-user-popup")&&0===e.toString().length?t.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function t(){var e=window.getSelection();e&&0===e.toString().length&&(c=setTimeout(()=>{var t=o.nextElementSibling;t&&t.classList.contains("apbct-real-user-popup")&&t.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",t))}))},3e3)})}))}}),document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); //# sourceMappingURL=apbct-public-bundle_int-protection.min.js.map diff --git a/js/apbct-public-bundle_int-protection.min.js.map b/js/apbct-public-bundle_int-protection.min.js.map index 3b3550319..b60f8f368 100644 --- a/js/apbct-public-bundle_int-protection.min.js.map +++ b/js/apbct-public-bundle_int-protection.min.js.map @@ -1 +1 @@ -{"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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, 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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n ctProtectInternalForms();\n }, 500);\n\n document.addEventListener('apbctForceProtectionAllowed', function() {\n ctProtectInternalForms();\n });\n});\n\n/**\n * Protect internal forms\n * @return {void}\n */\nfunction ctProtectInternalForms() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\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}\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","fillDecodedNodes","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","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","smartQuizBuilder","bookingPress","isArray","e","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","Event","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","contains","_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","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_site_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","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","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","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"apbct-public-bundle_int-protection.min.js","sources":["apbct-public-bundle_int-protection.js"],"sourcesContent":["/**\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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n ctProtectInternalForms();\n }, 500);\n\n document.addEventListener('apbctForceProtectionAllowed', function() {\n ctProtectInternalForms();\n });\n});\n\n/**\n * Protect internal forms\n * @return {void}\n */\nfunction ctProtectInternalForms() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\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}\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":["ApbctCore","ajax_parameters","restParameters","selector","elements","eventCallback","eventSelector","event","constructor","this","select","HTMLCollection","Array","prototype","slice","call","document","querySelectorAll","deselect","addElement","elemToAdd","push","elem","reduce","css","style","getRaw","styleName","Object","hasOwn","DomStyleName","replace","group","toUpperCase","let","i","length","computedStyle","getComputedStyle","Number","hide","prop","display","show","addClass","classList","add","className","removeClass","remove","toggleClass","toggle","ajax","ajaxParameters","ApbctAjax","rest","ApbctRest","on","args","addEventListener","onChecker","bind","target","querySelector","stopPropagation","ready","callback","change","attr","attrName","outputValue","getAttribute","propName","value","html","val","data","name","is","filter","isElem","elemToCheck","match","newlyCreatedElement","createElement","Boolean","HTMLElement","HTMLUnknownElement","indexOf","tagName","toLowerCase","isWithoutSelector","splice","parent","parentElement","parents","children","siblings","current","after","content","append","fadeIn","time","opacity","last","Date","tick","window","requestAnimationFrame","setTimeout","fadeOut","ctProcessError","msg","url","log","ctJsErrors","message","err","file","fileName","ln","lineNumber","lineNo","col","columnNumber","columnNo","stacktrace","stack","cause","JSON","stringify","errorObj","error","location","href","userAgent","navigator","errArray","localStorage","getItem","parse","setItem","selectActualNonce","defaultNonce","ctPublicFunctions","hasOwnProperty","_fresh_nonce","data__ajax_type","_ajax_nonce","_rest_nonce","apbct","params","Math","floor","random","onerror","exception","filterWords","ApbctXhr","xhr","XMLHttpRequest","method","async","user","password","button","spinner","progressbar","context","onErrorCallback","responseType","headers","timeout","methods_to_convert_data_to_URL","body","http_code","status_text","parameters","key","prepare","keys","deleteDoubleJSONEncoding","convertData","console","open","setHeaders","onreadystatechange","isWpNonceError","getFreshNonceAndRerunXHR","onReadyStateChange","onload","onLoad","onprogress","onProgress","onError","ontimeout","onTimeout","send","setAttribute","cursor","complete","status","statusText","removeAttribute","on_ready_state_change","on_progress","response","restErrror","ajaxErrror","readyState","initialRequestParams","noncePrev","spbc_remote_call_action","plugin_name","nonce_prev","initial_request_params","notJson","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","outerHTML","innerHTML","addClicks","trackMouseMovement","ctCollectingUserActivityData","clicks","selected","mouseMovementsInsideForm","ctSetCookie","cookies","expires","listOfCookieNamesToForceAlt","skipAlt","data__cookies_type","forcedAltCookiesSet","forEach","item","apbctLocalStorage","set","ctSetAlternativeCookie","ctPublic","force_alt_cookies","forceAltCookies","ctNoCookieAttachHiddenFieldsToForms","_expires","ctSecure","protocol","cookie","cookiePrefix","encodeURIComponent","ctDetectForcedAltCookiesForms","ninjaFormsSign","elementorUltimateAddonsRegister","smartFormsSign","jetpackCommentsForm","cwginstockForm","userRegistrationProForm","etPbDiviSubscriptionForm","fluentBookingApp","bloomPopup","pafeFormsFormElementor","otterForm","smartQuizBuilder","bookingPress","isArray","getJavascriptClientData","e","apbct_force_alt_cookies","apbct_pixel_url","decodeURIComponent","apbct_public_sendREST","apbct_public_sendAJAX","action","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","element","hasAttribute","CustomEvent","bubbles","cancelable","detail","dispatchEvent","ApbctForceProtection","wrappers","findWrappers","checkBot","event_javascript_data","post_url","referrer","checkBotCallback","result","decodeForms","allow","Event","showMessageForBot","form","wrapper","dataset","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","removeEventListener","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","getElementById","setEventTokenField","clearInterval","checkEmail","currentEmail","test","email","now","checkEmailExist","hint","getResultCheckEmailExist","viewCheckEmailExist","envelope","text_result","state","textResult","inputEmail","top","getBoundingClientRect","ctEmailExistSetElementsPositions","onmouseover","textContent","height","color","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","split","trim","pixel__url","data__email_check_before_post","data__email_check_exist_post","tokenForForceAlt","encodedEmailNodes","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","contains","preventDefault","ctFillDecodedEmailHandler","_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","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_site_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","comment","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","id","hiddenFieldType","formAction","j","ct_checkjs_key","defaultFetch","fetch","checkFormsExistForCatching","isFormThatNeedCatch","formClasses","classExists","classForm","sessionCurrentPage","el","loading","opened","opening","ignoreURLConvert","load","apbct_admin_sendAJAX","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","success","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","ctTrpLocalize","ctTrpIsAdminCommentsList","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","trpComments","index","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","imgPersonUrl","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","popup","badge","nextElementSibling","clearTimeout","selection","onSelectionChange","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_int-protection_comm-func.min.js b/js/apbct-public-bundle_int-protection_comm-func.min.js new file mode 100644 index 000000000..deafdf9c5 --- /dev/null +++ b/js/apbct-public-bundle_int-protection_comm-func.min.js @@ -0,0 +1,2 @@ +function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],o=document.createElement("div");o.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===i.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=n.data[0].decoded_email;var o=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,o&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?o.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:o.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,o.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),o=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(o&&o.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(o=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?o.innerText=ctPublicFunctions.text__ee_got_it:o.innerText=ctAdminCommon.text__ee_got_it,o.classList="apbct-email-encoder-got-it-button",o.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(a,n),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&i&&i.click()}),c.append(o),t.append(c))}},3e3):i?n.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+n.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+n.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+n.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+n.data[0].comment)):console.log("result",n)}function resetEncodedNodes(){void 0!==ctPublic.encodedEmailNodes&&ctPublic.encodedEmailNodes.forEach(function(e){e.addEventListener("click",ctFillDecodedEmailHandler)})}function ctShowDecodeComment(e){e=e||("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_decode?ctPublicFunctions:ctAdminCommon).text__ee_cannot_decode;let t=document.getElementById("apbct_popup");var o=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?o.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:o.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,n){if(0{e.encoded_email===c[o].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[o].href||0!==c[o].href.indexOf("mailto:")&&0!==c[o].href.indexOf("tel:"))c[o].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[o])},2e3);else{let e;if(0===c[o].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[o].href.indexOf("tel:"))continue;e="tel:"}var a=c[o].href.replace(e,""),i=c[o].innerHTML;c[o].innerHTML=i.replace(a,t.decoded_email),c[o].href=e+t.decoded_email,c[o].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let o="";n.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(o=e.decoded_email)}),t.innerHTML=o})}c[o].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=n.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}class ApbctCore{ajax_parameters={};restParameters={};selector=null;elements=[];eventCallback;eventSelector;event;constructor(e){this.select(e)}select(e){return e instanceof HTMLCollection?(this.selector=null,this.elements=[],this.elements=Array.prototype.slice.call(e)):"object"==typeof e?(this.selector=null,this.elements=[],this.elements[0]=e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect(),this}addElement(e){"object"==typeof e?this.elements.push(e):"string"==typeof e?(this.selector=e,this.elements=Array.prototype.slice.call(document.querySelectorAll(e))):this.deselect()}push(e){this.elements.push(e)}reduce(){this.elements=this.elements.slice(0,-1)}deselect(){this.elements=[]}css(o,t){if(t=t||!1,"object"==typeof o){for(let t in o)if(Object.hasOwn(o,t)){var c=t.replace(/([-_][a-z])/g,e=>e.toUpperCase().replace("-","").replace("_",""));for(let e=0;e(e=document.createElement(e).constructor,!Boolean(~[HTMLElement,HTMLUnknownElement].indexOf(e))))(t)?o||=e.tagName.toLowerCase()===t.toLowerCase():t.match(/^[a-z]/)?o||=Boolean(e[t]):o||=null!==this.selector?null!==document.querySelector(this.selector+t):this.isWithoutSelector(e,t)),o}isWithoutSelector(e,t){var o;let c=!1;for(o of document.querySelectorAll(t))c||=e===o;return c}filter(t){this.selector=null;for(let e=this.elements.length-1;0<=e;e--)this.isElem(this.elements[e],t)||this.elements.splice(Number(e),1);return this}parent(e){return this.select(this.elements[0].parentElement),void 0===e||this.is(e)||this.deselect(),this}parents(e){for(this.select(this.elements[0]);null!==this.elements[this.elements.length-1].parentElement;)this.push(this.elements[this.elements.length-1].parentElement);return this.elements.splice(0,1),void 0!==e&&this.filter(e),this}children(e){return this.select(this.elements[0].children),void 0!==e&&this.filter(e),this}siblings(e){var t=this.elements[0];return this.parent(),this.children(e),this.elements.splice(this.elements.indexOf(t),1),this}remove(){for(var e of this.elements)e.remove()}after(e){for(var t of this.elements)t.after(e)}append(e){for(var t of this.elements)t.append(e)}fadeIn(c){for(let o of this.elements){o.style.opacity=0,o.style.display="block";let e=+new Date,t=function(){o.style.opacity=+o.style.opacity+(new Date-e)/c,e=+new Date,+o.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16))};t()}}fadeOut(c){for(let o of this.elements){o.style.opacity=1;let e=+new Date,t=function(){o.style.opacity=+o.style.opacity-(new Date-e)/c,e=+new Date,0<+o.style.opacity?window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,16):o.style.display="none"};t()}}}function ctProcessError(e,t){var o={},e=(e&&e.message?o.err={msg:e.message,file:e.fileName||!1,ln:e.lineNumber||lineNo||!1,col:e.columnNumber||columnNo||!1,stacktrace:e.stack||!1,cause:!!t&&JSON.stringify(t),errorObj:error||!1}:(o.err={msg:e},t&&(o.err.file=t)),o.url=window.location.href,o.userAgent=window.navigator.userAgent,"ct_js_errors");let c=localStorage.getItem(e);null===c&&(c="[]"),c=JSON.parse(c);for(let e=0;e{this.checkElementInForms(e,"addClicks")}),this.elementBody.addEventListener("mouseup",e=>{"Range"==document.getSelection().type.toString()&&this.addSelected()}),this.elementBody.addEventListener("mousemove",e=>{this.checkElementInForms(e,"trackMouseMovement")})}checkElementInForms(t,e){let o;for(let e=0;eMath.floor((new Date).getTime()/1e3)},isSet:function(e){return null!==localStorage.getItem(e)},delete:function(e){localStorage.removeItem(e)},getCleanTalkData:function(){var t={};for(let e=0;ethis.checkBotCallback(e)}):"admin_ajax"===ctPublicFunctions.data__ajax_type&&(e.action="apbct_force_protection_check_bot",apbct_public_sendAJAX(e,{callback:e=>this.checkBotCallback(e)}))}checkBotCallback(e){if(e.data&&e.data.status&&200!==e.data.status)console.log("ApbctForceProtection connection error occurred"),this.decodeForms();else{if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return console.log("ApbctForceProtection decodeForms error",e),void this.decodeForms()}"object"==typeof e&&e.allow&&1===e.allow?(this.decodeForms(),document.dispatchEvent(new Event("apbctForceProtectionAllowed"))):this.showMessageForBot(e.message)}}decodeForms(){let t;this.wrappers.forEach(e=>{t=e.querySelector("div.ct-encoded-form").dataset.encodedForm;try{t&&"string"==typeof t&&(e.outerHTML=atob(t))}catch(e){console.log(e)}})}showMessageForBot(t){let o;this.wrappers.forEach(e=>{(o=e.querySelector("div.ct-encoded-form").dataset.encodedForm)&&(e.outerHTML='
'+t+"
")})}}function apbctForceProtect(){ctPublic.settings__forms__force_protection&&void 0!==ApbctForceProtection&&new ApbctForceProtection}ctPublic.data__key_is_ok&&("loading"!==document.readyState?apbctForceProtect():apbct_attach_event_handler(document,"DOMContentLoaded",apbctForceProtect));class CTTypoData{fieldData={isAutoFill:!1,isUseBuffer:!1,speedDelta:0,firstKeyTimestamp:0,lastKeyTimestamp:0,lastDelta:0,countOfKey:0};fields=document.querySelectorAll("textarea[name=comment]");data=[];gatheringFields(){Array.prototype.slice.call(this.fields).forEach((e,t)=>{this.data.push(Object.assign({},this.fieldData))})}setListeners(){this.fields.forEach((e,t)=>{e.addEventListener("paste",()=>{this.data[t].isUseBuffer=!0})}),this.fields.forEach((e,t)=>{e.addEventListener("onautocomplete",()=>{this.data[t].isAutoFill=!0})}),this.fields.forEach((e,o)=>{e.addEventListener("input",()=>{this.data[o].countOfKey++;var e,t=+new Date;1===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].firstKeyTimestamp=t):(e=t-this.data[o].lastKeyTimestamp,2===this.data[o].countOfKey?(this.data[o].lastKeyTimestamp=t,this.data[o].lastDelta=e):2{window.XMLHttpRequest.prototype.send=defaultSend},0)}),e.target.onsubmit_prev instanceof Function&&!ctOnsubmitPrevCallExclude(e.target)&&(void 0!==e.target.classList&&e.target.classList.contains("brave_form_form")&&e.preventDefault(),setTimeout(function(){e.target.onsubmit_prev.call(e.target,e)},0))})}},1e3),document.querySelectorAll("[data-original-string]"));if((ctPublic.encodedEmailNodes=n).length)for(let e=0;ectSearchFormOnSubmitHandler(e,t));apbctCatchXmlHttpRequest(),new ApbctCollectingUserActivity,ctPublic.settings__sfw__anti_crawler&&checkBotDetectorExist()}function checkBotDetectorExist(){if(ctPublic.settings__data__bot_detector_enabled){let e=setInterval(()=>{!localStorage.bot_detector_event_token||(ctSetCookie("apbct_bot_detector_exist","1","3600"),clearInterval(e))},500)}}function ctAddWCMiddlewares(){window.hasOwnProperty("wp")&&window.wp.hasOwnProperty("apiFetch")&&"function"==typeof window.wp.apiFetch.use&&window.wp.apiFetch.use((e,t)=>("object"==typeof e&&null!==e&&e.hasOwnProperty("data")&&e.hasOwnProperty("path")&&(e.data.hasOwnProperty("requests")&&0{null!==e&&e.parentNode.removeChild(e),"function"==typeof c.apbctSearchPrevOnsubmit?c.apbctSearchPrevOnsubmit():HTMLFormElement.prototype.submit.call(c)},a=s,null!==t&&(a.apbct_search_form__honeypot_value=t),a.ct_bot_detector_event_token=l,"string"==typeof a.apbct_pixel_url&&-1!==a.apbct_pixel_url.indexOf("%3A")&&(a.apbct_pixel_url=decodeURIComponent(a.apbct_pixel_url)),void 0!==(i=JSON.stringify(a))&&0!==i.length?ctSetAlternativeCookie(i,{callback:n,onErrorCallback:n,forceAltCookies:!0}):n())}catch(e){console.warn("APBCT search form onsubmit handler error. "+e)}}function getJavascriptClientData(t=[]){let o={};o.ct_checked_emails=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails"),o.ct_checked_emails_exist=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checked_emails_exist"),o.ct_checkjs=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_checkjs"),o.ct_fkp_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_fkp_timestamp"),o.ct_pointer_data=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_pointer_data"),o.ct_ps_timestamp=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_ps_timestamp"),o.ct_screen_info=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_screen_info"),o.ct_timezone=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_timezone");var e=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),c=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),n=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),a=apbctLocalStorage.get("apbct_page_hits"),i=apbctSessionStorage.get("apbct_prev_referer"),s=apbctSessionStorage.get("apbct_site_referer"),l=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_js_errors"),r=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),d=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"apbct_headless"),u=apbctLocalStorage.get(ctPublicFunctions.cookiePrefix+"ct_bot_detector_frontend_data_log"),p=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_mouse_moved"),_=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_cookies_type"),b=ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_pixel_url"),h=!!ctGetCookie(ctPublicFunctions.cookiePrefix+"apbct_headless");if(o.ct_mouse_moved=void 0!==e?e:p,o.ct_has_scrolled=void 0!==c?c:_,o.ct_cookies_type=void 0!==n?n:m,o.apbct_pixel_url=void 0!==r?r:b,o.apbct_headless=void 0!==d?d:h,o.ct_bot_detector_frontend_data_log=void 0!==u?u:"",o.apbct_pixel_url&&"string"==typeof o.apbct_pixel_url&&o.apbct_pixel_url.indexOf("%3A%2F")&&(o.apbct_pixel_url=decodeURIComponent(o.apbct_pixel_url)),o.apbct_page_hits=a,o.apbct_prev_referer=i,o.apbct_site_referer=s,o.apbct_ct_js_errors=l,o.apbct_pixel_url||(o.apbct_pixel_url=ctPublic.pixel__url),"object"==typeof t)for(let e=0;e{c.addEventListener("click",function(e){let t=c.getAttribute("href");var o=apbctLocalStorage.get("bot_detector_event_token");o&&(-1===t.indexOf("?")?t+="?":t+="&",t+="ct_bot_detector_event_token="+o,c.setAttribute("href",t))})})}"loading"!==document.readyState?checkFormsExistForCatching():apbct_attach_event_handler(document,"DOMContentLoaded",checkFormsExistForCatching);let cleantalkModal={loaded:!1,loading:!1,opened:!1,opening:!1,ignoreURLConvert:!1,load:function(e){var t;this.loaded||(this.loading=!0,t=function(e,t,o,c){cleantalkModal.loading=!1,cleantalkModal.loaded=e,document.dispatchEvent(new CustomEvent("cleantalkModalContentLoaded",{bubbles:!0}))},("function"==typeof apbct_admin_sendAJAX?apbct_admin_sendAJAX:apbct_public_sendAJAX)({action:e},{callback:t,notJson:!0}))},open:function(){function e(){let e="";for(var t in this.styles)e+=t+":"+this.styles[t]+";";return e}var t={styles:{"z-index":"9999999999",position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",display:"flex","justify-content":"center","align-items":"center"},toString:e},o={styles:{position:"relative",padding:"30px",background:"#FFF",border:"1px solid rgba(0,0,0,0.75)","border-radius":"4px","box-shadow":"7px 7px 5px 0px rgba(50,50,50,0.75)"},toString:e},c={styles:{position:"absolute",background:"#FFF",width:"20px",height:"20px",border:"2px solid rgba(0,0,0,0.75)","border-radius":"15px",cursor:"pointer",top:"-8px",right:"-8px","box-sizing":"content-box"},toString:e},n={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(45deg)"},toString:e},a={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},i={styles:{overflow:"hidden"},toString:e},s=document.createElement("style"),i=(s.setAttribute("id","cleantalk-modal-styles"),s.innerHTML="body.cleantalk-modal-opened{"+i+"}",s.innerHTML+="#cleantalk-modal-overlay{"+t+"}",s.innerHTML+="#cleantalk-modal-close{"+c+"}",s.innerHTML+="#cleantalk-modal-close:before{"+n+"}",s.innerHTML+="#cleantalk-modal-close:after{"+a+"}",document.body.append(s),document.createElement("div")),t=(i.setAttribute("id","cleantalk-modal-overlay"),document.body.append(i),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),c=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",o),i.append(t),document.createElement("div")),n=(c.setAttribute("id","cleantalk-modal-close"),t.append(c),document.createElement("div"));this.loaded?(a=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?n.innerHTML=this.loaded:n.innerHTML=this.loaded.replace(a,'$1')):(n.innerHTML="Loading...",this.load("get_options_template")),n.setAttribute("id","cleantalk-modal-content"),t.append(n),this.opened=!0},close:function(){document.body.classList.remove("cleantalk-modal-opened"),document.getElementById("cleantalk-modal-overlay").remove(),document.getElementById("cleantalk-modal-styles").remove(),document.dispatchEvent(new CustomEvent("cleantalkModalClosed",{bubbles:!0}))}};function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}function ctCheckInternal(t){var e={},o=t.elements;let c;for(c in o)"submit"!==o[c].type&&void 0!==o[c].value&&""!==o[c].value&&(e[o[c].name]=t.elements[c].value);e.action="ct_check_internal",apbct_public_sendAJAX(e,{url:ctPublicFunctions._ajax_url,callback:function(e){if(!0!==e.success)return alert(e.data),!1;t.origSubmit()}})}function ctProtectInternalForms(){var t,o="",c="";for(let e=0;enull!==t.match(new RegExp(ctPublic.blog_home+".*"+e)))}document.addEventListener("click",function(e){!e.target||"cleantalk-modal-overlay"!==e.target.id&&"cleantalk-modal-close"!==e.target.id||cleantalkModal.close()}),document.addEventListener("cleantalkModalContentLoaded",function(e){cleantalkModal.opened&&cleantalkModal.loaded&&(document.getElementById("cleantalk-modal-content").innerHTML=cleantalkModal.loaded)}),document.addEventListener("DOMContentLoaded",function(){let r=void 0,d=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(r="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:r)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(r=ctTrpAdminLocalize.theRealPerson,d=!0),r){let e='.apbct-trp *[class*="comment-author"]';document.querySelector(".apbct-trp .comment-author .comment-author-link")&&(e='.apbct-trp *[class*="comment-author-link"]');var t=document.querySelectorAll(e+',.apbct-trp *[class*="review__author"],.apbct-trp td[class*="column-author"] > strong');0!==t.length&&(t.forEach((e,t)=>{var o,c,n,a,i,s,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((o=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(c=document.createElement("img")).setAttribute("src",r.imgPersonUrl),c.setAttribute("class","apbct-real-user-popup-img"),(n=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(a=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),a.append(r.phrases.trpHeading),(i=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(s=document.createElement("span")).append(r.phrases.trpContent1+" "),s.append(r.phrases.trpContent2),d&&((l=document.createElement("a")).setAttribute("href",r.trpContentLink),l.setAttribute("target","_blank"),l.text=r.phrases.trpContentLearnMore,s.append(" "),s.append(l)),i.append(s),n.append(a,i),o.append(c),e.append(o),e.append(n))}),document.querySelectorAll(".apbct-real-user-badge").forEach(o=>{let c=void 0,e=(this.body.addEventListener("click",function(e){-1==e.target.className.indexOf("apbct-real-user")&&-1==e.target.parentElement.className.indexOf("apbct-real-user")&&closeAllPopupTRP()}),o.addEventListener("click",function(){var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.toggle("visible")}),o.addEventListener("mouseenter",function(){closeAllPopupTRP();var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.add("visible")}),o.addEventListener("mouseleave",function(){c=setTimeout(()=>{var e=this.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.nextElementSibling);e.addEventListener("mouseenter",function(){clearTimeout(c),e.classList.add("visible")}),e.addEventListener("mouseleave",function(){c=setTimeout(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),o.addEventListener("touchend",function(){c=setTimeout(()=>{var e=this.nextElementSibling,t=window.getSelection();e&&t&&e.classList.contains("apbct-real-user-popup")&&0===t.toString().length?e.classList.remove("visible"):(clearTimeout(c),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(c=setTimeout(()=>{var e=o.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}),document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); +//# sourceMappingURL=apbct-public-bundle_int-protection_comm-func.min.js.map diff --git a/js/apbct-public-bundle_int-protection_comm-func.min.js.map b/js/apbct-public-bundle_int-protection_comm-func.min.js.map new file mode 100644 index 000000000..f3b0620d1 --- /dev/null +++ b/js/apbct-public-bundle_int-protection_comm-func.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"apbct-public-bundle_int-protection_comm-func.min.js","sources":["apbct-public-bundle_int-protection_comm-func.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 fillDecodedNodes(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} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[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 encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[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 encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.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(/.+?(
)/, 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= 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 let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').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 smartQuizBuilder;\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 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 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 document.dispatchEvent(new Event('apbctForceProtectionAllowed'));\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 = '
' + message + '
';\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 if (form.querySelector('input[name=\"wspsc_add_cart_submit\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikrentcar\"]') ||\n form.querySelector('input[name=\"option\"][value=\"com_vikbooking\"]')\n ) {\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 if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) {\n event.preventDefault();\n }\n setTimeout(function() {\n event.target.onsubmit_prev.call(event.target, event);\n }, 0);\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 let msg = '';\n if (typeof response.apbct !== 'undefined') {\n response = response.apbct;\n if (response.blocked) {\n msg = response.comment;\n }\n }\n if (typeof response.data !== 'undefined') {\n response = response.data;\n if (response.message !== undefined) {\n msg = response.message;\n }\n }\n\n if (msg) {\n document.dispatchEvent(\n new CustomEvent( 'apbctAjaxBockAlert', {\n bubbles: true,\n detail: {message: msg},\n } ),\n );\n\n // Show the result by modal\n cleantalkModal.loaded = msg;\n cleantalkModal.open();\n\n if (+response.stop_script === 1) {\n window.stop();\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, '$1');\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 if ( ! +ctPublic.settings__forms__check_internal ) {\n return;\n }\n\n setTimeout(() => {\n ctProtectInternalForms();\n }, 500);\n\n document.addEventListener('apbctForceProtectionAllowed', function() {\n ctProtectInternalForms();\n });\n});\n\n/**\n * Protect internal forms\n * @return {void}\n */\nfunction ctProtectInternalForms() {\n let ctCurrAction = '';\n let ctCurrForm = '';\n\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}\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","fillDecodedNodes","click","text__ee_blocked","comment","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","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","smartQuizBuilder","bookingPress","isArray","e","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","Event","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","contains","_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","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_site_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","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","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","settings__forms__check_internal"],"mappings":"AAGA,SAASA,qCACL,IAAMC,EAAoB,CAAC,gBAAiB,gBAAiB,mBACvDC,EAAmBC,SAASC,cAAc,KAAK,EACrDF,EAAiBG,UAAY,6BAC7B,IAAKC,IAAIC,EAAI,EAAGA,EAAIN,EAAkBO,OAAQD,CAAC,GAAI,CAC/C,IAAME,EAAyBN,SAASC,cAAc,MAAM,EAC5DK,EAAuBJ,UAAY,aAAeJ,EAAkBM,GACpEE,EAAuBC,UAAY,IACnCR,EAAiBS,OAAOF,CAAsB,CAClD,CACA,OAAOP,CACX,CAKA,SAASU,0BAA0BC,EAAQ,CAAA,GACvCP,IAAIQ,EAAc,CAAA,EACdC,EAAgB,GAChBC,EAAe,GACK,aAApB,OAAOC,UACPC,KAAKC,oBAAoB,QAASP,yBAAyB,EAE3DE,EAAcI,KAEdD,SAASG,yBAA2B,CAAA,EACpCL,EAAgBE,SAASI,aACzBL,EAAeC,SAASK,mBACQ,aAAzB,OAAOC,gBACdR,EAAgBQ,cAAcC,YAC9BR,EAAeO,cAAcE,kBAIjCtB,SAASuB,KAAKrB,UAAUsB,IAAI,kBAAkB,EAE9CrB,IAQQsB,EAQAC,EAOAC,EAWAC,EAlCJC,EAAe7B,SAAS8B,eAAe,aAAa,EACnDD,GAiDDA,EAAaE,aAAa,QAAS,kBAAkB,EACpB,aAA7B,OAAOC,mBAAqCA,kBAAkBC,2BAC9DjC,SAAS8B,eAAe,kBAAkB,EAAEI,UAAYF,kBAAkBC,2BAE1EjC,SAAS8B,eAAe,kBAAkB,EAAEI,UAAYd,cAAca,8BAnDtEE,EAAenC,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uCAAuC,EAC1EI,EAAaJ,aAAa,KAAM,aAAa,GAGzCN,EAAqBzB,SAASC,cAAc,MAAM,GACnCC,UAAY,uCAC3BkC,EAAcpC,SAASC,cAAc,GAAG,GAChCM,UAAYK,EACxBwB,EAAYL,aAAa,QAAS,mCAAmC,EACrEN,EAAmBjB,OAAO4B,CAAW,GAGjCV,EAAmB1B,SAASC,cAAc,KAAK,GAClC8B,aAAa,KAAM,kBAAkB,EACtDL,EAAiBK,aAAa,QAAS,qCAAqC,EAC5EL,EAAiBW,MAAMC,MAAQ,SAI3BX,EAAmB3B,SAASC,cAAc,GAAG,GAChCsC,GAAK,4CACW,aAA7B,OAAOP,mBAAqCA,kBAAkBC,2BAC9DN,EAAiBpB,UAAYyB,kBAAkBC,2BAE/CN,EAAiBpB,UAAYa,cAAca,2BAE/CN,EAAiBI,aAAa,QAAS,qCAAqC,GAIxEH,EAAoB5B,SAASC,cAAc,GAAG,GAChCsC,GAAK,6CACU,aAA7B,OAAOP,mBAAqCA,kBAAkBQ,0BAC9DZ,EAAkBrB,UAAYyB,kBAAkBQ,0BAEhDZ,EAAkBrB,UAAYa,cAAcoB,0BAIhDd,EAAiBlB,OAAOmB,CAAgB,EACxCD,EAAiBlB,OAAOoB,CAAiB,EACzCO,EAAa3B,OAAOiB,CAAkB,EACtCU,EAAa3B,OAAOkB,CAAgB,EACpCS,EAAa3B,OAAOX,mCAAmC,CAAC,EACxDG,SAASuB,KAAKf,OAAO2B,CAAY,GAUrCM,yBAAyB/B,EAAOG,EAAcF,CAAW,CAC7D,CAOA,SAAS8B,yBAAyB/B,EAAOS,EAAmBR,GACxD,GAAID,GAASC,EAAa,CAEtB,IACI+B,EAAO,CACPC,sBAFyBC,wBAAwB,EAGjDC,SAAU7C,SAAS8C,SAASC,KAC5BC,SAAUhD,SAASgD,SACnBC,cAAe,EACnB,EACIC,EAA0B,GAC9B,IAAK/C,IAAIC,EAAI,EAAGA,EAAIe,EAAkBd,OAAQD,CAAC,GAAI,CAGN,KAAA,IAA9Be,EAAkBf,GAAG2C,MACqB,IAAjD5B,EAAkBf,GAAG2C,KAAKI,QAAQ,SAAS,IAE3CzC,EAAM0C,eAAe,EACrBtC,SAASG,yBAA2B,CAAA,GAIxCd,IAAIkD,EAAerD,SAASC,cAAc,KAAK,EAC/CoD,EAAatB,aAAa,QAAS,eAAe,EAClDuB,MAAMnC,EAAkBf,EAAE,EAAEI,OAAO6C,CAAY,EAG/CH,EAAwB9C,GAAKe,EAAkBf,GAAGmD,QAAQC,cAC9D,CAGAd,EAAKO,cAAgBQ,KAAKC,UAAUR,CAAuB,EAGhB,SAAtClB,kBAAkB2B,gBACnBC,sBACI,qBACA,CACIlB,KAAMA,EACNmB,OAAQ,OACRC,SAAU,SAASC,GAEfC,YAAY,6BAA8BlD,SAASmD,oBAAqB,EAAE,EAC1EC,8BAA8BH,EAAQ5C,EAAmBR,CAAW,CACxE,EACAwD,gBAAiB,SAASC,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,GAIA1B,EAAK6B,OAAS,qBACdC,sBACI9B,EACA,CACI+B,QAAS,CAAA,EACTX,SAAU,SAASC,GACfW,QAAQC,IAAI,QAAQ,EACpBD,QAAQC,IAAIZ,CAAM,EAGlBC,YAAY,6BAA8BlD,SAASmD,oBAAqB,EAAE,EAC1EC,8BAA8BH,EAAQ5C,EAAmBR,CAAW,CACxE,EACAwD,gBAAiB,SAASC,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,EAER,KAAO,CACH,IAAMvD,EAAeM,EAAkBoC,QAAQC,eAC3Cd,EAAO,CACPO,cAAeQ,KAAKC,UAAU,CAACkB,EAAG/D,CAAY,CAAC,CACnD,EAGIwC,EAAerD,SAASC,cAAc,KAAK,EAC/CoD,EAAatB,aAAa,QAAS,eAAe,EAClDZ,EAAkB0D,YAAYxB,CAAY,EAE1CyB,qBACI,CACIP,OAAU,qBACVtB,cAAiBP,EAAKO,aAC1B,EACA,CACIa,SAAY,SAASC,GACjBG,8BAA8BH,EAAQ5C,EAAmB,CAAA,CAAK,CAClE,EACAsD,QAAW,CAAA,CACf,CACJ,CACJ,CACJ,CAOA,SAASP,8BAA8BH,EAAQ5C,EAAmBR,EAAc,CAAA,GACxEoD,EAAOgB,SAAyC,CAAA,IAA9BhB,EAAOrB,KAAK,GAAGsC,WAEjCC,WAAW,WAEP9E,IAAI+E,EAAQlF,SAAS8B,eAAe,aAAa,EACjD,GAAc,OAAVoD,EAAgB,CAChB/E,IAAIgF,EAAQ,GACZ,GAAIxE,EAAa,CACbR,IAAIiF,EACJrB,EAAOrB,KAAK2C,QAAQ,IACZC,EAAIC,gBAAkB5E,EAAY4C,QAAQC,iBAC1C4B,EAAoBE,EAE5B,CAAC,EAEDH,EAAQC,EAAkBI,cAAcC,MAAM,MAAM,EAAE,EAC1D,MACIN,EAAQpB,EAAOrB,KAAK,GAAG8C,cAG3BrF,IAAIuF,EAAYR,EAAMS,cAAc,4CAA4C,EAE5EC,EAAkB5F,SAASC,cAAc,GAAG,EAqB5C4F,GApBJD,EAAgB7D,aAAa,QAAS,wCAAwC,EAC9E6D,EAAgBrF,UAAY4E,EACK,aAA7B,OAAOnD,mBAAqCA,kBAAkB8D,yBAC9DF,EAAgBG,MAAQ/D,kBAAkB8D,yBAE1CF,EAAgBG,MAAQ3E,cAAc0E,yBAGtCJ,IACiC,aAA7B,OAAO1D,mBAAqCA,kBAAkBgE,wBAC9DN,EAAUxD,UAAYF,kBAAkBgE,wBACpC,SAAWJ,EAAgBK,UAE/BP,EAAUxD,UAAYd,cAAc4E,wBAChC,SAAWJ,EAAgBK,UAGnCP,EAAU3D,aAAa,QAAS,sBAAsB,GAG5CmD,EAAMS,cAAc,6BAA6B,GAK3DO,GAJAL,GACAA,EAAQM,OAAO,EAGFjB,EAAMS,cAAc,6CAA6C,GAK9ES,GAJAF,GACAA,EAAWC,OAAO,EAGFnG,SAASC,cAAc,MAAM,GACjDmG,EAAclG,UAAY,sDACrBF,SAAS2F,cAAc,oCAAoC,IACxDU,EAASrG,SAASC,cAAc,QAAQ,EACX,aAA7B,OAAO+B,mBAAqCA,kBAAkBsE,gBAC9DD,EAAO9F,UAAYyB,kBAAkBsE,gBAErCD,EAAO9F,UAAYa,cAAckF,gBAErCD,EAAOnG,UAAY,oCACnBmG,EAAOE,iBAAiB,QAAS,WAC7BvG,SAASuB,KAAKrB,UAAUiG,OAAO,kBAAkB,EACjDjB,EAAMnD,aAAa,QAAS,cAAc,EAC1CyE,iBAAiBrF,EAAmB4C,CAAM,EAElB,aAApB,OAAOjD,UAA4BA,SAASG,0BAA4BN,GACxEA,EAAY8F,MAAM,CAE1B,CAAC,EACDL,EAAc5F,OAAO6F,CAAM,EAC3BnB,EAAM1E,OAAO4F,CAAa,EAElC,CACJ,EAAG,GAAI,EAEHzF,EACIoD,EAAOgB,SACPV,kBAAkB,EACe,aAA7B,OAAOrC,mBAAqCA,kBAAkB0E,iBAC9DpC,oBAAoBtC,kBAAkB0E,iBAAmB,KAAO3C,EAAOrB,KAAK,GAAGiE,OAAO,EAEtFrC,oBAAoBlD,cAAcsF,iBAAmB,KAAO3C,EAAOrB,KAAK,GAAGiE,OAAO,IAGtFtC,kBAAkB,EACe,aAA7B,OAAOrC,mBAAqCA,kBAAkB4E,wBAC9DtC,oBAAoBtC,kBAAkB4E,wBAA0B,KAAO7C,EAAOT,MAAMqD,OAAO,EAE3FrC,oBAAoBlD,cAAcwF,wBAA0B,KAAO7C,EAAOrB,KAAK,GAAGiE,OAAO,GAIjGjC,QAAQC,IAAI,SAAUZ,CAAM,CAGxC,CAKA,SAASM,oBACqC,KAAA,IAA/BvD,SAASK,mBAChBL,SAASK,kBAAkBkE,QAAQ,SAASwB,GACxCA,EAAQN,iBAAiB,QAAS9F,yBAAyB,CAC/D,CAAC,CAET,CAMA,SAAS6D,oBAAoBqC,GAClBA,EAAAA,IAC8B,aAA7B,OAAO3E,mBAAqCA,kBAAkB8E,uBACpD9E,kBAEAZ,eAFkB0F,uBAMpC3G,IAAI+E,EAAQlF,SAAS8B,eAAe,aAAa,EACjD3B,IAAI4G,EAAY/G,SAAS8B,eAAe,kBAAkB,EAC5C,OAAVoD,IACAlF,SAASuB,KAAKrB,UAAUiG,OAAO,kBAAkB,EAChB,aAA7B,OAAOnE,mBAAqCA,kBAAkBgF,uBAC9DD,EAAUxG,UAAYyB,kBAAkBgF,uBAAyB,KAAOL,EAExEI,EAAUxG,UAAYa,cAAc4F,uBAAyB,KAAOL,EAExE1B,WAAW,WACPC,EAAMnD,aAAa,QAAS,cAAc,CAC9C,EAAG,GAAI,EAEf,CAOA,SAASyE,iBAAiBS,EAAcC,GACpC,GAA0B,EAAtBD,EAAa5G,OACb,IAAKF,IAAIC,EAAI,EAAGA,EAAI6G,EAAa5G,OAAQD,CAAC,GAAI,CAE1CD,IAAIiF,EAOJ,GANA8B,EAAexE,KAAK2C,QAAQ,IACpBC,EAAIC,gBAAkB0B,EAAa7G,GAAGmD,QAAQC,iBAC9C4B,EAAoBE,EAE5B,CAAC,EAEoC,CAAA,IAAjCF,EAAkBJ,WAClB,OAGJ,GACoC,KAAA,IAAzBiC,EAAa7G,GAAG2C,MAEyB,IAA5CkE,EAAa7G,GAAG2C,KAAKI,QAAQ,SAAS,GACG,IAAzC8D,EAAa7G,GAAG2C,KAAKI,QAAQ,MAAM,EA6BvC8D,EAAa7G,GAAGF,UAAUsB,IAAI,SAAS,EAEvCyD,WAAW,KACPkC,2BAA2B/B,EAAmB6B,EAAa7G,EAAE,CACjE,EAAG,GAAI,MA/BT,CACED,IAAIiH,EACJ,GAAgD,IAA5CH,EAAa7G,GAAG2C,KAAKI,QAAQ,SAAS,EACtCiE,EAAiB,cACd,CAAA,GAA6C,IAAzCH,EAAa7G,GAAG2C,KAAKI,QAAQ,MAAM,EAG1C,SAFAiE,EAAiB,MAGrB,CACAjH,IAAIU,EAAeoG,EAAa7G,GAAG2C,KAAKsE,QAAQD,EAAgB,EAAE,EAC9DE,EAAqBL,EAAa7G,GAAG8B,UACzC+E,EAAa7G,GAAG8B,UAAYoF,EAAmBD,QAC3CxG,EACAuE,EAAkBI,aACtB,EACAyB,EAAa7G,GAAG2C,KAAOqE,EAAiBhC,EAAkBI,cAE1DyB,EAAa7G,GAAGmH,iBAAiB,0BAA0B,EAAElC,QAAQ,IACjElF,IAAIqH,EAA+B,GACnCN,EAAexE,KAAK2C,QAAQ,IACpBC,EAAIC,gBAAkBkC,EAAGlE,QAAQC,iBACjCgE,EAA+BlC,EAAIE,cAE3C,CAAC,EACDiC,EAAGvF,UAAYsF,CACnB,CAAC,CACL,CAQAP,EAAa7G,GAAGY,oBAAoB,QAASP,yBAAyB,CAC1E,KACG,CACHN,IAAIiF,EAAoB8B,EAAexE,KAAK,GAC5CuE,EAAa/G,UAAUsB,IAAI,SAAS,EAEpCyD,WAAW,KACPkC,2BAA2B/B,EAAmB6B,CAAY,CAC9D,EAAG,GAAI,EACPA,EAAajG,oBAAoB,QAASP,yBAAyB,CACvE,CACJ,CAMA,SAAS0G,2BAA2BO,EAAUC,GAC1CA,EAAc5F,aAAa,QAAS,EAAE,EACtC4F,EAAcC,gBAAgB,OAAO,EACrCC,mBAAmBF,EAAeD,EAASlC,aAAa,CAC5D,CAMA,SAASqC,mBAAmBC,EAAQ3C,GAChC2C,EAAO5F,UAAY4F,EAAO5F,UAAUmF,QAAQ,kDAAmDlC,EAAQ,IAAI,CAC/G,OAKM4C,UACFC,gBAAkB,GAClBC,eAAiB,GAEjBC,SAAW,KACXC,SAAW,GAGXC,cACAC,cACA3H,MAMA4H,YAAYJ,GACRnH,KAAKwH,OAAOL,CAAQ,CACxB,CAQAK,OAAOL,GAiBH,OAhBIA,aAAoBM,gBACpBzH,KAAKmH,SAAW,KAChBnH,KAAKoH,SAAW,GAChBpH,KAAKoH,SAAWM,MAAMC,UAAUC,MAAMC,KAAKV,CAAQ,GACvB,UAApB,OAAOA,GACfnH,KAAKmH,SAAW,KAChBnH,KAAKoH,SAAW,GAChBpH,KAAKoH,SAAS,GAAKD,GACS,UAApB,OAAOA,GACfnH,KAAKmH,SAAWA,EAChBnH,KAAKoH,SAAWM,MAAMC,UAAUC,MAAMC,KAAK5I,SAASuH,iBAAiBW,CAAQ,CAAC,GAG9EnH,KAAK8H,SAAS,EAGX9H,IACX,CAKA+H,WAAWC,GACmB,UAArB,OAAOA,EACRhI,KAAKoH,SAASa,KAAKD,CAAS,EACC,UAArB,OAAOA,GACfhI,KAAKmH,SAAWa,EAChBhI,KAAKoH,SAAWM,MAAMC,UAAUC,MAAMC,KAAK5I,SAASuH,iBAAiBwB,CAAS,CAAC,GAE/EhI,KAAK8H,SAAS,CAEtB,CAKAG,KAAKC,GACDlI,KAAKoH,SAASa,KAAKC,CAAI,CAC3B,CAKAC,SACInI,KAAKoH,SAAWpH,KAAKoH,SAASQ,MAAM,EAAG,CAAC,CAAC,CAC7C,CAKAE,WACI9H,KAAKoH,SAAW,EACpB,CAUAgB,IAAI9G,EAAO+G,GAIP,GAHAA,EAASA,GAAU,CAAA,EAGE,UAAjB,OAAO/G,EAAoB,CAU3B,IAAK,IAAMgH,KAAahH,EACpB,GAAIiH,OAAOC,OAAOlH,EAAOgH,CAAS,EAAG,CACjC,IAAMG,EAAiCH,EAVvChC,QAAQ,eAAgB,GACxBoC,EACKC,YAAY,EACZrC,QAAQ,IAAK,EAAE,EACfA,QAAQ,IAAK,EAAE,CACxB,EAQI,IAAKlH,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCW,KAAKoH,SAAS/H,GAAGiC,MAAMmH,GAAgBnH,EAAMgH,EAErD,CAGJ,OAAOtI,IACX,CAGA,GAAqB,UAAjB,OAAOsB,EAAoB,CAC3BlC,IAAIwJ,EAAgBC,iBAAiB7I,KAAKoH,SAAS,EAAE,EAAE9F,GAGvD,OAA8B,KAAA,IAAlBsH,GAAmCP,EASxCO,GAPHA,EAAgBA,EAActC,QAAQ,yBAA0B,IAAI,EAEpEsC,EAAgBE,OAAOF,CAAa,GAAKA,EAAgBE,OAAOF,CAAa,EAAIA,EAMzF,CACJ,CAKAG,OACI/I,KAAKgJ,KAAK,eAAgBhJ,KAAKoI,IAAI,SAAS,CAAC,EAC7CpI,KAAKoI,IAAI,CAACa,QAAW,MAAM,CAAC,CAChC,CAKAC,OACIlJ,KAAKoI,IAAI,CAACa,QAAWjJ,KAAKgJ,KAAK,cAAc,CAAC,CAAC,CACnD,CAKAG,WACI,IAAK/J,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCW,KAAKoH,SAAS/H,GAAGF,UAAUsB,IAAI2I,SAAS,CAEhD,CAKAC,cACI,IAAKjK,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCW,KAAKoH,SAAS/H,GAAGF,UAAUiG,OAAOgE,SAAS,CAEnD,CAKAE,YAAYF,GACR,IAAKhK,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCW,KAAKoH,SAAS/H,GAAGF,UAAUoK,OAAOH,CAAS,CAEnD,CAQAI,KAAKC,GAED,OADAzJ,KAAKiH,gBAAkBwC,EAChB,IAAIC,UAAUD,CAAc,CACvC,CAQAE,KAAKzC,GAED,OADAlH,KAAKkH,eAAiBA,EACf,IAAI0C,UAAU1C,CAAc,CACvC,CAgBA2C,MAAMC,GACF9J,KAAKL,MAAQmK,EAAK,GAClB9J,KAAKqH,cAAgByC,EAAK,IAAMA,EAAK,GACrC9J,KAAKsH,cAAmC,UAAnB,OAAOwC,EAAK,GAAkBA,EAAK,GAAK,KAE7D,IAAK1K,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCW,KAAKoH,SAAS/H,GAAGmG,iBACbxF,KAAKL,MACkB,OAAvBK,KAAKsH,cACDtH,KAAK+J,UAAUC,KAAKhK,IAAI,EACxBA,KAAKqH,aACb,CAER,CAQA0C,UAAUpK,GACN,GAAIA,EAAMoH,SAAW9H,SAAS2F,cAAc5E,KAAKsH,aAAa,EAE1D,OADA3H,EAAMsK,gBAAgB,EACfjK,KAAKqH,cAAc1H,CAAK,CAEvC,CAKAuK,MAAMnH,GACF9D,SAASuG,iBAAiB,mBAAoBzC,CAAQ,CAC1D,CAKAoH,OAAOpH,GACH/C,KAAK6J,GAAG,SAAU9G,CAAQ,CAC9B,CAYAqH,KAAKC,GACDjL,IAAIkL,EAAc,GAElB,IAAKlL,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GAEO,KAAA,IAA/BW,KAAKoH,SAAS/H,GAAGgL,GACxBC,EAAYrC,KAAKjI,KAAKoH,SAAS/H,GAAGgL,EAAS,EAE3CC,EAAYrC,KAAKjI,KAAKoH,SAAS/H,GAAGkL,aAAaF,CAAQ,CAAC,EAKhE,OAA8B,IAAvBC,EAAYhL,OAAegL,EAAY,GAAKA,CACvD,CAOAtB,KAAKwB,EAAUC,GAEX,GAAqB,KAAA,IAAVA,EAAuB,CAC9B,IAAKrL,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCW,KAAKoH,SAAS/H,GAAGmL,GAAYC,EAGjC,OAAOzK,IAGX,CACI,IAAMsK,EAAc,GAEpB,IAAKlL,IAAIC,EAAE,EAAGA,EAAEW,KAAKoH,SAAS9H,OAAQD,CAAC,GACnCiL,EAAYrC,KAAKjI,KAAKoH,SAAS/H,GAAGmL,EAAS,EAI/C,OAA8B,IAAvBF,EAAYhL,OAAegL,EAAY,GAAKA,CAE3D,CAQAI,KAAKD,GACD,OAAwB,KAAA,IAAVA,EACVzK,KAAKgJ,KAAK,YAAayB,CAAK,EAC5BzK,KAAKgJ,KAAK,WAAW,CAC7B,CAQA2B,IAAIF,GACA,OAAwB,KAAA,IAAVA,EACVzK,KAAKgJ,KAAK,QAASyB,CAAK,EACxBzK,KAAKgJ,KAAK,OAAO,CACzB,CAOArH,KAAKiJ,EAAMH,GACP,OAAwB,KAAA,IAAVA,EACVzK,KAAKgJ,KAAK,aAAc4B,EAAMH,CAAK,EACnCzK,KAAKgJ,KAAK,YAAY,CAC9B,CAgBA6B,GAAGC,GACC1L,IAAIkL,EAAc,CAAA,EAElB,IAAKlL,IAAI8I,KAAQlI,KAAKoH,SAClBkD,IAAgBtK,KAAK+K,OAAO7C,EAAM4C,CAAM,EAG5C,OAAOR,CACX,CAOAS,OAAOC,EAAaF,GAChB1L,IAAIyL,EAAK,CAAA,EA6BT,MAtBsB,YAAlB,OAAOC,IACPD,IAAOC,EAAOjD,KAAK7H,KAAMgL,CAAW,GAIlB,UAAlB,OAAOF,IAEFA,EAAOG,MAAM,QAAQ,IAbKL,IAC3BM,EAAsBjM,SAASC,cAAc0L,CAAI,EAAErD,YAChD,CAAE4D,QAAS,CAAC,CAACC,YAAaC,oBAAoBjJ,QAAQ8I,CAAmB,CAAE,IAW/BJ,CAAM,EACrDD,IAAOG,EAAYM,QAAQC,YAAY,IAAMT,EAAOS,YAAY,EAGxDT,EAAOG,MAAM,QAAQ,EAC7BJ,IAAOM,QAAQH,EAAYF,EAAO,EAIlCD,IAAyB,OAAlB7K,KAAKmH,SAC2C,OAAnDlI,SAAS2F,cAAc5E,KAAKmH,SAAW2D,CAAM,EAC7C9K,KAAKwL,kBAAkBR,EAAaF,CAAM,GAI/CD,CACX,CAOAW,kBAAkBR,EAAaF,GAC3B,IAGS5C,EAFT9I,IAAIkL,EAAc,CAAA,EAElB,IAASpC,KAHKjJ,SAASuH,iBAAiBsE,CAAM,EAI1CR,IAAgBU,IAAgB9C,EAGpC,OAAOoC,CACX,CAMAQ,OAAOA,GACH9K,KAAKmH,SAAW,KAEhB,IAAM/H,IAAIC,EAAIW,KAAKoH,SAAS9H,OAAS,EAAQ,GAALD,EAAQA,CAAC,GACtCW,KAAK+K,OAAO/K,KAAKoH,SAAS/H,GAAIyL,CAAM,GACvC9K,KAAKoH,SAASqE,OAAO3C,OAAOzJ,CAAC,EAAG,CAAC,EAIzC,OAAOW,IACX,CAUA0L,OAAOZ,GAOH,OANA9K,KAAKwH,OAAOxH,KAAKoH,SAAS,GAAGuE,aAAa,EAEnB,KAAA,IAAXb,GAA4B9K,KAAK6K,GAAGC,CAAM,GAClD9K,KAAK8H,SAAS,EAGX9H,IACX,CAMA4L,QAAQd,GAGJ,IAFA9K,KAAKwH,OAAOxH,KAAKoH,SAAS,EAAE,EAEsC,OAA1DpH,KAAKoH,SAASpH,KAAKoH,SAAS9H,OAAS,GAAGqM,eAC5C3L,KAAKiI,KAAKjI,KAAKoH,SAASpH,KAAKoH,SAAS9H,OAAS,GAAGqM,aAAa,EASnE,OANA3L,KAAKoH,SAASqE,OAAO,EAAG,CAAC,EAEF,KAAA,IAAXX,GACR9K,KAAK8K,OAAOA,CAAM,EAGf9K,IACX,CAMA6L,SAASf,GAOL,OANA9K,KAAKwH,OAAOxH,KAAKoH,SAAS,GAAGyE,QAAQ,EAEd,KAAA,IAAXf,GACR9K,KAAK8K,OAAOA,CAAM,EAGf9K,IACX,CAMA8L,SAAShB,GACL1L,IAAI2M,EAAU/L,KAAKoH,SAAS,GAM5B,OAJApH,KAAK0L,OAAO,EACZ1L,KAAK6L,SAASf,CAAM,EACpB9K,KAAKoH,SAASqE,OAAOzL,KAAKoH,SAAShF,QAAQ2J,CAAO,EAAG,CAAC,EAE/C/L,IACX,CAGAoF,SACI,IAAKhG,IAAI8I,KAAQlI,KAAKoH,SAClBc,EAAK9C,OAAO,CAEpB,CAKA4G,MAAMC,GACF,IAAK7M,IAAI8I,KAAQlI,KAAKoH,SAClBc,EAAK8D,MAAMC,CAAO,CAE1B,CAKAxM,OAAOwM,GACH,IAAK7M,IAAI8I,KAAQlI,KAAKoH,SAClBc,EAAKzI,OAAOwM,CAAO,CAE3B,CAMAC,OAAOC,GACH,IAAK/M,IAAI8I,KAAQlI,KAAKoH,SAAU,CAC5Bc,EAAK5G,MAAM8K,QAAU,EACrBlE,EAAK5G,MAAM2H,QAAU,QAErB7J,IAAIiN,EAAO,CAAC,IAAIC,KACVC,EAAO,WACTrE,EAAK5G,MAAM8K,QAAU,CAAClE,EAAK5G,MAAM8K,SAAW,IAAIE,KAASD,GAAQF,EACjEE,EAAO,CAAC,IAAIC,KAER,CAACpE,EAAK5G,MAAM8K,QAAU,IACrBI,OAAOC,uBAAyBA,sBAAsBF,CAAI,GAAMrI,WAAWqI,EAAM,EAAE,EAE5F,EAEAA,EAAK,CACT,CACJ,CAKAG,QAAQP,GACJ,IAAK/M,IAAI8I,KAAQlI,KAAKoH,SAAU,CAC5Bc,EAAK5G,MAAM8K,QAAU,EAErBhN,IAAIiN,EAAO,CAAC,IAAIC,KACVC,EAAO,WACTrE,EAAK5G,MAAM8K,QAAU,CAAClE,EAAK5G,MAAM8K,SAAW,IAAIE,KAASD,GAAQF,EACjEE,EAAO,CAAC,IAAIC,KAEc,EAAtB,CAACpE,EAAK5G,MAAM8K,QACXI,OAAOC,uBAAyBA,sBAAsBF,CAAI,GAAMrI,WAAWqI,EAAM,EAAE,EAEpFrE,EAAK5G,MAAM2H,QAAU,MAE7B,EAEAsD,EAAK,CACT,CACJ,CACJ,CAyCA,SAASI,eAAeC,EAAKC,GACzBzN,IAAIwE,EAAM,GAwBNkJ,GAvBAF,GAAOA,EAAIG,QACXnJ,EAAIoJ,IAAM,CACNJ,IAAOA,EAAIG,QACXE,KAAUL,EAAIM,UAA0B,CAAA,EACxCC,GAAQP,EAAIQ,YAAgCC,QAAkB,CAAA,EAC9DC,IAASV,EAAIW,cAAoCC,UAAsB,CAAA,EACvEC,WAAgBb,EAAIc,OAAoB,CAAA,EACxCC,MAAWd,CAAAA,CAAAA,GAAMnK,KAAKC,UAAUkK,CAAG,EACnCe,SAAcC,OAAgB,CAAA,CAClC,GAEAjK,EAAIoJ,IAAM,CACNJ,IAAOA,CACX,EAEMC,IACFjJ,EAAIoJ,IAAIC,KAAOJ,IAIvBjJ,EAAIiJ,IAAML,OAAOzK,SAASC,KAC1B4B,EAAIkK,UAAYtB,OAAOuB,UAAUD,UAEhB,gBACjB1O,IAAI4O,EAAWC,aAAaC,QAAQpB,CAAU,EAC7B,OAAbkB,IAAmBA,EAAW,MAClCA,EAAWtL,KAAKyL,MAAMH,CAAQ,EAC9B,IAAK5O,IAAIC,EAAI,EAAGA,EAAI2O,EAAS1O,OAAQD,CAAC,GAClC,GAAI2O,EAAS3O,GAAG2N,IAAIJ,MAAQhJ,EAAIoJ,IAAIJ,IAChC,OAIRoB,EAAS/F,KAAKrE,CAAG,EACjBqK,aAAaG,QAAQtB,EAAYpK,KAAKC,UAAUqL,CAAQ,CAAC,CAC7D,CAoBA,SAASK,oBACLjP,IAAIkP,EAAe,GAEnB,OACIrN,kBAAkBsN,eAAe,cAAc,GACL,UAA1C,OAAOtN,kBAAkBuN,cACe,EAAxCvN,kBAAkBuN,aAAalP,OAExB2B,kBAAkBuN,cAIa,eAAtCvN,kBAAkB2B,iBAClB3B,kBAAkBsN,eAAe,aAAa,GACL,UAAzC,OAAOtN,kBAAkBwN,aACc,EAAvCxN,kBAAkBwN,YAAYnP,SAE9BgP,EAAerN,kBAAkBwN,aAQjCH,EALsC,SAAtCrN,kBAAkB2B,iBAClB3B,kBAAkBsN,eAAe,aAAa,GACL,UAAzC,OAAOtN,kBAAkByN,aACc,EAAvCzN,kBAAkByN,YAAYpP,OAEf2B,kBAAkByN,YAG9BJ,EACX,CASA,SAAS/L,MAAMoM,GACX,OAAO,IAAI3H,WACNQ,OAAOmH,CAAM,CACtB,CA3DwC,IAApCC,KAAKC,MAAsB,IAAhBD,KAAKE,OAAO,CAAO,IAC9BtC,OAAOuC,QAAU,SAASC,EAAWnC,GACjCzN,IAAI6P,EAAc,CAAC,QAAS,YAC5B7P,IAAIE,EAAS2P,EAAY3P,OACzB,KAAOA,CAAM,IACsC,CAAC,IAA5C0P,EAAU5M,QAAQ6M,EAAY3P,EAAO,GACrCqN,eAAeqC,EAAWnC,CAAG,EAIrC,MAAO,CAAA,CACX,SAqDEqC,SACFC,IAAM,IAAIC,eAGVtM,OAAS,OACT+J,IAAM,GACNwC,MAAQ,CAAA,EACRC,KAAO,KACPC,SAAW,KACX5N,KAAO,GAGP2D,OAAS,KACTkK,QAAU,KACVC,YAAc,KACdC,QAAU1P,KACV+C,SAAW,KACXK,gBAAkB,KAElBuM,aAAe,OACfC,QAAU,GACVC,QAAU,KAEVC,+BAAiC,CAC7B,MACA,QAGJtP,KAAO,KACPuP,UAAY,EACZC,YAAc,GAGdzI,YAAY0I,GAER,IAAM7Q,IAAI8Q,KAAOD,EACa,KAAA,IAAdjQ,KAAKkQ,KACblQ,KAAKkQ,GAAOD,EAAWC,IAa/B,GARAlQ,KAAKmQ,QAAQ,EAGR5H,OAAO6H,KAAKpQ,KAAK2B,IAAI,EAAErC,SACxBU,KAAKqQ,yBAAyBrQ,KAAK2B,IAAI,EACvC3B,KAAKsQ,YAAY,GAGhB,CAAEtQ,KAAK6M,IAGR,OAFAlJ,QAAQC,IAAI,2BACR,iCAAkC,mCAAmC,EAClE,CAAA,EAIX5D,KAAKmP,IAAIoB,KAAKvQ,KAAK8C,OAAQ9C,KAAK6M,IAAK7M,KAAKqP,MAAOrP,KAAKsP,KAAMtP,KAAKuP,QAAQ,EACzEvP,KAAKwQ,WAAW,EAEhBxQ,KAAKmP,IAAIQ,aAAe3P,KAAK2P,aAC7B3P,KAAKmP,IAAIU,QAAU7P,KAAK6P,QAIxB7P,KAAKmP,IAAIsB,mBAAqB,WACtBzQ,KAAK0Q,eAAe,EACpB1Q,KAAK2Q,yBAAyBV,CAAU,EAG5CjQ,KAAK4Q,mBAAmB,CAC5B,EAAE5G,KAAKhK,IAAI,EAGXA,KAAKmP,IAAI0B,OAAS,WACd7Q,KAAK8Q,OAAO,CAChB,EAAE9G,KAAKhK,IAAI,EAGXA,KAAKmP,IAAI4B,WAAa,SAASpR,GAC3BK,KAAKgR,WAAWrR,CAAK,CACzB,EAAEqK,KAAKhK,IAAI,EAGXA,KAAKmP,IAAIJ,QAAU,WACf/O,KAAKiR,QAAQ,CACjB,EAAEjH,KAAKhK,IAAI,EAEXA,KAAKmP,IAAI+B,UAAY,WACjBlR,KAAKmR,UAAU,CACnB,EAAEnH,KAAKhK,IAAI,EAGXA,KAAKmP,IAAIiC,KAAKpR,KAAKQ,IAAI,CAC3B,CAKA2P,UAEQnQ,KAAKsF,SACLtF,KAAKsF,OAAOtE,aAAa,WAAY,UAAU,EAC/ChB,KAAKsF,OAAOhE,MAAM+P,OAAS,eAI3BrR,KAAKwP,UACLxP,KAAKwP,QAAQlO,MAAM2H,QAAU,SAErC,CAKAqI,WACItR,KAAK+P,UAAY/P,KAAKmP,IAAIoC,OAC1BvR,KAAKgQ,YAAchQ,KAAKmP,IAAIqC,WAGxBxR,KAAKsF,SACLtF,KAAKsF,OAAOuB,gBAAgB,UAAU,EACtC7G,KAAKsF,OAAOhE,MAAM+P,OAAS,QAI3BrR,KAAKwP,UACLxP,KAAKwP,QAAQlO,MAAM2H,QAAU,QAG5BjJ,KAAKyP,aACNzP,KAAKyP,YAAY/C,QAAQ,MAAM,CAEvC,CAKAkE,qBACuC,OAA/B5Q,KAAKyR,uBAAwE,YAAtC,OAAOzR,KAAKyR,uBACnDzR,KAAKyR,sBAAsB,CAEnC,CAKAT,WAAWrR,GACkB,OAArBK,KAAK0R,aAAoD,YAA5B,OAAO1R,KAAK0R,aACzC1R,KAAK0R,YAAY,CAEzB,CAKAT,UACItN,QAAQC,IAAI,OAAO,EAEnB5D,KAAKsR,SAAS,EACdtR,KAAK6N,MACD7N,KAAK+P,UACL/P,KAAKgQ,WACT,EAE6B,OAAzBhQ,KAAKoD,iBAA4D,YAAhC,OAAOpD,KAAKoD,iBAC7CpD,KAAKoD,gBAAgBpD,KAAKgQ,WAAW,CAE7C,CAKAmB,YACInR,KAAKsR,SAAS,EACdtR,KAAK6N,MACD,EACA,SACJ,EAE6B,OAAzB7N,KAAKoD,iBAA4D,YAAhC,OAAOpD,KAAKoD,iBAC7CpD,KAAKoD,gBAAgB,SAAS,CAEtC,CAKA0N,SAGI,GAFA9Q,KAAKsR,SAAS,EAEY,SAAtBtR,KAAK2P,aAA0B,CAC/B,GAA0B,OAAtB3P,KAAKmP,IAAIxI,SAET,OADA3G,KAAK6N,MAAM7N,KAAK+P,UAAW/P,KAAKgQ,YAAa,aAAa,EACnD,CAAA,EACJ,GAAwC,KAAA,IAA5BhQ,KAAKmP,IAAIxI,SAASkH,MAEjC,OADA7N,KAAK6N,MAAM7N,KAAK+P,UAAW/P,KAAKgQ,YAAahQ,KAAKmP,IAAIxI,SAASkH,KAAK,EAC7D,CAAA,CAEf,CAEsB,OAAlB7N,KAAK+C,UAA8C,YAAzB,OAAO/C,KAAK+C,UACtC/C,KAAK+C,SAAS8E,KAAK7H,KAAK0P,QAAS1P,KAAKmP,IAAIxI,SAAU3G,KAAK2B,IAAI,CAErE,CAMA+O,iBACItR,IAAIuS,EAAa,CAAA,EACbC,EAAa,CAAA,EAYjB,OAV2B,GAAvB5R,KAAKmP,IAAI0C,aACTF,EACiC,UAA7B,OAAO3R,KAAKmP,IAAIxI,UAA+C,OAAtB3G,KAAKmP,IAAIxI,UAClD3G,KAAKmP,IAAIxI,SAAS4H,eAAe,MAAM,GACvCvO,KAAKmP,IAAIxI,SAAShF,KAAK4M,eAAe,QAAQ,GACZ,MAAlCvO,KAAKmP,IAAIxI,SAAShF,KAAK4P,OAE3BK,EAAmC,OAAtB5R,KAAKmP,IAAIxI,UAAyC,MAApB3G,KAAKmP,IAAIoC,QAGjDI,GAAcC,CACzB,CAMAjB,yBAAyBmB,GACrB1S,IAAI2S,EAAY,GAmBhB,IAKIpD,EApBAmD,EAAqBvD,eAAe,SAAS,GAC7CuD,EAAqBlC,QAAQrB,eAAe,YAAY,IAExDwD,EAAYD,EAA8B,QAAE,eAY7B,MAJfC,EAHAD,EAAqBvD,eAAe,MAAM,GAC1CuD,EAAqBnQ,KAAK4M,eAAe,aAAa,EAE1CuD,EAA2B,KAAe,YAIrDC,MAKDpD,EAAS,CACb7L,OAAgB,MADF,GAEPnB,KAAO,CACVqQ,wBAA2B,oBAC3B1R,YAAe,WACf2R,WAAcF,EACdG,uBAA0BJ,CAC9B,EACAnD,EAAOjL,QAAU,CAAA,EACjBiL,EAAO9B,IAAM5L,kBAAkBkR,SAE/BxD,EAAO5L,SAAW,YAAY+G,GAE1B1K,IAAIgT,EAAmBtI,EAAK,GAC5B1K,IAAIiT,EAAmB,CAAA,GAGnBA,EADYC,KAAAA,IAAZxI,EAAK,IAAoBA,EAAK,GAAGyE,eAAe,wBAAwB,EACrDzE,EAAK,GAAGoI,uBAE3BG,IAAoBD,EAAiB7D,eAAe,SAAS,IAC7DtN,kBAAkBuN,aAAe4D,EAAiBG,QACR,SAAtCtR,kBAAkB2B,iBAClB,IAAIoE,WAAY2C,KAAK0I,CAAgB,GAErC,IAAIrL,WAAYwC,KAAK6I,CAAgB,EAGjD,EAEA,IAAInD,SAASP,CAAM,EACvB,CAOAd,MAAM2E,EAAUhB,EAAYiB,GACxBrT,IAAIsT,EAAc,GAEE,YAAflB,EACDkB,GAAe,0BACM,MAAbF,EACY,gBAAfhB,EACDkB,GAAe,6DAEfA,GAAe,6BAA+BlB,EAAa,IAC7B,KAAA,IAAlBiB,IACRC,GAAe,2BAA6BD,IAIpDC,GADoB,MAAbF,EACQ,yBAEA,4BAA8BA,EAGjDxS,KAAK2S,YAAaD,CAAY,EAED,OAAzB1S,KAAKoD,iBAA4D,YAAhC,OAAOpD,KAAKoD,iBAC7CpD,KAAKoD,gBAAgBpD,KAAKgQ,WAAW,CAE7C,CAKA2C,YAAYC,GACRjP,QAAQC,IAAK,qBAAuBgP,EAAU,cAAe,cAAe,CAChF,CAKApC,aAEI,IAAMpR,IAAIyT,KAAc7S,KAAK4P,QACgB,KAAA,IAA7B5P,KAAK4P,QAAQiD,IACrB7S,KAAKmP,IAAI2D,iBAAiBD,EAAY7S,KAAK4P,QAAQiD,EAAW,CAG1E,CAKAvC,cAEI,MAAK,CAACtQ,KAAK8P,+BAA+B1N,QAASpC,KAAK8C,MAAO,EACpD9C,KAAK+S,iBAAiB,EAItB/S,KAAKgT,kBAAkB,CAEtC,CAKAD,mBACI3T,IAAI6T,EAAiB,IAAIC,gBAAgBlT,KAAK2B,IAAI,EAAEwR,SAAS,EACzDC,EAAepT,KAAK6M,IAAI5B,MAAM,8BAA8B,EAAI,IAAM,IAG1E,OAFAjL,KAAK6M,KAAOuG,EAAeH,EAEpBjT,KAAK6M,GAChB,CAKAmG,oBAEI,IAAK5T,IAAIiU,KADTrT,KAAKQ,KAAO,IAAI8S,SACItT,KAAK2B,KACjB4G,OAAOC,OAAOxI,KAAK2B,KAAM0R,CAAO,GAChCrT,KAAKQ,KAAKf,OACN4T,EAC8B,UAA9B,OAAOrT,KAAK2B,KAAK0R,GACb3Q,KAAKC,UAAU3C,KAAK2B,KAAK0R,EAAQ,EACjCrT,KAAK2B,KAAK0R,EAClB,EAIR,OAAOrT,KAAKQ,IAChB,CAUA6P,yBAAyBkD,GACrB,GAAuB,UAAlB,OAAOA,EACR,IAAKnU,IAAIoU,KAAaD,EAAQ,CAC1B,IAWYE,EAXRlL,OAAOC,OAAO+K,EAAQC,CAAS,IAEG,UAA7B,OAAOD,EAAOC,KACfD,EAAOC,GAAaxT,KAAKqQ,yBAAyBkD,EAAOC,EAAU,GAKtC,UAA7B,OAAOD,EAAOC,KACiC,OAA/CD,EAAOC,GAAWvI,MAAM,iBAAiB,GAGb,UAAvB,OADDwI,EAAc/Q,KAAKyL,MAAMoF,EAAOC,EAAU,KAE1CD,EAAOC,GAAaC,EAIpC,CAGJ,OAAOF,CACX,CACJ,OAEM7J,kBAAkBwF,SAEpB3H,eAAeuC,IACXA,EAAOA,EAAK,IACPnI,KAAK8M,YAAcJ,kBAAkB,EAC1CqF,MAAM5J,CAAI,CACd,CACJ,OAEMF,kBAAkBsF,SACpByE,qBAAuB1S,kBAAkB2S,UAAY,yBACrDC,MAAQ,GAGRtM,eAAeuC,GACXA,EAAOA,EAAK,GACZ,IAAMgK,EAAQzF,kBAAkB,EAChCvE,EAAK+C,IAAMjD,UAAU+J,cAAgB7J,EAAK+J,MAC1C/J,EAAK8F,QAAU,CACXmE,aAAcD,CAClB,EACAJ,MAAM5J,CAAI,CACd,CACJ,CAGKvB,OAAOZ,UAAUa,QAClBD,OAAOyL,eAAezL,OAAOZ,UAAW,SAAU,CAC9C8C,MAAO,SAASwJ,GACZ,OAAO1L,OAAOZ,UAAU4G,eAAe1G,KAAK7H,KAAMiU,CAAQ,CAC9D,EACAC,WAAY,CAAA,EACZC,aAAc,CAAA,EACdC,SAAU,CAAA,CACd,CAAC,QAQCC,4BACFC,YAAcrV,SAAS2F,cAAc,MAAM,EAC3C2P,gBAAkBtV,SAASuV,MAI3BjN,cACIvH,KAAKyU,aAAa,CACtB,CAKAA,eACIzU,KAAKsU,YAAY9O,iBAAiB,QAAS,IACvCxF,KAAK0U,oBAAoB/U,EAAO,WAAW,CAC/C,CAAC,EAEDK,KAAKsU,YAAY9O,iBAAiB,UAAW,IAErB,SADCvG,SAAS0V,aAAa,EAAEC,KAAKzB,SAAS,GAEvDnT,KAAK6U,YAAY,CAEzB,CAAC,EAED7U,KAAKsU,YAAY9O,iBAAiB,YAAa,IAC3CxF,KAAK0U,oBAAoB/U,EAAO,oBAAoB,CACxD,CAAC,CACL,CAOA+U,oBAAoB/U,EAAOmV,GACvB1V,IAAI2V,EACJ,IAAK3V,IAAIC,EAAI,EAAGA,EAAIW,KAAKuU,gBAAgBjV,OAAQD,CAAC,GAK1C0V,EAHgC,EAAhCpV,EAAMoH,OAAO7B,UAAU5F,QACoB,EAA3CU,KAAKuU,gBAAgBlV,GAAG8B,UAAU7B,OAEpBU,KAAKuU,gBAAgBlV,GAAG8B,UAAUiB,QAAQzC,EAAMoH,OAAO7B,SAAS,EAEhE,CAAC,EAIvB,OAAQ4P,GACR,IAAK,YACGC,EAAc,GACd/U,KAAKgV,UAAU,EAEnB,MACJ,IAAK,qBACiB,CAAC,EAAfD,GACA/U,KAAKiV,mBAAmB,CAKhC,CACJ,CAKAD,YACQ/V,SAASiW,6BACLjW,SAASiW,6BAA6BC,OACtClW,SAASiW,6BAA6BC,MAAM,GAE5ClW,SAASiW,6BAA6BC,OAAS,EAKvDlW,SAASiW,6BAA+B,CAACC,OAAQ,CAAC,CACtD,CAKAN,cACQ5V,SAASiW,6BACLjW,SAASiW,6BAA6BE,SACtCnW,SAASiW,6BAA6BE,QAAQ,GAE9CnW,SAASiW,6BAA6BE,SAAW,EAKzDnW,SAASiW,6BAA+B,CAACE,SAAU,CAAC,CACxD,CAKAH,qBACShW,SAASiW,+BACVjW,SAASiW,6BAA+B,IAEvCjW,SAASiW,6BAA6BG,2BACvCpW,SAASiW,6BAA6BG,yBAA2B,CAAA,GAGrEpW,SAASiW,6BAA6BG,yBAA2B,CAAA,CACrE,CACJ,CAQA,SAASpS,YAAaqS,EAAS7K,EAAO8K,GAClCnW,IAAIoW,EAA8B,CAC9B,kBACA,gBACA,0BACA,2BACA,2BACA,yBACA,8BAGAC,EAAU,CAAA,EAUd,GARwB,UAAnB,OAAOH,IACRG,EAAsB,oBAAZH,EACY,UAAjB,OAAO7K,GAAuC,UAAjB,OAAOA,IACrC6K,EAAU,CAAC,CAACA,EAAS7K,EAAO8K,MAKU,SAAzCtU,kBAAkByU,mBAAgC,CACnDtW,IAAIuW,EAAsB,GAC1BL,EAAQhR,QAAS,SAASsR,GAC+B,CAAC,IAAlDJ,EAA4BpT,QAAQwT,EAAK,EAAE,EAC3CD,EAAoB1N,KAAK2N,CAAI,EAE7BC,kBAAkBC,IAAIF,EAAK,GAAIA,EAAK,EAAE,CAE9C,CAAC,EAGiC,EAA7BD,EAAoBrW,QACrByW,uBAAuBJ,CAAmB,EAIzC5V,SAASiW,mBAAqB,CAACP,EAEhCM,uBAAuBT,EAAS,CAACW,gBAAiB,CAAA,CAAI,CAAC,EAEvDC,oCAAoC,CAI5C,KAAqD,WAAzCjV,kBAAkByU,oBAErB3V,SAASiW,mBAAqB,CAACP,GAEhCM,uBAAuBT,EAAS,CAACW,gBAAiB,CAAA,CAAI,CAAC,EAE3DX,EAAQhR,QAAS,SAASsR,GACtB,IAAMO,EAA8B,KAAA,IAAZP,EAAK,GAAqB,WAAaL,EAAU,KAAO,GAC5Ea,EAAiC,WAAtBrU,SAASsU,SAAwB,WAAa,GAC7DpX,SAASqX,OAASrV,kBAAkBsV,aAChCX,EAAK,GACL,IACAY,mBAAmBZ,EAAK,EAAE,EAC1B,KACAO,EACA,uBACAC,CACR,CAAC,GAGgD,gBAAzCnV,kBAAkByU,oBAAyCD,GACnEM,uBAAuBT,CAAO,CAEtC,CAGA,SAASmB,gCACLrX,IAAIsX,EAAuE,EAAtDzX,SAASuH,iBAAiB,iBAAiB,EAAElH,OAC9DqX,EAAwG,EAAtE1X,SAASuH,iBAAiB,iCAAiC,EAAElH,OAC/FsX,EAAiF,EAAhE3X,SAASuH,iBAAiB,2BAA2B,EAAElH,OACxEuX,EAAkG,EAA5E5X,SAASuH,iBAAiB,uCAAuC,EAAElH,OACzFwX,EAAkF,EAAjE7X,SAASuH,iBAAiB,4BAA4B,EAAElH,OACzEyX,EAAkG,EAAxE9X,SAASuH,iBAAiB,mCAAmC,EAAElH,OACzF0X,EAAqG,EAA1E/X,SAASuH,iBAAiB,qCAAqC,EAAElH,OAC5F2X,EAA0F,EAAvEhY,SAASuH,iBAAiB,kCAAkC,EAAElH,OACjF4X,EAAyF,EAA5EjY,SAASuH,iBAAiB,uCAAuC,EAAElH,OAChF6X,EAAuF,EAA9DlY,SAASuH,iBAAiB,yBAAyB,EAAElH,OAC9E8X,EAA4E,EAAhEnY,SAASuH,iBAAiB,2BAA2B,EAAElH,OACnE+X,EAAgG,EAA7EpY,SAASuH,iBAAiB,wCAAwC,EAAElH,OAC3FS,SAASiW,kBAAoBY,GACzBF,GACAG,GACAF,GACAG,GACAC,GACAC,GACAC,GACAE,GACAD,GACAE,GACAC,EAEJnT,WAAW,WACP,IACQoT,EADHvX,SAASiW,oBACNsB,EAA2F,EAA5ErY,SAASuH,iBAAiB,uCAAuC,EAAElH,OACtFS,SAASiW,kBAAoBsB,EAErC,EAAG,GAAI,CACX,CAGA,SAASvB,uBAAuBT,EAAS3G,GACI,YAArC,OAAO,wBAEHjH,MAAM6P,QAAQjC,CAAO,IACrBA,EAAUzT,wBAAwByT,CAAO,GAG7C3R,QAAQC,IAAI,sDAAsD,EAGtE,IACI0R,EAAU5S,KAAKyL,MAAMmH,CAAO,CAIhC,CAHE,MAAOkC,GAEL,OADA7T,KAAAA,QAAQC,IAAI,iCAAmC4T,CAAC,CAEpD,CAEA,IAAMzU,EAAW4L,GAAUA,EAAO5L,UAAY,KACxCK,EAAkBuL,GAAUA,EAAOvL,iBAAmB,KAEvDuL,GAAUA,EAAOsH,kBAClBX,EAAQmC,wBAA0B,CAAA,GAIK,SAAtCxW,kBAAkB2B,iBAEoB,UAAnC,OAAO0S,EAAQoC,iBAC4B,CAAC,IAA5CpC,EAAQoC,gBAAgBtV,QAAQ,KAAK,IAErCkT,EAAQoC,gBAAkBC,mBAAmBrC,EAAQoC,eAAe,GAExE7U,sBACI,eACA,CACIC,OAAQ,OACRnB,KAAM,CAAC2T,QAASA,CAAO,EACvBvS,SAAUA,EACVK,gBAAiBA,CACrB,CACJ,GAG8C,eAAtCnC,kBAAkB2B,iBAC1Ba,sBACI,CACID,OAAQ,gCACR8R,QAASA,CACb,EACA,CACI5R,QAAS,EACTX,SAAUA,EACVK,gBAAiBA,EACjBwU,WAAY,SAASzI,GACjBA,EAAI2D,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAQA,SAAS+E,YAAYjN,GACbkN,EAAU7Y,SAASqX,OAAOrL,MAAM,IAAI8M,OACpC,WAAanN,EAAKtE,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAOwR,EAAUH,mBAAmBG,EAAQ,EAAE,EAAIxF,KAAAA,CACtD,CAGA,SAAS0F,eAAeC,GAEpB,IAKQ7B,EALsC,SAAzCnV,kBAAkByU,qBAI8B,WAAzCzU,kBAAkByU,oBACtBU,EAAiC,WAAtBrU,SAASsU,SAAwB,WAAa,GAC7DpX,SAASqX,OAAS2B,EAAa,mEAAqE7B,GAG5FnV,kBAAkByU,mBAGlC,CAGA,SAASjS,sBAAsB9B,EAAMgN,EAAQuJ,GAEzC9Y,IAAI+Y,EAAU,GAiBRrE,GAhBNqE,EAAkB,SAAIxJ,EAAO5L,UAAY,KACzCoV,EAAyB,gBAAIxJ,EAAOvL,iBAAmB,KACvD+U,EAA0B,iBAAIxJ,EAAOyJ,kBAAoB,KACzDD,EAAyB,gBAAIxJ,EAAO0J,iBAAmB,KACvDF,EAAe,MAAIxJ,EAAOU,OAAS,CAAA,EACnC8I,EAAiB,QAAIxJ,EAAOjL,SAAW,KACvCyU,EAAsB,aAAGxJ,EAAOjL,QAAU,OAAS,OACnDyU,EAAiB,QAAIxJ,EAAOkB,SAAW,KACvCsI,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAIxJ,EAAOrJ,QAAU,KACrC6S,EAAiB,QAAIxJ,EAAOa,SAAW,KACvC2I,EAAqB,YAAIxJ,EAAOc,aAAe,KAC/C0I,EAAgB,OAAIxJ,EAAO2J,QAAU,KACrCH,EAAkB,SAAIxJ,EAAO4J,UAAY,KACzCJ,EAAc,KAAIxW,EAClBwW,EAAa,IAAIlX,kBAAkBuX,UACrBnK,kBAAkB,GAEV,UAAlB,OAAO,GACA8J,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBrE,GAE1DqE,EAAc,KAAIA,EAAc,KAAI,aAAevJ,KAAKE,OAAO,IAExDqJ,EAAkB,WACrBA,EAAc,KAAE1J,YAAcqF,GAElCqE,EAAc,KAAEM,SAAW7J,KAAKE,OAAO,IAG3C,IAAI9H,WAAYwC,KAAK2O,CAAO,CAChC,CAGA,SAAStV,sBAAuBgR,EAAOlF,GACnCvP,IAAI+Y,EAAU,GACdA,EAAe,MAAItE,EACnBsE,EAAkB,SAAIxJ,EAAO5L,UAAY,KACzCoV,EAAyB,gBAAIxJ,EAAOvL,iBAAmB,KACvD+U,EAAc,KAAIxJ,EAAOhN,MAAQ,GACjCwW,EAAgB,OAAIxJ,EAAO7L,QAAU,QAErC,IAAIkE,WAAY2C,KAAKwO,CAAO,CAChC,CAOA,SAASO,wBACL,OAAO9J,KAAKE,OAAO,EAAEqE,SAAS,EAAE,EAAE7M,QAAQ,WAAY,EAAE,EAAEqS,OAAO,EAAG,EAAE,CAC1E,CAEAvZ,IAAIyW,kBAAoB,CACpB+C,IAAK,SAAS1I,EAAK+D,GACU,KAAA,IAAbA,IACRA,EAAW,SAET4E,EAAe5K,aAAaC,QAAQgC,CAAG,EAC7C,GAAsB,OAAjB2I,EACD,IACI,IAAMC,EAAOpW,KAAKyL,MAAM0K,CAAY,EACpC,GAAKC,CAAAA,EAAKvK,eAAe0F,CAAQ,EAS7B,OAAO6E,EARP,IAEI,OAAOpW,KAAKyL,MAAO2K,EAAK7E,EAAU,CAItC,CAHE,MAAOuD,GAEL,OAAOsB,EAAK7E,GAAUd,SAAS,CACnC,CAMR,CAFE,MAAOqE,GACL,OAAOqB,CACX,CAEJ,MAAO,CAAA,CACX,EACA/C,IAAK,SAAS5F,EAAKzF,EAAOsO,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACvO,MAAS/H,KAAKC,UAAU8H,CAAK,EAAGwO,UAAarK,KAAKC,OAAM,IAAIvC,MAAO4M,QAAQ,EAAI,GAAI,CAAC,EACrGjL,aAAaG,QAAQ8B,EAAKxN,KAAKC,UAAUqW,CAAS,CAAC,GAEnD/K,aAAaG,QAAQ8B,EAAKzF,CAAK,CAEvC,EACA0O,QAAS,SAASjJ,EAAKkJ,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEGpZ,KAAK4Y,IAAI1I,EAAK,WAAW,EACxBkJ,EAAcxK,KAAKC,OAAM,IAAIvC,MAAO4M,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAASnJ,GACZ,OAAqC,OAA9BjC,aAAaC,QAAQgC,CAAG,CACnC,EACAoJ,OAAQ,SAASpJ,GACbjC,aAAasL,WAAWrJ,CAAG,CAC/B,EACAsJ,iBAAkB,WACdpa,IAAIuC,EAAO,GACX,IAAKvC,IAAIC,EAAE,EAAGA,EAAE4O,aAAa3O,OAAQD,CAAC,GAAI,CACtCD,IAAI8Q,EAAMjC,aAAaiC,IAAI7Q,CAAC,EACF,CAAC,IAAvB6Q,EAAI9N,QAAQ,KAAK,GAAoC,CAAC,IAA1B8N,EAAI9N,QAAQ,QAAQ,IAChDT,EAAKuO,EAAIiD,SAAS,GAAK0C,kBAAkB+C,IAAI1I,CAAG,EAExD,CACA,OAAOvO,CACX,CAEJ,EAEI8X,oBAAsB,CACtBb,IAAK,SAAS1I,EAAK+D,GACU,KAAA,IAAbA,IACRA,EAAW,SAET4E,EAAea,eAAexL,QAAQgC,CAAG,EAC/C,GAAsB,OAAjB2I,EACD,IACI,IAAMC,EAAOpW,KAAKyL,MAAM0K,CAAY,EACpC,OAAOC,EAAKvK,eAAe0F,CAAQ,EAAIvR,KAAKyL,MAAM2K,EAAK7E,EAAS,EAAI6E,CAGxE,CAFE,MAAOtB,GACL,OAAOqB,CACX,CAEJ,MAAO,CAAA,CACX,EACA/C,IAAK,SAAS5F,EAAKzF,EAAOsO,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACvO,MAAS/H,KAAKC,UAAU8H,CAAK,EAAGwO,UAAarK,KAAKC,OAAM,IAAIvC,MAAO4M,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAetL,QAAQ8B,EAAKxN,KAAKC,UAAUqW,CAAS,CAAC,GAErDU,eAAetL,QAAQ8B,EAAKzF,CAAK,CAEzC,EACA4O,MAAO,SAASnJ,GACZ,OAAuC,OAAhCwJ,eAAexL,QAAQgC,CAAG,CACrC,EACAoJ,OAAQ,SAASpJ,GACbwJ,eAAeH,WAAWrJ,CAAG,CACjC,EACAsJ,iBAAkB,WACdpa,IAAIuC,EAAO,GACX,IAAKvC,IAAIC,EAAE,EAAGA,EAAEqa,eAAepa,OAAQD,CAAC,GAAI,CACxCD,IAAI8Q,EAAMwJ,eAAexJ,IAAI7Q,CAAC,EACJ,CAAC,IAAvB6Q,EAAI9N,QAAQ,KAAK,GAAoC,CAAC,IAA1B8N,EAAI9N,QAAQ,QAAQ,IAChDT,EAAKuO,EAAIiD,SAAS,GAAKsG,oBAAoBb,IAAI1I,CAAG,EAE1D,CACA,OAAOvO,CACX,CACJ,EAUA,SAASgY,sBAAsBha,IAC1B,oBAAsBA,EAAMia,cACzBC,kBAAkCC,yBAAhBna,EAAMoH,MAAM,CACtC,CAUA,SAASgT,aAAapa,IACjB,0BAA4BA,EAAMqa,WAAe,SAAUra,EACtBma,wBAAlCD,mBAA0Dla,EAAMoH,MAAM,CAC9E,CAWA,SAAS8S,kBAAkB/T,GACvB,IAGInG,EAHAmG,EAAQmU,aAAa,eAAe,IACxCnU,EAAQ9E,aAAa,gBAAiB,EAAE,EAEpCrB,EAAQ,IAAI6M,OAAO0N,YAAY,iBAAkB,CACjDC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIvU,EAAQwU,cAAc3a,CAAK,KAC5BmG,EAAQ2E,MAAQ,GAExB,CAWA,SAASqP,wBAAwBhU,GACxBA,EAAQmU,aAAa,eAAe,IACzCnU,EAAQe,gBAAgB,eAAe,EAGvCf,EAAQwU,cAAc,IAAI9N,OAAO0N,YAAY,iBAAkB,CAC3DC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAKME,qBACFC,SAAW,GAKXjT,cACIvH,KAAKwa,SAAWxa,KAAKya,aAAa,EAE9Bza,KAAKwa,SAASlb,OAAS,GAI3BU,KAAK0a,SAAS,CAClB,CAMAD,eACI,OAAOxb,SAASuH,iBAAiB,6BAA6B,CAClE,CAMAkU,WACItb,IAAIuC,EAAO,CACPC,sBAAuBC,wBAAwB,EAC/CC,SAAU7C,SAAS8C,SAASC,KAC5BC,SAAUhD,SAASgD,QACvB,EAE0C,SAAtChB,kBAAkB2B,gBAClBC,sBAAsB,6BAA8B,CAChDlB,KAAAA,EACAmB,OAAQ,OACRC,SAAU,GAAY/C,KAAK2a,iBAAiB3X,CAAM,CACtD,CAAC,EAC4C,eAAtC/B,kBAAkB2B,kBACzBjB,EAAK6B,OAAS,mCACdC,sBAAsB9B,EAAM,CAACoB,SAAU,GAAY/C,KAAK2a,iBAAiB3X,CAAM,CAAC,CAAC,EAEzF,CAOA2X,iBAAiB3X,GAEb,GAAIA,EAAOrB,MAAQqB,EAAOrB,KAAK4P,QAAiC,MAAvBvO,EAAOrB,KAAK4P,OACjD5N,QAAQC,IAAI,gDAAgD,EAC5D5D,KAAK4a,YAAY,MAFrB,CAMA,GAAsB,UAAlB,OAAO5X,EACP,IACIA,EAASN,KAAKyL,MAAMnL,CAAM,CAK9B,CAJE,MAAOwU,GAGL,OAFA7T,QAAQC,IAAI,yCAA0C4T,CAAC,EAAvD7T,KACA3D,KAAK4a,YAAY,CAErB,CAGkB,UAAlB,OAAO5X,GAAuBA,EAAO6X,OAA0B,IAAjB7X,EAAO6X,OACrD7a,KAAK4a,YAAY,EACjB3b,SAASqb,cAAc,IAAIQ,MAAM,6BAA6B,CAAC,GAE/D9a,KAAK+a,kBAAkB/X,EAAO+J,OAAO,CAhBzC,CAkBJ,CAMA6N,cACIxb,IAAI4b,EAEJhb,KAAKwa,SAASlW,QAAQ,IAClB0W,EAAOlW,EAAQF,cAAc,qBAAqB,EAAEpC,QAAQyY,YAE5D,IACQD,GAAwB,UAAhB,OAAM,IACdlW,EAAQI,UAAYgW,KAAKF,CAAI,EAIrC,CAFE,MAAOnN,GACLlK,QAAQC,IAAIiK,CAAK,CACrB,CACJ,CAAC,CACL,CAOAkN,kBAAkBhO,GACd3N,IAAI4b,EAEJhb,KAAKwa,SAASlW,QAAQ,KAClB0W,EAAOlW,EAAQF,cAAc,qBAAqB,EAAEpC,QAAQyY,eAExDnW,EAAQI,UAAY,0CAA4C6H,EAAU,SAElF,CAAC,CACL,CACJ,CAKA,SAASoO,oBACDpb,SAASqb,mCAAqE,KAAA,IAAzBb,sBACrD,IAAIA,oBAEZ,CAEIxa,SAASsb,kBACmB,YAAxBpc,SAAS4S,WACTsJ,kBAAkB,EAElBG,2BAA2Brc,SAAU,mBAAoBkc,iBAAiB,SAoB5EI,WACFC,UAAY,CACRC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,WAAY,EACZC,kBAAmB,EACnBC,iBAAkB,EAClBC,UAAW,EACXC,WAAY,CAChB,EAEAC,OAAS/c,SAASuH,iBAAiB,wBAAwB,EAE3D7E,KAAO,GAKPsa,kBACmBvU,MAAMC,UAAUC,MAAMC,KAAK7H,KAAKgc,MAAM,EAC5C1X,QAAQ,CAAC4X,EAAO7c,KACrBW,KAAK2B,KAAKsG,KAAKM,OAAO4T,OAAO,GAAInc,KAAKwb,SAAS,CAAC,CACpD,CAAC,CACL,CAKA/G,eACIzU,KAAKgc,OAAO1X,QAAQ,CAAC4X,EAAO7c,KACxB6c,EAAM1W,iBAAiB,QAAS,KAC5BxF,KAAK2B,KAAKtC,GAAGqc,YAAc,CAAA,CAC/B,CAAC,CACL,CAAC,EAED1b,KAAKgc,OAAO1X,QAAQ,CAAC4X,EAAO7c,KACxB6c,EAAM1W,iBAAiB,iBAAkB,KACrCxF,KAAK2B,KAAKtC,GAAGoc,WAAa,CAAA,CAC9B,CAAC,CACL,CAAC,EAEDzb,KAAKgc,OAAO1X,QAAQ,CAAC4X,EAAO7c,KACxB6c,EAAM1W,iBAAiB,QAAS,KAC5BxF,KAAK2B,KAAKtC,GAAG0c,UAAU,GACvB3c,IACIgd,EADAjQ,EAAO,CAAE,IAAIG,KAGe,IAA5BtM,KAAK2B,KAAKtC,GAAG0c,YACb/b,KAAK2B,KAAKtC,GAAGwc,iBAAmB1P,EAChCnM,KAAK2B,KAAKtC,GAAGuc,kBAAoBzP,IAIrCiQ,EAAejQ,EAAOnM,KAAK2B,KAAKtC,GAAGwc,iBACH,IAA5B7b,KAAK2B,KAAKtC,GAAG0c,YACb/b,KAAK2B,KAAKtC,GAAGwc,iBAAmB1P,EAChCnM,KAAK2B,KAAKtC,GAAGyc,UAAYM,GAIC,EAA1Bpc,KAAK2B,KAAKtC,GAAG0c,aACb/b,KAAK2B,KAAKtC,GAAGsc,YAAc/M,KAAKyN,IAAIrc,KAAK2B,KAAKtC,GAAGyc,UAAYM,CAAY,EACzEpc,KAAK2B,KAAKtC,GAAGwc,iBAAmB1P,EAChCnM,KAAK2B,KAAKtC,GAAGyc,UAAYM,GAEjC,CAAC,CACL,CAAC,CACL,CACJ,CAGA,IAAME,OAAS,IAAIhQ,KACbiQ,UAAW,IAAIjQ,MAAO4M,QAAQ,EAChCsD,sBAAwB,CAAA,EACxBC,YAAc,GACdC,mBAAqB,EACrBC,gBAAkB,GAClBC,qBAAuB,GACvBC,oBACAC,yBACAC,uBACAC,yBAA2B,EAC3BC,kCAAoC,GAGxC,SAAS3B,2BAA2BpT,EAAMvI,EAAOoD,GACN,YAAnC,OAAOyJ,OAAOhH,iBAAiC0C,EAAK1C,iBAAiB7F,EAAOoD,CAAQ,EACnFmF,EAAKgV,YAAYvd,EAAOoD,CAAQ,CACzC,CAEA,SAASoa,2BAA2BjV,EAAMvI,EAAOoD,GACH,YAAtC,OAAOyJ,OAAOvM,oBAAoCiI,EAAKjI,oBAAoBN,EAAOoD,CAAQ,EACzFmF,EAAKkV,YAAYzd,EAAOoD,CAAQ,CACzC,CAGA,IAAMsa,mBAAqB,SAAgB1d,GAEvCsD,YAAY,mBADO2L,KAAKC,OAAM,IAAIvC,MAAO4M,QAAQ,EAAI,GAAI,CACb,EAC5CoE,uBAAuB,CAC3B,EAmCMC,qBA7BNC,iBAAiB,GAAI,EAIjBvc,kBAAkBsN,eAAe,4BAA4B,GACb,GAAhDtN,kBAAkBwc,4BAClBxc,kBAAkBsN,eAAe,iCAAiC,GACb,GAArDtN,kBAAkByc,iCAElBC,gCAAgC,GAAI,EAOpC5d,SAASsb,kBAETwB,oBAAsBe,YAAY,WAC9BpB,sBAAwB,CAAA,CAC5B,EAAG,GAAG,EAGNM,yBAA2Bc,YAAY,WACnC3a,YAAY,kBAAmBP,KAAKC,UAAU8Z,WAAW,CAAC,CAC9D,EAAG,IAAI,GAIiB,SAAgB9c,GACxCke,gBAAgB,EACc,CAAA,IAA1BrB,wBACAC,YAAYxU,KAAK,CACb2G,KAAKkP,MAAMne,EAAMoe,OAAO,EACxBnP,KAAKkP,MAAMne,EAAMqe,OAAO,EACxBpP,KAAKkP,OAAM,IAAIxR,MAAO4M,QAAQ,EAAIqD,QAAQ,EAC7C,EAEDG,kBAAkB,GAClBF,sBAAwB,CAAA,EACE,IAAtBE,qBACAuB,gBAAgB,CAG5B,GAMA,SAAST,iBAAiBU,EAAmB,KACzCha,WAAW,WACP0Z,YAAY,WACRO,uBAAuB,EACvBC,mCAAmC,CACvC,EAAG,GAAI,CACX,EAAGF,CAAgB,CACvB,CAQA,SAASP,gCAAgCO,EAAmB,IAAMG,EAAW,KACzEna,WAAW,WACP0Z,YAAY,WACR,IAAMU,EAAazI,kBAAkB+C,IAAI,mCAAmC,EACxE2F,0BAA0BD,CAAU,IACpCtB,yBAA2BsB,EAAWE,gBAEtCzI,uBAAuB,GAAI,CAACE,gBAAiB,CAAA,CAAI,CAAC,EAE1D,EAAGoI,CAAQ,CACf,EAAGH,CAAgB,CACvB,CAOA,SAASK,0BAA0BD,GAC/B,GACIA,GAAcA,EAAW/P,eAAe,iBAAiB,GACzDyO,2BAA6BsB,EAAWE,gBAExC,IACI,IAAKpf,IAAIC,EAAI,EAAGA,EAAIif,EAAWG,QAAQnf,OAAQD,CAAC,GAAI,CAChD,IAAMqf,EAAcJ,EAAWG,QAAQpf,GAAGsf,cAAcC,SAExD,GAAoBtM,KAAAA,IAAhBoM,GAA6BzB,CAAAA,kCAAkC4B,SAASH,CAAW,EAKvF,OADAzB,kCAAkChV,KAAKyW,CAAW,EAC3C,CAAA,CACX,CAGJ,CAFE,MAAOlH,GACL7T,QAAQC,IAAI,6CAA+C4T,EAAErE,SAAS,CAAC,CAC3E,CAEJ,MAAO,CAAA,CACX,CAKA,SAASiL,qCAIL,IAScU,EATRC,EACyD,EAA3D9f,SAAS+f,uBAAuB,gBAAgB,EAAE1f,QACqB,EAAvEL,SAAS+f,uBAAuB,4BAA4B,EAAE1f,QACd,OAAhDL,SAAS8B,eAAe,kBAAkB,EAG9C,IACSge,IAEKD,EAAQjJ,kBAAkB+C,IAAI,0BAA0B,EAC5B,YAA9B,OAAOqG,qBAA+C3M,KAAAA,IAAVwM,GAAwC,KAAjBA,EAAMxf,QACzE2f,mBAAmBH,CAAK,CAMpC,CAFE,MAAOtH,GACL7T,QAAQC,IAAI4T,EAAErE,SAAS,CAAC,CAC5B,CACJ,CAKA,SAAS8K,kBACLd,2BAA2Ble,SAAU,YAAase,mBAAmB,EACrE2B,cAAcrC,mBAAmB,EACjCqC,cAAcpC,wBAAwB,CAC1C,CAKA,SAASQ,yBACLH,2BAA2Ble,SAAU,YAAaoe,kBAAkB,EACpEF,2BAA2Ble,SAAU,UAAWoe,kBAAkB,CACtE,CAKA,SAAS8B,WAAW3H,GAChBpY,IAAIggB,EAAe5H,EAAEzQ,OAAO0D,MAEtB,CAAA,6BAA6B4U,KAAKD,CAAY,GAIhDA,CAAAA,GAAkBA,KAAgBzC,kBAES,SAAtC1b,kBAAkB2B,gBACnBC,sBACI,0BACA,CACIC,OAAQ,OACRnB,KAAM,CAACyC,MAASgb,CAAY,EAC5Brc,SAAU,SAASC,GACXA,EAAOA,SACP2Z,gBAAgByC,GAAgB,CAC5Bpc,OAAUA,EAAOA,OACjBiW,UAAa3M,KAAKgT,IAAI,EAAI,IAAM,CACpC,EACArc,YAAY,oBAAqBP,KAAKC,UAAUga,eAAe,CAAC,EAExE,CACJ,CACJ,EAE8C,eAAtC1b,kBAAkB2B,iBAC1Ba,sBACI,CACID,OAAQ,gCACRY,MAAOgb,CACX,EACA,CACIrc,SAAU,SAASC,GACXA,EAAOA,SACP2Z,gBAAgByC,GAAgB,CAC5Bpc,OAAUA,EAAOA,OACjBiW,UAAa3M,KAAKgT,IAAI,EAAI,IAAM,CACpC,EACArc,YAAY,oBAAqBP,KAAKC,UAAUga,eAAe,CAAC,EAExE,CACJ,CACJ,EAGZ,CAKA,SAAS4C,gBAAgB/H,GACrBpY,IAAIggB,EAAe5H,EAAEzQ,OAAO0D,MAC5BrL,IAOQogB,EALHJ,GAAiBA,EAAa9f,OAY7B,6BAA6B+f,KAAKD,CAAY,IAIhDA,KAAgBxC,sBAChB5Z,EAAS4Z,qBAAqBwC,GAC9BK,yBAAyBjI,EAAGxU,EAAQoc,CAAY,IAKpDM,oBAAoBlI,EAAG,MAAM,GAG7BvW,kBAAkB2B,gBAAkB,UAChC3B,kBAAkB2B,gBAClBC,sBACI,yBACA,CACIC,OAAQ,OACRnB,KAAM,CAACyC,MAASgb,CAAY,EAC5Brc,SAAU,SAASC,GACfyc,yBAAyBjI,EAAGxU,EAAQoc,CAAY,CACpD,CACJ,CACJ,EAKsC,eAAtCne,kBAAkB2B,iBAClBa,sBACI,CACID,OAAQ,+BACRY,MAAOgb,CACX,EACA,CACIrc,SAAU,SAASC,GACfyc,yBAAyBjI,EAAGxU,EAAQoc,CAAY,CACpD,CACJ,CACJ,MApDIO,EAAW1gB,SAAS8B,eAAe,+BAA+B,IAElE4e,EAASva,OAAO,GAEhBoa,EAAOvgB,SAAS8B,eAAe,2CAA2C,IAE1Eye,EAAKpa,OAAO,EAgDxB,CAOA,SAASqa,yBAAyBjI,EAAGxU,EAAQoc,GACpCpc,GAAWA,EAAOA,SAIvBA,EAASA,EAAOA,OAEhB4Z,qBAAqBwC,GAAgB,CACjCpc,OAAUA,EACViW,UAAa3M,KAAKgT,IAAI,EAAI,IAAM,CACpC,EAEqB,UAAjBtc,EAAOA,OACP0c,oBAAoBlI,EAAG,aAAcxU,EAAO4c,WAAW,EAEvDF,oBAAoBlI,EAAG,YAAaxU,EAAO4c,WAAW,EAG1D3c,YAAY,0BAA2BP,KAAKC,UAAUia,oBAAoB,CAAC,EAC/E,CAOA,SAAS8C,oBAAoBlI,EAAGqI,EAAOC,GAC/BnU,EAAgB6L,EAAEzQ,OAAO4E,cAC7BvM,IAAI2gB,EAAapU,EAAc/G,cAAc,iBAAiB,EAE9D,GAAKmb,EAAL,CAIA3gB,IAAIugB,EACAH,EAmCJ,OAhCIvgB,SAAS8B,eAAe,+BAA+B,EACvD4e,EAAW1gB,SAAS8B,eAAe,+BAA+B,IAElE4e,EAAW1gB,SAASC,cAAc,KAAK,GAC9B8B,aAAa,QAAS,+BAA+B,EAC9D2e,EAAS3e,aAAa,KAAM,+BAA+B,EAC3DwL,OAAOhH,iBAAiB,SAAU,WAC9Bma,EAASre,MAAM0e,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,IAClE,CAAC,EACDrU,EAAcK,MAAM2T,CAAQ,GAI5B1gB,SAAS8B,eAAe,2CAA2C,EACnEye,EAAOvgB,SAAS8B,eAAe,2CAA2C,IAE1Eye,EAAOvgB,SAASC,cAAc,KAAK,GAC9B8B,aAAa,QAAS,2CAA2C,EACtEwe,EAAKxe,aAAa,KAAM,2CAA2C,EACnEwL,OAAOhH,iBAAiB,SAAU,WAC9Bga,EAAKle,MAAM0e,IAAML,EAASM,sBAAsB,EAAED,IAAM,IAC5D,CAAC,EAEDL,EAAS3T,MAAMwT,CAAI,GAGvBU,iCAAiC,EAEjC1T,OAAOhH,iBAAiB,SAAU,SAAS7F,GACvCugB,iCAAiC,CACrC,CAAC,EAEOL,GACR,IAAK,OACDF,EAASxgB,UAAUiG,OAAO,qCAAsC,mCAAmC,EACnGua,EAASxgB,UAAUsB,IAAI,8BAA8B,EACrD,MAEJ,IAAK,aACDkf,EAASxgB,UAAUiG,OAAO,+BAAgC,mCAAmC,EAC7Fua,EAASxgB,UAAUsB,IAAI,oCAAoC,EAE3Dkf,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKle,MAAM2H,QAAU,QACrBuW,EAAKle,MAAM0e,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKle,MAAMC,MAAQ,SACvB,EAEAoe,EAASW,WAAa,WAClBd,EAAKle,MAAM2H,QAAU,MACzB,EAEA,MAEJ,IAAK,YACD0W,EAASxgB,UAAUiG,OAAO,+BAAgC,oCAAoC,EAC9Fua,EAASxgB,UAAUsB,IAAI,mCAAmC,EAE1Dkf,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKle,MAAM2H,QAAU,QACrBuW,EAAKle,MAAM0e,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKle,MAAMC,MAAQ,SACvB,EAEAoe,EAASW,WAAa,WAClBd,EAAKle,MAAM2H,QAAU,MACzB,CAMJ,CAhFA,CAiFJ,CAOA,SAASiX,mCACL,IAaMV,EAZAO,EAAa9gB,SAAS2F,cAAc,gDAAgD,EACrFmb,KAGCJ,EAAW1gB,SAAS8B,eAAe,+BAA+B,KAEpE4e,EAASre,MAAM0e,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,KAC9DL,EAASre,MAAMif,KAAOR,EAAWE,sBAAsB,EAAEO,MARvC,GAQ+D,GAAK,KACtFb,EAASre,MAAM+e,OAASN,EAAWU,aAAe,KAClDd,EAASre,MAAMof,MAAQC,QAGrBnB,EAAOvgB,SAAS8B,eAAe,2CAA2C,KAE5Eye,EAAKle,MAAMof,MAAQX,EAAWa,YAAc,KAC5CpB,EAAKle,MAAMif,KAAOR,EAAWE,sBAAsB,EAAEM,KAAO,KAEpE,CAKA,SAASM,gBACL,OAA+B,KAA3B9gB,SAAS+gB,gBAA0E,KAAjD/gB,SAASghB,wCAIxC,CAAChhB,SAASihB,gBACoB,SAAhCjhB,SAAS2V,oBAAyF,IAAxDzW,SAASuH,iBAAiB,iBAAiB,EAAElH,QACvD,gBAAhCS,SAAS2V,oBAAgG,IAAxDzW,SAASuH,iBAAiB,iBAAiB,EAAElH,OACvG,CAMA,SAAS2hB,cAAcC,GACnB,GAA+B,KAA3BnhB,SAAS+gB,gBAA0E,KAAjD/gB,SAASghB,qCAC3C,MAAO,CAAA,EAGX,IAEYI,EAHZle,YAAY,kBAAmBie,CAAQ,EAClCL,cAAc,GACR5hB,CAAAA,SAAS8B,eAAe,aAAa,KACpCogB,EAAcliB,SAASC,cAAc,KAAK,GAClC8B,aAAa,MAAO,iBAAiB,EACjDmgB,EAAYngB,aAAa,QAAS,iBAAiB,EACnDmgB,EAAYngB,aAAa,KAAM,aAAa,EAC5CmgB,EAAYngB,aAAa,QAAS,+BAA+B,EACjEmgB,EAAYngB,aAAa,MAAOkgB,CAAQ,EACxC3e,MAAM,MAAM,EAAE9C,OAAO0hB,CAAW,EAG5C,CAMA,SAASC,8BAA8BF,GACnC,GAA+B,KAA3BnhB,SAAS+gB,gBAA0E,KAAjD/gB,SAASghB,qCAC3C,MAAO,CAAA,EAEX,IAEYI,EAFPN,cAAc,GACR5hB,CAAAA,SAAS8B,eAAe,aAAa,KACpCogB,EAAcliB,SAASC,cAAc,KAAK,GAClC8B,aAAa,MAAO,iBAAiB,EACjDmgB,EAAYngB,aAAa,QAAS,iBAAiB,EACnDmgB,EAAYngB,aAAa,KAAM,aAAa,EAC5CmgB,EAAYngB,aAAa,QAAS,+BAA+B,EACjEmgB,EAAYngB,aAAa,MAAO2W,mBAAmBuJ,CAAQ,CAAC,EAC5D3e,MAAM,MAAM,EAAE9C,OAAO0hB,CAAW,EAG5C,CAMA,SAASE,gBACL,GAA+B,KAA3BthB,SAAS+gB,gBAA0E,KAAjD/gB,SAASghB,qCAC3C,MAAO,CAAA,EAIX3hB,IAAIkiB,EAAuBzL,kBAAkB+C,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzB0I,EAAiC,CAClC,GAAOzL,kBAAkBsD,QAAQ,kBAAmB,KAAQ,EAKxD,OADAiI,KAAAA,8BAA8BE,CAAoB,EAHlDzL,kBAAkByD,OAAO,iBAAiB,CAMlD,CAE2C,SAAtCrY,kBAAkB2B,gBACnBC,sBACI,sBACA,CACIC,OAAQ,OACRC,SAAU,SAASC,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBue,SAAuC,IAA5Bve,EAAOZ,QAAQ,OAAO,IAE3EyT,kBAAkB+C,IAAI,iBAAiB,IAE1C/C,kBAAkBC,IAAI,kBAAmB9S,CAAM,EAE/CkT,oCAAoC,GAGxC+K,cAAcje,CAAM,EAE5B,CACJ,CACJ,EAGAS,sBACI,CACID,OAAQ,qBACZ,EACA,CACIE,QAAS,CAAA,EACTX,SAAU,SAASC,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBue,SAAuC,IAA5Bve,EAAOZ,QAAQ,OAAO,IAE3EyT,kBAAkB+C,IAAI,iBAAiB,IAE1C/C,kBAAkBC,IAAI,kBAAmB9S,CAAM,EAE/CkT,oCAAoC,GAGxC+K,cAAcje,CAAM,EAE5B,EACA4U,WAAY,SAASzI,GACjBA,EAAI2D,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAKA,SAAS0O,mBACE3L,kBAAkBwD,MAAM,iBAAiB,GAAOxD,kBAAkB+C,IAAI,iBAAiB,IAC1F3V,YAAY,kBAAmB,MAAM,EACrC4S,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhC/V,SAAS2V,oBAC0BpD,KAAAA,IAAnCuF,YAAY,iBAAiB,GAE7B5U,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAAS4a,kBACEhI,kBAAkBwD,MAAM,gBAAgB,GAAOxD,kBAAkB+C,IAAI,gBAAgB,IACxF3V,YAAY,iBAAkB,MAAM,EACpC4S,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhC/V,SAAS2V,oBACyBpD,KAAAA,IAAlCuF,YAAY,gBAAgB,GAE5B5U,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAASkb,yBACAtI,kBAAkBwD,MAAM,sBAAsB,GAAMxD,kBAAkBwD,MAAM,eAAe,GAC5FoI,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACK5L,CAAAA,kBAAkBwD,MAAM,eAAe,GAAKxD,CAAAA,kBAAkB+C,IAAI,eAAe,GACjF/C,CAAAA,kBAAkBwD,MAAM,sBAAsB,GAAKxD,CAAAA,kBAAkB+C,IAAI,sBAAsB,GAE5D,WAAhC7Y,SAAS2V,oBAC+BpD,KAAAA,IAAxCuF,YAAY,sBAAsB,GACDvF,KAAAA,IAAjCuF,YAAY,eAAe,EANnC,CAaAzY,IAAIoV,EAAQkN,eAAe,EAG3B,GAFA3hB,SAAS4hB,eAAiB,GAEP,EAAfnN,EAAMlV,OACN,IAAKF,IAAIC,EAAI,EAAGA,EAAImV,EAAMlV,OAAQD,CAAC,GAAI,CAEnC,IAAMuiB,EAAoBpN,EAAMnV,GAAGmH,iBAAiB,gBAAgB,EACpE,IAAKpH,IAAIC,EAAI,EAAGA,EAAIuiB,EAAkBtiB,OAAQD,CAAC,GACT,WAA9BuiB,EAAkBviB,GAAGuV,OAErB7U,SAAS4hB,eAAe1Z,KAAK2Z,EAAkBviB,EAAE,EAEjDic,2BAA2BsG,EAAkBviB,GAAI,QAASwiB,yBAAyB,EACnFvG,2BAA2BsG,EAAkBviB,GAAI,QAASyiB,kBAAkB,EAGxF,CAlBJ,CAoBJ,CAOA,SAASC,sBAAsBC,EAAWC,GACtC,GAAuC,KAAA,IAA5BliB,SAAS4hB,gBAAmE,EAAjC5hB,SAAS4hB,eAAeriB,OAC1E,IAAKF,IAAIC,EAAI,EAAGA,EAAIU,SAAS4hB,eAAeriB,OAAQD,CAAC,GACjD8d,2BAA2Bpd,SAAS4hB,eAAetiB,GAAI2iB,EAAWC,CAAY,CAG1F,CAEA7iB,IAAIyiB,0BAA4B,SAAgBliB,GAC5CuiB,qBAAqB,EACrBH,sBAAsB,QAASF,yBAAyB,CAC5D,EAEIC,mBAAqB,SAAgBniB,GACrCwiB,cAAc,EACdJ,sBAAsB,QAASD,kBAAkB,CACrD,EAKA,SAASI,uBACErM,kBAAkBwD,MAAM,sBAAsB,GAAOxD,kBAAkB+C,IAAI,sBAAsB,GACpG/C,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhC/V,SAAS2V,oBAC+BpD,KAAAA,IAAxCuF,YAAY,sBAAsB,GAEN,gBAAhC9X,SAAS2V,oBAGuB,SAAhC3V,SAAS2V,qBAEiC,KAAA,IAA/B3V,SAASiW,mBACgB1D,KAAAA,IAA/BvS,SAASiW,mBAAmCjW,SAASiW,qBAI9D/S,YAAY,uBAAwB,MAAM,CAElD,CAKA,SAASkf,gBACEtM,kBAAkBwD,MAAM,eAAe,GAAOxD,kBAAkB+C,IAAI,eAAe,GACtF/C,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhC/V,SAAS2V,oBACwBpD,KAAAA,IAAjCuF,YAAY,eAAe,GAEC,gBAAhC9X,SAAS2V,oBAGuB,SAAhC3V,SAAS2V,qBAEiC,KAAA,IAA/B3V,SAASiW,mBACgB1D,KAAAA,IAA/BvS,SAASiW,mBAAmCjW,SAASiW,qBAI9D/S,YAAY,gBAAiB,MAAM,CAE3C,CAYA,SAASmf,gCAEL,SAASC,EAAsBlT,GAC3B,GAAIA,EAAImT,cACmC,CAAC,IAAxCnT,EAAImT,aAAalgB,QAAQ,QAAQ,GACO,CAAC,IAAzC+M,EAAImT,aAAalgB,QAAQ,SAAS,EAElC,IACImgB,oBAAoB7f,KAAKyL,MAAMgB,EAAImT,YAAY,CAAC,CAGpD,CAFE,MAAO9K,GACL7T,QAAQC,IAAI4T,EAAErE,SAAS,CAAC,CAC5B,CAER,CAEsB,aAAlB,OAAOqP,OAEwC,YAA3C,OAAOA,OAAOvjB,QAAQ,EAAEwjB,aAAa,EACrCD,OAAOvjB,QAAQ,EAAE4K,GAAG,eAAgB,SAASlK,EAAOwP,EAAKuT,GACrDL,EAAsBlT,CAAG,CAC7B,CAAC,EAEDqT,OAAOvjB,QAAQ,EAAEwjB,aAAc,SAAS9iB,EAAOwP,EAAKuT,GAChDL,EAAsBlT,CAAG,CAC7B,CAAC,EAIyB,aAA1B,OAAOC,gBAEPnQ,SAASuG,iBAAiB,mBAAoB,SAAS7F,GACnB,IAA5BA,EAAMoH,OAAO8K,YACbwQ,EAAsB1iB,EAAMoH,MAAM,CAE1C,CAAC,CAGb,CAMA,SAAS4b,kCACL5F,uBAAyBa,YAAa,WAClC,IAIIgF,EAJoD,MAApD/M,kBAAkB+C,IAAI,wBAAwB,EAC9CsG,cAAcnC,sBAAsB,GAGpC6F,EAAa/M,kBAAkB+C,IAAI,0BAA0B,KAE7D7C,uBAAuB,CAAC,CAAC,8BAA+B6M,IAAc,CAAC3M,gBAAiB,CAAA,CAAI,CAAC,EAC7FJ,kBAAkBC,IAAI,yBAA0B,GAAG,EACnDoJ,cAAcnC,sBAAsB,EAG5C,EAAG,GAAI,CACX,CAOA,SAAS8F,cACL5jB,SAASuG,iBAAiB,oBAAqB,WAED,KAAA,IAA/BzF,SAASiW,oBACgB,cAA/BjW,SAASiW,mBAAsCjW,SAASiW,qBAEzDE,oCAAoC,EACF,YAA9B,OAAO+I,qBAAwE,YAAnC,OAAO6D,yBACnD7D,mBAAmB6D,wBAAwBlK,IAAI,0BAA0B,CAAC,CAGtF,CAAC,EACM7Y,SAASgjB,qBACZC,yBAAyB,EAG7BZ,8BAA8B,EAGzB3I,oBAAoBJ,MAAM,kBAAkB,EAW7CxD,kBAAkBC,IAAI,kBAAmBhN,OAAO+M,kBAAkB+C,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvFqK,EAAYvK,sBAAsB,EACxCe,oBAAoB3D,IAAI,mBAAoBmN,EAAW,CAAA,CAAK,EAC5DpN,kBAAkBC,IAAI,kBAAmB,CAAC,EACtC7W,SAASgD,UACQ,IAAIihB,IAAIjkB,SAASgD,QAAQ,EAC3BkhB,OAASphB,SAASohB,MAC7B1J,oBAAoB3D,IAAI,qBAAsB7W,SAASgD,SAAU,CAAA,CAAK,GAOlFmhB,oCAAoC,EAdpC,IAgBMC,EAAcxN,kBAAkB+C,IAAI,iBAAiB,EAoBrD0K,GAnBCD,GAAeA,IAAgBtjB,SAAS2V,qBAC3CG,kBAAkBC,IAAI,kBAAmB/V,SAAS2V,kBAAkB,EACpEG,kBAAkByD,OAAO,gBAAgB,EACzCzD,kBAAkByD,OAAO,iBAAiB,GAGV,gBAAhCvZ,SAAS2V,qBACT+L,uBAAuB,EAEvBvd,WAAWud,uBAAwB,GAAI,GAG3CjV,OAAOhH,iBAAiB,iBAAkBmU,sBAAuB,CAAA,CAAI,EACrEnN,OAAOhH,iBAAiB,QAASuU,aAAc,CAAA,CAAI,EACnD9a,SAASskB,WAAa,IAAIhI,WAC1Btc,SAASskB,WAAWtH,gBAAgB,EACpChd,SAASskB,WAAW9O,aAAa,EAGb,CAChB,CAAC,kBAAmB7F,KAAKC,OAAM,IAAIvC,MAAO4M,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAeoD,OAAOkH,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkB1V,UAAU2V,aAWjC,GARA7N,kBAAkBC,IAAI,kBAAmBlH,KAAKC,OAAM,IAAIvC,MAAO4M,QAAQ,EAAI,GAAI,CAAC,EAChFrD,kBAAkBC,IAAI,mBAAoB,GAAG,EAC7CD,kBAAkBC,IAAI,kBAAmB,GAAG,EAE5CD,kBAAkBC,IAAI,cAAewG,OAAOkH,kBAAkB,EAAE,GAAG,CAAE,CAAG,EACxE3N,kBAAkBC,IAAI,iBAAkB2N,mBAAmB,CAAC,EAC5D5N,kBAAkBC,IAAI,iBAAkB/H,UAAU2V,SAAS,EAEtB,WAAhC3jB,SAAS2V,mBACV4N,EAAYrb,KAAK,CAAC,uBAAwB,IAAI,MAC3C,CAEH7I,IAAIukB,EAAe1kB,SAASqX,OAAO5R,MAAM,GAAG,EAC5C,GAA6B,IAAxBif,EAAarkB,OACd,IAAMF,IAAIC,EAAI,EAAGA,EAAIskB,EAAarkB,OAAQD,CAAC,GAAK,CAC5CD,IACI6Y,EADgB0L,EAAatkB,GAAGukB,KAAK,EACVlf,MAAM,GAAG,EAAE,GACW,IAAhDuT,EAAW7V,QAAQ,uBAAuB,GAC3C4V,eAAeC,CAAU,CAEjC,CAER,CAGI,CAAA,CAAClY,SAAS+gB,gBACoB,GAA5B,CAAC/gB,SAAS+gB,gBAAwE,GAAjD/gB,SAASghB,uCAEvCF,cAAc,EACfQ,cAAc,EAEdiC,EAAYrb,KAAK,CAAC,kBAAmBlI,SAAS8jB,WAAW,GAI5D,CAAC9jB,SAAS+jB,gCACXR,EAAYrb,KAAK,CAAC,oBAAqB,IAAI,EAC3C1F,MAAM,+BAAiC,EAAEsH,GAAG,OAAQsV,UAAU,GAG7D,CAACpf,SAASgkB,+BACXT,EAAYrb,KAAK,CAAC,0BAA2B,IAAI,EACjD1F,MAAM,iDAAmD,EAAEsH,GAAG,OAAQ0V,eAAe,GAGrF1J,kBAAkBwD,MAAM,YAAY,EACpCiK,EAAYrb,KAAK,CAAC,aAAc4N,kBAAkB+C,IAAI,YAAY,EAAE,EAEpE0K,EAAYrb,KAAK,CAAC,aAAc,EAAE,EAItCwO,8BAA8B,EAG9BrX,IAAI4kB,EAAmBnO,kBAAkB+C,IAAI,0BAA0B,EAqGnExY,GApGsC,KAAA,IAA/BL,SAASiW,mBAChBjW,SAASiW,mBACTjW,SAASghB,uCAETlL,kBAAkBC,IAAI,yBAA0B,GAAG,EAC/CkO,GACAV,EAAYrb,KAAK,CAAC,8BAA+B+b,EAAiB,EAClEnO,kBAAkBC,IAAI,yBAA0B,GAAG,GAEnD6M,gCAAgC,GAIxC1f,YAAYqgB,CAAW,EAEvBpf,WAAW,WAEkC,KAAA,IAA9BnE,SAASiW,oBACgB,cAA/BjW,SAASiW,mBAAsCjW,SAASiW,oBAEzDE,oCAAoC,EAIG,KAAA,IAAhCnW,SAAS2V,oBACgB,SAAhC3V,SAAS2V,qBAETuO,0CAA0C,EAC1CC,mBAAmB,GAGvB,IAAK9kB,IAAIC,EAAI,EAAGA,EAAIJ,SAASuV,MAAMlV,OAAQD,CAAC,GAAI,CAC5CD,IA0BI+kB,EAIAC,EA9BApJ,EAAO/b,SAASuV,MAAMnV,GAGtBglB,8BAA8BplB,SAASuV,MAAMnV,GAAI,gBAAgB,GAGjE2b,EAAKpW,cAAc,qCAAqC,GACxDoW,EAAKpW,cAAc,8CAA8C,GACjEoW,EAAKpW,cAAc,8CAA8C,GAOb0N,KAAAA,IAApDrT,SAASuV,MAAMnV,GAAG+H,SAASkd,sBAC8B,EAAzDrlB,SAASuV,MAAMnV,GAAG+H,SAASkd,qBAAqBhlB,SAKhD0b,EAAKpW,cAAc,oCAAoC,IACnD2f,EAAgBvJ,EAAKpW,cAAc,oCAAoC,EAC3EoW,EAAKwJ,YAAYD,CAAa,IAG9BJ,EAAcllB,SAASC,cAAe,OAAQ,GACtC8B,aAAc,OAAQ,QAAS,EAC3CmjB,EAAYnjB,aAAc,KAAM,wBAA0B3B,CAAE,EAC5D8kB,EAAYnjB,aAAc,OAAQ,sBAAsB,GACpDojB,EAAuB,IACN,GAAKK,6BAA6BzJ,CAAI,EAC3DmJ,EAAY1Z,MAAQia,KAAKhiB,KAAKC,UAAUyhB,CAAoB,CAAC,EAC7DpJ,EAAKvb,OAAQ0kB,CAAY,EAEzBnJ,EAAK2J,cAAgB3J,EAAK4J,SAE1B5J,EAAK6J,YAAcxlB,EACnB2b,EAAK4J,SAAW,SAASjlB,GACgB,WAAhCI,SAAS2V,oBAAuE,KAAA,IAA7B/V,EAAMoH,OAAO8d,aACjEC,gCAAiCL,6BAA6BzkB,IAAI,EAAGL,EAAMoH,OAAO8d,WAAY,EAG9D,SAAhC9kB,SAAS2V,oBAAiCqP,uBAAuBplB,EAAMoH,MAAM,IAC7EyF,OAAO4C,eAAezH,UAAUyJ,KAAO,SAASzP,GAC5CvC,IACA4lB,EAAe,uCADIC,gBAAgB,EACoC,IACvEC,YAAYrd,KAAK7H,KAAMglB,EAAerjB,CAAI,EAC1CuC,WAAW,KACPsI,OAAO4C,eAAezH,UAAUyJ,KAAO8T,WAC3C,EAAG,CAAC,CACR,GAIAvlB,EAAMoH,OAAO4d,yBAAyBQ,UAAY,CAACC,0BAA0BzlB,EAAMoH,MAAM,IAC1DuL,KAAAA,IAA3B3S,EAAMoH,OAAO5H,WAA2BQ,EAAMoH,OAAO5H,UAAUkmB,SAAS,iBAAiB,GACzF1lB,EAAM0C,eAAe,EAEzB6B,WAAW,WACPvE,EAAMoH,OAAO4d,cAAc9c,KAAKlI,EAAMoH,OAAQpH,CAAK,CACvD,EAAG,CAAC,EAEZ,EACJ,CACJ,EAAG,GAAI,EAGiBV,SAASuH,iBAAiB,wBAAwB,GAE1E,IADAzG,SAASK,kBAAoBA,GACPd,OAClB,IAAKF,IAAIC,EAAI,EAAGA,EAAIe,EAAkBd,OAAQ,EAAED,EAC5Ce,EAAkBf,GAAGmG,iBAAiB,QAAS9F,yBAAyB,EAKhF,IAAK,IAAM4lB,KAASrmB,SAASuV,MAED,aAApB,OAAOzU,UACqC,GAA5C,CAAEA,SAASwlB,8BACX,EACiC,eAA7BD,EAAM/a,aAAa,IAAI,GACU,OAAhC+a,EAAM/a,aAAa,OAAO,GAAqE,CAAC,IAAxD+a,EAAM/a,aAAa,OAAO,EAAEnI,QAAQ,aAAa,GAC1D,OAA/BkjB,EAAM/a,aAAa,MAAM,GAA+D,CAAC,IAAlD+a,EAAM/a,aAAa,MAAM,EAAEnI,QAAQ,QAAQ,IAInFkjB,EAAM1gB,cAAc,8BAA8B,GAKrB,qBAA7B0gB,EAAM/a,aAAa,IAAI,GACS,2BAAhC+a,EAAM/a,aAAa,OAAO,IAM9B+a,EAAME,wBAA0BF,EAAMV,SACtCU,EAAMV,SAAW,GAAOa,4BAA4BjO,EAAG8N,CAAK,GAKpEI,yBAAyB,EAGzB,IAAIrR,4BAOAtU,SAAS4lB,6BACTC,sBAAsB,CAE9B,CAKA,SAASA,wBACL,GAAI7lB,SAASghB,qCAAsC,CAC/C,IAAM8E,EAA4BjI,YAAY,KACd3P,CAAAA,aAAa6X,2BAGrC7iB,YAAY,2BAA4B,IAAK,MAAM,EACnDic,cAAc2G,CAAyB,EAE/C,EAAG,GAAG,CACV,CACJ,CAKA,SAAS3B,qBA2BD1X,OAAO+B,eAAe,IAAI,GAC1B/B,OAAOuZ,GAAGxX,eAAe,UAAU,GACD,YAAlC,OAAO/B,OAAOuZ,GAAGC,SAASC,KAE1BzZ,OAAOuZ,GAAGC,SAASC,IA9BI,CAACC,EAASC,KACV,UAAnB,OAAOD,GAAoC,OAAZA,GAC9BA,EAAQ3X,eAAe,MAAM,GAAM2X,EAAQ3X,eAAe,MAAM,IAMjE2X,EAAQvkB,KAAK4M,eAAe,UAAU,GACP,EAA/B2X,EAAQvkB,KAAKykB,SAAS9mB,QACtB4mB,EAAQvkB,KAAKykB,SAAS,GAAG7X,eAAe,MAAM,GACZ,+BAAlC2X,EAAQvkB,KAAKykB,SAAS,GAAGC,OAEzBH,EAAQvkB,KAAKykB,SAAS,GAAGzkB,KAAK2kB,0BAA4BrB,gBAAgB,EAC1EiB,EAAQvkB,KAAKykB,SAAS,GAAGzkB,KAAK4kB,YAActY,aAAaC,QAAQ,0BAA0B,GAI1E,0BAAjBgY,EAAQG,QACRH,EAAQvkB,KAAK2kB,0BAA4BrB,gBAAgB,EACzDiB,EAAQvkB,KAAK4kB,YAActY,aAAaC,QAAQ,0BAA0B,GAGvEiY,EAAKD,CAAO,EAOsB,CAEjD,CAKA,SAASR,2BAEL,GAAqD,OAAhDzmB,SAAS2F,cAAc,mBAAmB,EAAa,CACxD,IAAM4hB,EAAepX,eAAezH,UAAUyJ,KAC9ChC,eAAezH,UAAUyJ,KAAO,SAAS5Q,GAErC,GACIA,GACgB,UAAhB,OAAOA,GAEmD,CAAC,IAAvDA,EAAK4B,QAAQ,mCAAmC,EAEtD,CACEhD,IAAIqnB,EAA0B,GAC1B7D,EAAa3U,aAAaC,QAAQ,0BAA0B,EAChE,IACI0U,EAAalgB,KAAKyL,MAAMyU,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CAEmB,OAAfA,GACe,CAAA,IAAfA,GACAA,EAAWrU,eAAe,OAAO,GACZ,KAArBqU,EAAWnY,QAEXmY,EAAaA,EAAWnY,MACxBgc,GAA2B,0CAAiD7D,GAGhFxjB,IAAI4lB,EAAeC,gBAAgB,EAGnCzkB,GAFAimB,GAA2B,wCAA+CzB,CAK9E,CACA,OAAOwB,EAAaE,MAAM1mB,KAAM,CAACQ,EAAK,CAC1C,CACJ,CACJ,CAMA,SAASmmB,4CAA4CC,GAE5CA,IAC0C,SAAtC3lB,kBAAkB2B,gBACnBC,sBAAsB,iCAAkC,EAAE,EACZ,eAAtC5B,kBAAkB2B,iBAC1Ba,sBAAsB,CAACD,OAAQ,gCAAgC,EAAG,EAAE,EAGhF,CAUA,SAASygB,4CAIL7kB,IAAIwjB,EAAa,CAAA,EACM,aAAlB,OAAOJ,QAAsD,YAA5B,OAAOA,OAAOqE,WAChDrE,OAAOqE,UAAU,CACbjP,WAAY,SAASzI,EAAKuT,GACtBtjB,IAAI0nB,EAAa,CAAA,EA0BjB,GAxB8B,UAAzB,OAAOpE,EAAS/gB,OAC8B,CAAC,IAA5C+gB,EAAS/gB,KAAKS,QAAQ,eAAe,IACrC0kB,EAAa,iBAGgC,CAAC,IAA9CpE,EAAS/gB,KAAKS,QAAQ,iBAAiB,IACvC0kB,EAAa,mBAIyC,CAAC,IAAvDpE,EAAS/gB,KAAKS,QAAQ,0BAA0B,GACI,CAAC,IAArDsgB,EAAS/gB,KAAKS,QAAQ,wBAAwB,IAE9C0kB,EAAa,4BAG0C,CAAC,IAAxDpE,EAAS/gB,KAAKS,QAAQ,2BAA2B,IACjD0kB,EAAa,6BAG4C,CAAC,IAA1DpE,EAAS/gB,KAAKS,QAAQ,6BAA6B,KACnD0kB,EAAa,+BAGQ,UAAxB,OAAOpE,EAAS7V,KACmC,CAAC,IAAjD6V,EAAS7V,IAAIzK,QAAQ,qBAAqB,IAC1C0kB,EAAa,sBAC4C,OAArD7Y,aAAaC,QAAQ,0BAA0B,GAAY,CAC3D0U,EAAa3U,aAAaC,QAAQ,0BAA0B,EAC5D,IACI0U,EAAalgB,KAAKyL,MAAMyU,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CACmB,CAAA,IAAfA,GAAwBA,EAAWrU,eAAe,OAAO,GAA0B,KAArBqU,EAAWnY,QACzEmY,EAAaA,EAAWnY,MAEhC,CAIR,IACQua,EADJ8B,IACI9B,EAAeC,gBAAgB,EAE/BrC,EADsB,UAAtB,OAAOA,EACM,yCAA2CA,EAAa,IAExD,GAIjBF,EAAS/gB,MAFTqjB,EAAe,uCAAyCA,EAAe,KAExCpC,EAAaF,EAAS/gB,KAE7D,CACJ,CAAC,CAET,CAGA,SAASyjB,0BAA0BpK,GAC/B,MAAIA,CAAAA,CAAAA,EAAK7b,UAAUkmB,SAAS,wBAAwB,CAKxD,CAgBA,SAASI,4BAA4BjO,EAAGuP,GACpC,IAEI,IAAMC,EAAgBD,EAAWniB,cAAc,4BAA4B,EACvEqiB,EAAU,KAEQ,OAAlBD,GACwB,OAAxBA,EAAcvc,QAEdwc,EAAUD,EAAcvc,OAI5BrL,IAQU8nB,EAWFvD,EAmBEwD,EAtCNC,EAA4BC,6BAA6B,EAGzDC,EAAyBzR,kBAAkB+C,IAAI,0BAA0B,EAG1C,OAA9BwO,GAAwD,OAAlBJ,GAAqD,OAA3BM,IACjE9P,EAAEnV,eAAe,EACX6kB,EAAW,KACS,OAAlBF,GACAA,EAAcO,WAAW/C,YAAYwC,CAAa,EAEJ,YAA9C,OAAOD,EAAWvB,wBAClBuB,EAAWvB,wBAAwB,EAEnCgC,gBAAgB7f,UAAU8f,OAAO5f,KAAKkf,CAAU,CAExD,EAEIpD,EAAeyD,EAGF,OAAZH,IACDtD,EAAa+D,kCAAoCT,GAIrDtD,EAAagE,4BAA8BL,EAIC,UAAxC,OAAO3D,EAAajM,iBAC4B,CAAC,IAAjDiM,EAAajM,gBAAgBtV,QAAQ,KAAK,IAE1CuhB,EAAajM,gBAAkBC,mBAAmBgM,EAAajM,eAAe,GAOpD,KAAA,KAHxByP,EAAgBzkB,KAAKC,UAAUghB,CAAY,IAGqB,IAAzBwD,EAAc7nB,OACvDyW,uBACIoR,EACA,CAACpkB,SAAUmkB,EAAU9jB,gBAAiB8jB,EAAUjR,gBAAiB,CAAA,CAAI,CACzE,EAEAiR,EAAS,EAKrB,CAFE,MAAOrZ,GACLlK,QAAQikB,KAAK,6CAA+C/Z,CAAK,CACrE,CACJ,CAMA,SAAShM,wBAAwBgmB,EAAgB,IAC7CzoB,IAAI0oB,EAAiB,GAErBA,EAAeC,kBAAoBlQ,YAAY5W,kBAAkBsV,aAAe,mBAAmB,EACnGuR,EAAeE,wBAA0BnQ,YAAY5W,kBAAkBsV,aAAe,yBAAyB,EAC/GuR,EAAeG,WAAapQ,YAAY5W,kBAAkBsV,aAAe,YAAY,EACrFuR,EAAeI,iBAAmBrQ,YAAY5W,kBAAkBsV,aAAe,kBAAkB,EACjGuR,EAAeK,gBAAkBtQ,YAAY5W,kBAAkBsV,aAAe,iBAAiB,EAC/FuR,EAAeM,gBAAkBvQ,YAAY5W,kBAAkBsV,aAAe,iBAAiB,EAC/FuR,EAAeO,eAAiBxQ,YAAY5W,kBAAkBsV,aAAe,gBAAgB,EAC7FuR,EAAeQ,YAAczQ,YAAY5W,kBAAkBsV,aAAe,aAAa,EAGvF,IAAMgS,EAA2B1S,kBAAkB+C,IAAI3X,kBAAkBsV,aAAe,gBAAgB,EAClGiS,EAA4B3S,kBAAkB+C,IAAI3X,kBAAkBsV,aAAe,iBAAiB,EACpGkS,EAA4B5S,kBAAkB+C,IAAI3X,kBAAkBsV,aAAe,iBAAiB,EACpGmS,EAAgB7S,kBAAkB+C,IAAI,iBAAiB,EACvD+P,EAAmBlP,oBAAoBb,IAAI,oBAAoB,EAC/DgQ,EAAmBnP,oBAAoBb,IAAI,oBAAoB,EAC/DiQ,EAAyBhT,kBAAkB+C,IAAI3X,kBAAkBsV,aAAe,cAAc,EAC9FuS,EAAajT,kBAAkB+C,IAAI3X,kBAAkBsV,aAAe,iBAAiB,EACrFwS,EAAgBlT,kBAAkB+C,IAAI3X,kBAAkBsV,aAAe,gBAAgB,EACvFyS,EAA+BnT,kBAAkB+C,IACnD3X,kBAAkBsV,aAAe,mCACrC,EAGM0S,EAAqBpR,YAAY5W,kBAAkBsV,aAAe,gBAAgB,EAClF2S,EAAsBrR,YAAY5W,kBAAkBsV,aAAe,iBAAiB,EACpF4S,EAAsBtR,YAAY5W,kBAAkBsV,aAAe,iBAAiB,EACpF6S,EAAoBvR,YAAY5W,kBAAkBsV,aAAe,iBAAiB,EAClF8S,EAAsB,CAAC,CAACxR,YAAY5W,kBAAkBsV,aAAe,gBAAgB,EA8B3F,GA3BAuR,EAAewB,eAA8ChX,KAAAA,IAA7BiW,EAC5BA,EAA2BU,EAC/BnB,EAAeyB,gBAAgDjX,KAAAA,IAA9BkW,EAC7BA,EAA4BU,EAChCpB,EAAe0B,gBAAgDlX,KAAAA,IAA9BmW,EAC7BA,EAA4BU,EAChCrB,EAAepQ,gBAAiCpF,KAAAA,IAAfwW,EAC7BA,EAAaM,EACjBtB,EAAe2B,eAAmCnX,KAAAA,IAAlByW,EAC5BA,EAAgBM,EACpBvB,EAAe4B,kCAAqEpX,KAAAA,IAAjC0W,EAC/CA,EAA+B,GAC/BlB,EAAepQ,iBAA6D,UAA1C,OAAOoQ,EAA8B,iBACnEA,EAAepQ,gBAAgBtV,QAAQ,QAAQ,IAC/C0lB,EAAepQ,gBAAkBC,mBAAmBmQ,EAAepQ,eAAe,GAI1FoQ,EAAe6B,gBAAkBjB,EACjCZ,EAAe8B,mBAAqBjB,EACpCb,EAAe+B,mBAAqBjB,EACpCd,EAAegC,mBAAqBjB,EAE/Bf,EAAepQ,kBAChBoQ,EAAepQ,gBAAkB3X,SAAS8jB,YAGd,UAA3B,OAAO,EACR,IAAKzkB,IAAIC,EAAI,EAAGA,EAAIwoB,EAAcvoB,OAAQ,EAAED,EACF,UAAjC,OAAQwoB,EAAcxoB,GAAG,GAE1ByoB,EAAeD,EAAcxoB,GAAG,GAAG,IAAMwoB,EAAcxoB,GAAG,GAAG,GAE7DyoB,EAAeD,EAAcxoB,GAAG,IAAMwoB,EAAcxoB,GAAG,QAI/DsE,QAAQC,IAAI,+CAA+C,EAO/D,OAHAkkB,EAAiBiC,yBAAyBjC,CAAc,EAGjDplB,KAAKC,UAAUmlB,CAAc,CACxC,CAUA,SAASiC,yBAAyBxW,GAC9B,GAAuB,UAAlB,OAAOA,EAER,IAAKnU,IAAIoU,KAAaD,EAAQ,CAO1B,IAIUE,EATwB,UAA7B,OAAOF,EAAOC,KACfD,EAAOC,GAAauW,yBAAyBxW,EAAOC,EAAU,GAKjC,UAA7B,OAAOD,EAAOC,IACiC,OAA/CD,EAAOC,GAAWvI,MAAM,iBAAiB,GAGb,UAAvB,OADCwI,EAAc/Q,KAAKyL,MAAMoF,EAAOC,EAAU,KAE5CD,EAAOC,GAAaC,EAGhC,CAGJ,OAAOF,CACX,CAGA,SAASkR,6BAA8BzJ,GAEnC5b,IAAI4qB,EAAS,GACTC,EAAgB,GAChBC,EAAqB,EACrBC,EAAkB,GAClBC,EAAuB,EACvBC,EAA2B,GAE/B,IAAKjrB,IAAI8Q,KAAO8K,EAAK5T,SACZkjB,MAAM,CAACpa,CAAG,IACX8Z,EAAO9Z,GAAO8K,EAAK5T,SAAS8I,IAsDpC,OAjDA8Z,EAASA,EAAOlf,OAAO,SAAS5C,GAE5B,MAAuE,CAAC,IAAnEmiB,EAAyBjoB,QAAS8F,EAAKqC,aAAa,MAAM,CAAE,IAI5D,CAAC,IAAM,CAAC,QAAS,YAAYnI,QAAS8F,EAAKqC,aAAa,MAAM,CAAE,IACjE8f,EAAyBpiB,KAAMC,EAAKqC,aAAa,MAAM,CAAE,EAClD,CAAA,GAGf,CAAC,GAGMjG,QAAQ,SAAS4D,EAAM7I,EAAG+H,GAGK,WAA9Bc,EAAKqC,aAAa,MAAM,GACM,OAA9BrC,EAAKqC,aAAa,MAAM,GACM,eAA9BrC,EAAKqC,aAAa,MAAM,IAMW,SAAnC1B,iBAAiBX,CAAI,EAAEe,SACe,WAAtCJ,iBAAiBX,CAAI,EAAEqiB,YACY,MAAnC1hB,iBAAiBX,CAAI,EAAEkE,SACO,WAA9BlE,EAAKqC,aAAa,MAAM,GAEnBrC,EAAK/I,UAAUkmB,SAAS,gBAAgB,GAW7C4E,GAAiB,IAAM/hB,EAAKqC,aAAa,MAAM,EAC/C2f,CAAkB,KARdC,GAAmB,IAAMjiB,EAAKqC,aAAa,MAAM,EACjD6f,CAAoB,IAShC,CAAC,EAEDD,EAAkBA,EAAgBvG,KAAK,EAGhC,CACH4G,eAHJP,EAAgBA,EAAcrG,KAAK,EAI/B6G,qBAAsBP,EACtBQ,iBAAkBP,EAClBQ,uBAAwBP,CAC5B,CACJ,CAGA,SAAStF,gCAAiC8F,EAAyBC,GAC/DzrB,IAAI0rB,EAAgD,UAAnC,OAAOF,GAAoE,OAA5BA,EAC5DA,EAA0B,GAE9B,GAAqC,WAAhC7qB,SAAS2V,mBAEV,IAAMtW,IAAIC,KAAKyrB,EAAa,CACxB,GAAS,GAAJzrB,EAED,OAGJ4D,YAAY,yBADqBqP,KAAAA,IAAXuY,EAAuBA,EAASxrB,GACCqD,KAAKC,UAAWmoB,EAAWzrB,EAAG,CAAE,CAC3F,MAEA4D,YAAY,uBAAwBP,KAAKC,UAAWmoB,CAAW,CAAE,CAEzE,CAGA,SAASC,+BAA+B/nB,EAAQrB,EAAMgN,EAAQuJ,GAC1D,GAA8D,EAAzDjZ,SAASuH,iBAAiB,oBAAoB,EAAElH,OAAa,CAC9DF,IAAIgI,EAAWnI,SAASuH,iBAAiB,oBAAoB,EAC7D,IAAMpH,IAAIC,EAAI,EAAGA,EAAI+H,EAAS9H,OAAQD,CAAC,GACnC+H,EAAS/H,GAAGoL,MAAQzH,EAAOgoB,MAEnC,CACJ,CAKA,SAASvH,qBACL,OAAO/gB,KAAKC,UAAU,CAClBsoB,UAAWhsB,SAASisB,gBAAgBC,YACpCC,WAAYxc,KAAKyc,IACbpsB,SAASuB,KAAK8qB,aAAcrsB,SAASisB,gBAAgBI,aACrDrsB,SAASuB,KAAKigB,aAAcxhB,SAASisB,gBAAgBzK,aACrDxhB,SAASuB,KAAK+qB,aAActsB,SAASisB,gBAAgBK,YACzD,EACAC,aAAcvsB,SAASisB,gBAAgBO,YACvCC,cAAezsB,SAASisB,gBAAgBK,YAC5C,CAAC,CACL,CAGA,SAAShJ,oBAAoB5b,GACzBvH,IAAIwN,EAAM,GACoB,KAAA,IAAnBjG,EAASpE,QAChBoE,EAAWA,EAASpE,OACPopB,UACT/e,EAAMjG,EAASf,UAMfgH,EAHqB,KAAA,IAAlBjG,EAAShF,MAES2Q,KAAAA,KADzB3L,EAAWA,EAAShF,MACPoL,QACHpG,EAASoG,QAInBH,KACA3N,SAASqb,cACL,IAAIJ,YAAa,qBAAsB,CACnCC,QAAS,CAAA,EACTE,OAAQ,CAACtN,QAASH,CAAG,CACzB,CAAE,CACN,EAGAgf,eAAeC,OAASjf,EACxBgf,eAAerb,KAAK,EAEU,GAA1B,CAAC5J,EAASmlB,cACVtf,OAAOuf,KAAK,CAGxB,CAGA,SAASC,0BAA0BC,GAE/BhpB,YAAY,kBAAmBgpB,CAAY,CAC/C,CAGA,SAASC,+BAA+BtX,GACpCxV,IAAI4a,EAAY,SACH,WAATpF,IACAoF,EAAY,UAEhB5a,IAAI8c,EAAQ,GAER8I,EAAeqC,6BAA6B,EAChDrC,EAAetiB,KAAKC,UAAUqiB,CAAY,EAQ1C,OAPAA,EAAe,sBAAwBN,KAAKM,CAAY,GACxD9I,EAAQjd,SAASC,cAAc,OAAO,GAChC8B,aAAa,OAAQ,2BAA2B,EACtDkb,EAAMlb,aAAa,QAASgkB,CAAY,EACxC9I,EAAMlb,aAAa,OAAQgZ,CAAS,EACpCkC,EAAM/c,UAAUsB,IAAI,qBAAqB,EACzCyb,EAAM/c,UAAUsB,IAAI,2BAA2B,EACxCyb,CACX,CAOA,SAASmL,+BACLjoB,IAWQ+sB,EAXJC,EAAoBvW,kBAAkB2D,iBAAiB,EACvD6S,EAAsB5S,oBAAoBD,iBAAiB,EAE/Dpa,IAAIktB,EAAmB,CAACC,KAAM,EAAE,EAK5BC,GAJAvtB,SAASskB,YAActkB,SAASskB,WAAW5hB,OAC3C2qB,EAAmB,CAACC,KAAMttB,SAASskB,WAAW5hB,IAAI,GAGnB,CAAC8qB,8BAA+B,EAAE,GAOrE,OALIxtB,SAASiW,+BACLiX,EAA6BzpB,KAAKyL,MAAMzL,KAAKC,UAAU1D,SAASiW,4BAA4B,CAAC,EACjGsX,EAA+B,CAACC,8BAA+BN,CAA0B,GAGtF,CAAC,GAAGC,EAAmB,GAAGC,EAAqB,GAAGC,EAAkB,GAAGE,CAA4B,CAC9G,CAKA,SAAS9K,iBACLtiB,IAAIoV,EAAQvV,SAASuV,MACrB,OAAIA,GAGG,CAAA,CACX,CAOA,SAASkY,+BAA+B1R,GAEpC5b,IAAI4D,EAAS,CAAC2pB,UAAa,EAAGnC,eAAkB,CAAC,EAkC7CoC,IAhC4C,GAA5C,CAAC7sB,SAAS8sB,+BACgC,QAAzC7R,EAAKlY,OAAOqQ,SAAS,EAAE5H,YAAY,GACiB,IAArDyP,EAAKxU,iBAAiB,kBAAkB,EAAElH,QAC9B,kBAAZ0b,EAAKxZ,IACLwZ,EAAK7b,UAAUkmB,SAAS,iBAAiB,GACzCrK,EAAKrP,cAAcxM,UAAUkmB,SAAS,aAAa,GACI,CAAC,IAAxDrK,EAAKxX,OAAO2P,SAAS,EAAE/Q,QAAQ,kBAAkB,GAChD4Y,EAAKxZ,IAAkB,eAAZwZ,EAAKxZ,IAChBwZ,EAAK7b,WAAa6b,EAAK7b,UAAUkmB,SAAS,eAAe,GACzDrK,EAAK7b,WAAa6b,EAAK7b,UAAUkmB,SAAS,WAAW,GACrDrK,EAAKxZ,IAAkB,6BAAZwZ,EAAKxZ,IAChBwZ,EAAKxZ,IAAyD,CAAC,IAApDwZ,EAAKxZ,GAAG2R,SAAS,EAAE/Q,QAAQ,kBAAkB,GACxD4Y,EAAKxZ,IAAiD,CAAC,IAA5CwZ,EAAKxZ,GAAG2R,SAAS,EAAE/Q,QAAQ,UAAU,GAChD4Y,EAAKxZ,IACuD,CAAC,IAA1DwZ,EAAKxZ,GAAG2R,SAAS,EAAE/Q,QAAQ,wBAAwB,GACtD4Y,EAAKpQ,MACyD,CAAC,IAA5DoQ,EAAKpQ,KAAKuI,SAAS,EAAE/Q,QAAQ,wBAAwB,GAC9B,iDAA3B4Y,EAAKxX,OAAO2P,SAAS,GACpB6H,EAAKpQ,MAA2D,CAAC,IAApDoQ,EAAKpQ,KAAKuI,SAAS,EAAE/Q,QAAQ,gBAAgB,GAC1D4Y,EAAKxZ,IAAkB,mBAAZwZ,EAAKxZ,IAChBwZ,EAAKxZ,IACU,mBAAZwZ,EAAKxZ,IACmD,CAAC,IAAzDwZ,EAAKxX,OAAO2P,SAAS,EAAE/Q,QAAQ,mBAAmB,GACrD4Y,EAAKxZ,IAAkB,yBAAZwZ,EAAKxZ,IAChBwZ,EAAKxZ,IAAkB,YAAZwZ,EAAKxZ,IACmE,CAAC,IAArFwZ,EAAKxX,OAAO2P,SAAS,EAAE/Q,QAAQ,+CAA+C,GACpC,OAA1C4Y,EAAKpW,cAAc,iBAAiB,KAEpC5B,EAAOwnB,eAAiB,GAIAxP,EAAKuM,YAgBjC,OAdIqF,GAAyBA,EAAsBztB,UAAUkmB,SAAS,UAAU,GAC7D,YAAdrK,EAAKpQ,MAAsBoQ,EAAK7b,UAAUkmB,SAAS,cAAc,KAElEriB,EAAO2pB,UAAY,GAKnB3R,GAAQA,EAAK7b,UAAUkmB,SAAS,wBAAwB,IAExDriB,EAAOwnB,eAAiB,EACxBxnB,EAAO2pB,UAAY,GAGhB3pB,CACX,CAUA,SAASqhB,8BAA8BrJ,EAAM8R,GACzC,IAAMC,EAAoC,UAAvB,OAAO/R,EAAW,OAAgBA,EAAKxX,OAAS,GAEnE,MAAI2H,CAAAA,CAAAA,QAAQ6P,EAAKpW,cAAc,0BAA0B,CAAC,GAItDoW,CAAAA,CAAAA,EAAK7b,UAAUkmB,SAAS,wBAAwB,GAIN,CAAC,IAA3C0H,EAAW3qB,QAAQ,iBAAiB,GAIF,CAAC,IAAnC2qB,EAAW3qB,QAAQ,SAAS,GAIC,UAA7B,OAAO,GACsD,CAAC,IAA9D,CAAC,iBAAkB,aAAaA,QAAQ0qB,CAAe,GAEhB,IADpBJ,+BAA+B1R,CAAI,EACpC8R,EAI1B,CAKA,SAAS5W,sCACL,GAAoC,SAAhCnW,SAAS2V,mBAAb,CAIAtW,IAAIoV,EAAQkN,eAAe,EAE3B,GAAIlN,EACA,IAAMpV,IAAIC,EAAI,EAAGA,EAAImV,EAAMlV,OAAQD,CAAC,GAChC,GAAKglB,CAAAA,8BAA8BplB,SAASuV,MAAMnV,GAAI,WAAW,IAKhB,OAA7CJ,SAASuV,MAAMnV,GAAGkL,aAAa,QAAQ,GACoB,SAA3DtL,SAASuV,MAAMnV,GAAGkL,aAAa,QAAQ,EAAEgB,YAAY,GAAc,CAEnEnM,IAAI4c,EAASxH,EAAMnV,GAAGmH,iBAAiB,4BAA4B,EACnE,IAAMpH,IAAI4tB,EAAI,EAAGA,EAAIhR,EAAO1c,OAAQ0tB,CAAC,GACjChR,EAAOgR,GAAG9nB,UAAY,GAG1BjG,SAASuV,MAAMnV,GAAGI,OAAOysB,+BAA+B,CAAC,CAC7D,CApBR,CAuBJ,CA9jCInsB,SAASsb,kBACTC,2BAA2Brc,SAAU,YAAase,mBAAmB,EACrEjC,2BAA2Brc,SAAU,YAAaoe,kBAAkB,EACpE/B,2BAA2Brc,SAAU,UAAWoe,kBAAkB,EAClE/B,2BAA2Brc,SAAU,SAAUuiB,gBAAgB,GA8hB/DzhB,SAASsb,kBACmB,YAAxBpc,SAAS4S,WACTgR,YAAY,EAEZvH,2BAA2Brc,SAAU,mBAAoB4jB,WAAW,EAGxEhN,kBAAkBC,IAAI,aAAc/V,SAASktB,eAAgB,CAAA,CAAK,GAuhBtE,IAAMC,aAAe1gB,OAAO2gB,MACtBjI,YAAc9V,eAAezH,UAAUyJ,KAW7C,SAASgc,6BACLlpB,WAAW,WACHmpB,oBAAoB,IACpB7gB,OAAO2gB,MAAQ,YAAYrjB,GACvB,IAKQkb,EAOR,OAZIlb,GACAA,EAAK,IACuB,YAA5B,OAAOA,EAAK,GAAG+U,UACf/U,EAAK,GAAG+U,SAAS,mBAAmB,IAEhCmG,EAAeC,gBAAgB,EAE/Bnb,IAAQA,EAAK,IAAMA,EAAK,GAAGtJ,MAC3BsJ,EAAK,GAAGtJ,KAAKf,OAAO,4BAA6BulB,CAAY,EAI9DkI,aAAaxG,MAAMla,OAAQ1C,CAAI,CAC1C,EAER,EAAG,GAAI,CACX,CAKA,SAASujB,sBACL,IAAMC,EAAc,CAChB,wBAEJluB,IAAImuB,EAAc,CAAA,EAGlB,IAAKnuB,IAAI4b,KADK/b,SAASuV,MAEnB8Y,EAAYhpB,QAAQ,SAASkpB,GACrBxS,EAAK7b,UAAUkmB,SAASmI,CAAS,IACjCD,EAAc,CAAA,EAEtB,CAAC,EAGL,OAAOA,CACX,CAMA,SAASxI,uBAAuB/J,GAC5B,OAA8E,MAA1E/b,SAAS2F,cAAc,4CAA8C,GAGrEoW,EAAAA,CAAAA,GAAQA,CAAAA,EAAKxX,QAA2E,CAAC,IAAlEwX,EAAKxX,OAAO2P,SAAS,EAAE/Q,QAAQ,4BAA4B,EAK1F,CAKA,SAAS6iB,kBACL7lB,IAAIgtB,EAAoBvW,kBAAkB2D,iBAAiB,EACvD6S,EAAsB5S,oBAAoBD,iBAAiB,EAC3DwL,EAAe,CAAC,GAAGoH,EAAmB,GAAGC,CAAmB,EAChErH,EAAetiB,KAAKC,UAAUqiB,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS5B,sCACL,IAAMqK,EAAqBhU,oBAAoBb,IAAI,4BAA4B,EAGrD,CAAA,IAAtB6U,GAA+BxuB,SAAS8C,SAASC,OAASyrB,GAC1DhU,oBAAoB3D,IAAI,qBAAsB2X,EAAoB,CAAA,CAAK,EAI3EhU,oBAAoB3D,IAAI,6BAA8B7W,SAAS8C,SAASC,KAAM,CAAA,CAAK,CACvF,CAKA,SAASghB,2BAEL/jB,SAASuH,iBAAiB,uEAAuE,EAAElC,QAAQ,IACvGoC,EAAGlB,iBAAiB,QAAS,SAASgS,GAClCpY,IAAI4C,EAAO0E,EAAG6D,aAAa,MAAM,EAEjCnL,IAAIwjB,EAAa/M,kBAAkB+C,IAAI,0BAA0B,EAC5DgK,IAC0B,CAAC,IAAvB5gB,EAAKI,QAAQ,GAAG,EACjBJ,GAAQ,IAERA,GAAQ,IAEZA,GAAQ,+BAAiC4gB,EACzClc,EAAG1F,aAAa,OAAQgB,CAAI,EAEpC,CAAC,CACL,CAAC,CACL,CApH4B,YAAxB/C,SAAS4S,WACTub,2BAA2B,EAE3B9R,2BAA2Brc,SAAU,mBAAoBmuB,0BAA0B,EAoHvFhuB,IAAIwsB,eAAiB,CAGjBC,OAAQ,CAAA,EACR6B,QAAS,CAAA,EACTC,OAAQ,CAAA,EACRC,QAAS,CAAA,EACTC,iBAAkB,CAAA,EAGlBC,KAAM,SAAUtqB,GACZ,IAEQT,EAFD/C,KAAK6rB,SACR7rB,KAAK0tB,QAAU,CAAA,EACX3qB,EAAW,SAAUC,EAAQrB,EAAMgN,EAAQuJ,GAC3C0T,eAAe8B,QAAU,CAAA,EACzB9B,eAAeC,OAAS7oB,EACxB/D,SAASqb,cACL,IAAIJ,YAAa,8BAA+B,CAC5CC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAOpW,qBACRA,qBAEAN,uBAFsB,CAACD,OAAUA,CAAM,EAAG,CAACT,SAAYA,EAAUW,QAAW,CAAA,CAAI,CAAE,EAK9F,EAEA6M,KAAM,WAEc,SAAZwd,IACA3uB,IAAI4uB,EAAS,GAEb,IAAM,IAAM9d,KAAOlQ,KAAKiuB,OACpBD,GAAU9d,EAAM,IAAMlQ,KAAKiuB,OAAO/d,GAAO,IAE7C,OAAO8d,CACX,CAPA5uB,IAQI8uB,EAAa,CACbD,OAAQ,CACJE,UAAW,aACXC,SAAY,QACZpO,IAAO,IACPO,KAAQ,IACRG,MAAS,OACTL,OAAU,OACVgO,WAAc,kBACdplB,QAAW,OACXqlB,kBAAmB,SACnBC,cAAe,QACnB,EACApb,SAAU4a,CACd,EACIS,EAAW,CACXP,OAAQ,CACJG,SAAY,WACZK,QAAW,OACXJ,WAAc,OACdK,OAAU,6BACVC,gBAAiB,MACjBC,aAAc,qCAClB,EACAzb,SAAU4a,CACd,EACIc,EAAW,CACXZ,OAAQ,CACJG,SAAY,WACZC,WAAc,OACd3N,MAAS,OACTL,OAAU,OACVqO,OAAU,6BACVC,gBAAiB,OACjBtd,OAAU,UACV2O,IAAO,OACPQ,MAAS,OACTsO,aAAc,aAClB,EACA3b,SAAU4a,CACd,EACIgB,EAAiB,CACjBd,OAAQ,CACJhiB,QAAW,KACXhD,QAAW,QACXmlB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBjO,MAAS,MACTL,OAAU,OACVL,IAAO,MACPO,KAAQ,MACRyO,UAAa,eACjB,EACA7b,SAAU4a,CACd,EACIkB,EAAgB,CAChBhB,OAAQ,CACJhiB,QAAW,KACXhD,QAAW,QACXmlB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBjO,MAAS,MACTL,OAAU,OACVL,IAAO,MACPO,KAAQ,MACRyO,UAAa,gBACjB,EACA7b,SAAU4a,CACd,EACImB,EAAU,CACVjB,OAAQ,CACJkB,SAAY,QAChB,EACAhc,SAAU4a,CACd,EACIqB,EAAsBnwB,SAASC,cAAe,OAAQ,EAUtDmwB,GATJD,EAAoBpuB,aAAc,KAAM,wBAAyB,EACjEouB,EAAoBjuB,UAAY,+BAAiC+tB,EAAU,IAC3EE,EAAoBjuB,WAAa,4BAA8B+sB,EAAa,IAC5EkB,EAAoBjuB,WAAa,0BAA4B0tB,EAAW,IACxEO,EAAoBjuB,WAAa,iCAAmC4tB,EAAiB,IACrFK,EAAoBjuB,WAAa,gCAAkC8tB,EAAgB,IACnFhwB,SAASuB,KAAKf,OAAQ2vB,CAAoB,EAG5BnwB,SAASC,cAAe,KAAM,GAMxCowB,GALJD,EAAQruB,aAAc,KAAM,yBAA0B,EACtD/B,SAASuB,KAAKf,OAAQ4vB,CAAQ,EAE9BpwB,SAASuB,KAAKrB,UAAUsB,IAAK,wBAAyB,EAE1CxB,SAASC,cAAe,KAAM,GAKtCqwB,GAJJD,EAAMtuB,aAAc,KAAM,uBAAwB,EAClDsuB,EAAMtuB,aAAc,QAASwtB,CAAS,EACtCa,EAAQ5vB,OAAQ6vB,CAAM,EAEVrwB,SAASC,cAAe,KAAM,GAItC+M,GAHJsjB,EAAMvuB,aAAc,KAAM,uBAAwB,EAClDsuB,EAAM7vB,OAAQ8vB,CAAM,EAENtwB,SAASC,cAAe,KAAM,GACvCc,KAAK6rB,QACA2D,EAAW,uBACW,WACJnQ,KAAKrf,KAAK6rB,MAAM,GAAK7rB,KAAK6tB,iBAC9C5hB,EAAQ9K,UAAYnB,KAAK6rB,OAEzB5f,EAAQ9K,UAAYnB,KAAK6rB,OAAOvlB,QAAQkpB,EAAU,qCAAqC,IAG3FvjB,EAAQ9K,UAAY,aAEpBnB,KAAK8tB,KAAM,sBAAuB,GAEtC7hB,EAAQjL,aAAc,KAAM,yBAA0B,EACtDsuB,EAAM7vB,OAAQwM,CAAQ,EAEtBjM,KAAK2tB,OAAS,CAAA,CAClB,EAEA4B,MAAO,WACHtwB,SAASuB,KAAKrB,UAAUiG,OAAQ,wBAAyB,EACzDnG,SAAS8B,eAAgB,yBAA0B,EAAEqE,OAAO,EAC5DnG,SAAS8B,eAAgB,wBAAyB,EAAEqE,OAAO,EAC3DnG,SAASqb,cACL,IAAIJ,YAAa,uBAAwB,CACrCC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EA0LA,SAASsV,mBACLrwB,IAAIswB,EAAkBzwB,SAASuH,iBAAiB,gCAAgC,EACnD,EAAzBkpB,EAAgBpwB,QAChBowB,EAAgBprB,QAAQ,IACpBwB,EAAQ3G,UAAUiG,OAAO,SAAS,CACtC,CAAC,CAET,CAMA,SAASuqB,gBAAgBC,GAErB,IAAMC,EAAS,GACTC,EAAQF,EAASxoB,SACvBhI,IAAI8Q,EAEJ,IAAKA,KAAO4f,EACgB,WAApBA,EAAM5f,GAAK0E,MACUtC,KAAAA,IAArBwd,EAAM5f,GAAKzF,OACU,KAArBqlB,EAAM5f,GAAKzF,QACXolB,EAAOC,EAAM5f,GAAKtF,MAAQglB,EAASxoB,SAAS8I,GAAKzF,OAGzDolB,EAAOrsB,OAAS,oBAGhBC,sBACIosB,EACA,CACIhjB,IAAK5L,kBAAkBuX,UACvBzV,SAAU,SAASpB,GACf,GAAqB,CAAA,IAAjBA,EAAKqC,QAIL,OADA+rB,MAAMpuB,EAAKA,IAAI,EACR,CAAA,EAHPiuB,EAASI,WAAW,CAK5B,CACJ,CACJ,CACJ,CAoBA,SAASC,yBACL7wB,IAYkB8wB,EAZdC,EAAe,GACfC,EAAa,GAEjB,IAAMhxB,IAAIC,EAAI,EAAGA,EAAIJ,SAASuV,MAAMlV,OAAQD,CAAC,GACA,UAApC,OAAOJ,SAASuV,MAAMnV,GAAS,QAIU,QAAtC8wB,GAFWC,EADFnxB,SAASuV,MAAMnV,IACFmE,QAETpB,QAAQ,WAAW,GACwB,OAAxD+tB,EAAallB,MAAMlL,SAASswB,UAAY,SAAU,GAChDC,8BAA8BH,CAAY,IAEtCD,EAAYE,EAAWG,UAAU,CAAA,CAAI,EAC3CH,EAAW7I,WAAWiJ,aAAaN,EAAWE,CAAU,EAExDF,EAAUF,WAAaI,EAAW3I,OAClCyI,EAAUzI,OAAS,KAEnByI,EAAU1qB,iBAAiB,SAAU,SAAS7F,GAK1C,OAJAA,EAAM0C,eAAe,EACrB1C,EAAMsK,gBAAgB,EACtBtK,EAAM8wB,yBAAyB,EAC/Bd,gBAAgBhwB,EAAMoH,MAAM,EACrB,CAAA,CACX,CAAC,EAIjB,CAOA,SAASupB,8BAA8B9sB,GAOnC,MALmC,CAC/B,eACA,wBAG8BktB,KAAK,GACmC,OAA/DltB,EAAOyH,MAAM,IAAI8M,OAAOhY,SAASswB,UAAY,KAAOza,CAAI,CAAC,CACnE,CACL,CApSA3W,SAASuG,iBAAiB,QAAS,SAAUgS,GACpCA,CAAAA,EAAEzQ,QAA2B,4BAAhByQ,EAAEzQ,OAAOvF,IAAoD,0BAAhBgW,EAAEzQ,OAAOvF,IACpEoqB,eAAe2D,MAAM,CAE7B,CAAC,EACDtwB,SAASuG,iBAAiB,8BAA+B,SAAUgS,GAC1DoU,eAAe+B,QAAU/B,eAAeC,SACzC5sB,SAAS8B,eAAgB,yBAA0B,EAAEI,UAAYyqB,eAAeC,OAExF,CAAC,EAED5sB,SAASuG,iBAAiB,mBAAoB,WAC1CpG,IAAIuxB,EAAgBre,KAAAA,EAChBse,EAA2B,CAAA,EAgB/B,GAdyB,aAApB,OAAO7wB,UAA0D,aAA9B,OAAO8wB,oBAKd,KAAA,KAHzBF,EADqB,aAApB,OAAO5wB,UAA4BA,SAAS+wB,cAC7B/wB,SAAS+wB,cAGlBH,IACuB,aAA9B,OAAOE,oBACPA,mBAAmBC,gBAEnBH,EAAgBE,mBAAmBC,cACnCF,EAA2B,CAAA,GAI5BD,EAAP,CAKAvxB,IAAI2xB,EAAyB,wCACxB9xB,SAAS2F,cAAc,iDAAiD,IAEzEmsB,EAAyB,8CAE7B3xB,IAEM4xB,EAAc/xB,SAASuH,iBACzBuqB,EAF4B,uFAIH,EAED,IAAvBC,EAAY1xB,SAIjB0xB,EAAY1sB,QAAQ,CAAEwB,EAASmrB,KAE3B,IAQIC,EAGAC,EAIAC,EAGAC,EAIAC,EAGAC,EAKIC,EA7Bc,aAAlB,OAAOC,SACP3rB,EAAQ6F,cAAcvC,UAAUhH,QAAQ,OAAO,EAAI,GAChC,OAAnB0D,EAAQwF,WAKR4lB,EAAYjyB,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uBAAuB,GAEnDmwB,EAAWlyB,SAASC,cAAc,KAAK,GAClC8B,aAAa,MAAO2vB,EAAce,YAAY,EACvDP,EAASnwB,aAAa,QAAS,2BAA2B,GAEtDowB,EAAiBnyB,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uBAAuB,GAExDqwB,EAAwBpyB,SAASC,cAAc,GAAG,GAChC8B,aAAa,QAAS,8BAA8B,EAC1EqwB,EAAsB5xB,OAAOkxB,EAAcgB,QAAQC,UAAU,GAEzDN,EAAwBryB,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,mCAAmC,GAE3EuwB,EAA4BtyB,SAASC,cAAc,MAAM,GACnCO,OAAOkxB,EAAcgB,QAAQE,YAAc,GAAG,EACxEN,EAA0B9xB,OAAOkxB,EAAcgB,QAAQG,WAAW,EAE7DlB,KACGY,EAAgBvyB,SAASC,cAAc,GAAG,GAChC8B,aAAa,OAAQ2vB,EAAcoB,cAAc,EAC/DP,EAAcxwB,aAAa,SAAU,QAAQ,EAC7CwwB,EAAcQ,KAAOrB,EAAcgB,QAAQM,oBAC3CV,EAA0B9xB,OAAO,GAAG,EACpC8xB,EAA0B9xB,OAAO+xB,CAAa,GAGlDF,EAAsB7xB,OAAO8xB,CAAyB,EACtDH,EAAe3xB,OAAO4xB,EAAuBC,CAAqB,EAClEJ,EAAUzxB,OAAO0xB,CAAQ,EACzBrrB,EAAQrG,OAAOyxB,CAAS,EACxBprB,EAAQrG,OAAO2xB,CAAc,EACjC,CAAC,EAEcnyB,SAASuH,iBAAiB,wBAAwB,EAE1DlC,QAAQ,IACXlF,IAAI8yB,EAAc5f,KAAAA,EAmCZnO,GAjCNnE,KAAKQ,KAAKgF,iBAAiB,QAAS,SAASgS,GAEY,CAAC,GAAlDA,EAAEzQ,OAAOqC,UAAUhH,QAAQ,iBAAiB,GACmB,CAAC,GAAhEoV,EAAEzQ,OAAO4E,cAAcvC,UAAUhH,QAAQ,iBAAiB,GAE1DqtB,iBAAiB,CAEzB,CAAC,EAED0C,EAAM3sB,iBAAiB,QAAS,WAC5B,IAAMrB,EAAQnE,KAAKoyB,mBACfjuB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUoK,OAAO,SAAS,CAExC,CAAC,EAED4oB,EAAM3sB,iBAAiB,aAAc,WACjCiqB,iBAAiB,EACjB,IAAMtrB,EAAQnE,KAAKoyB,mBACfjuB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUsB,IAAI,SAAS,CAErC,CAAC,EAED0xB,EAAM3sB,iBAAiB,aAAc,WACjC0sB,EAAchuB,WAAW,KACrB,IAAMC,EAAQnE,KAAKoyB,mBACfjuB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAEa+sB,EAAMC,oBACpBjuB,EAAMqB,iBAAiB,aAAc,WACjC6sB,aAAaH,CAAW,EACxB/tB,EAAMhF,UAAUsB,IAAI,SAAS,CACjC,CAAC,EAED0D,EAAMqB,iBAAiB,aAAc,WACjC0sB,EAAchuB,WAAW,KACjBC,EAAMhF,UAAUkmB,SAAS,uBAAuB,GAChDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAGD+sB,EAAM3sB,iBAAiB,WAAY,WAC/B0sB,EAAchuB,WAAW,KACrB,IAAMC,EAAQnE,KAAKoyB,mBACbE,EAAY9lB,OAAOmI,aAAa,EAElCxQ,GAASmuB,GAAanuB,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACtC,IAAhCiN,EAAUnf,SAAS,EAAE7T,OAErB6E,EAAMhF,UAAUiG,OAAO,SAAS,GAEhCitB,aAAaH,CAAW,EACxBjzB,SAASuG,iBAAiB,kBAAmB,SAAS+sB,IAClD,IAAMD,EAAY9lB,OAAOmI,aAAa,EAClC2d,GAA6C,IAAhCA,EAAUnf,SAAS,EAAE7T,SAElC4yB,EAAchuB,WAAW,KACrB,IAAMC,EAAQguB,EAAMC,mBAChBjuB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,EACPnG,SAASgB,oBAAoB,kBAAmBsyB,CAAiB,EAEzE,CAAC,EAET,EAAG,GAAI,CACX,CAAC,CACL,CAAC,EAlJD,CAmJJ,CAAC,EAkDDtzB,SAASuG,iBAAiB,mBAAoB,WACnC,CAACzF,SAASyyB,kCAIjBtuB,WAAW,KACP+rB,uBAAuB,CAC3B,EAAG,GAAG,EAENhxB,SAASuG,iBAAiB,8BAA+B,WACrDyqB,uBAAuB,CAC3B,CAAC,EACL,CAAC"} \ No newline at end of file diff --git a/js/src/apbct-public-bundle.js b/js/src/apbct-public-bundle.js index e37770cec..40362a1ca 100644 --- a/js/src/apbct-public-bundle.js +++ b/js/src/apbct-public-bundle.js @@ -4250,444 +4250,3 @@ function closeAllPopupTRP() { }); } } - -/** - * @return {HTMLElement} event - */ -function apbctSetEmailDecoderPopupAnimation() { - const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; - const animationWrapper = document.createElement('div'); - animationWrapper.classList = 'apbct-ee-animation-wrapper'; - for (let i = 0; i < animationElements.length; i++) { - const apbctEEAnimationDogOne = document.createElement('span'); - apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; - apbctEEAnimationDogOne.innerText = '@'; - animationWrapper.append(apbctEEAnimationDogOne); - } - return animationWrapper; -} - -/** - * @param {mixed} event - */ -function ctFillDecodedEmailHandler(event = false) { - let clickSource = false; - let ctWlBrandname = ''; - let encodedEmail = ''; - if (typeof ctPublic !== 'undefined') { - this.removeEventListener('click', ctFillDecodedEmailHandler); - // remember clickSource - clickSource = this; - // globally remember if emails is mixed with mailto - ctPublic.encodedEmailNodesIsMixed = false; - ctWlBrandname = ctPublic.wl_brandname; - encodedEmail = ctPublic.encodedEmailNodes; - } else if (typeof ctAdminCommon !== 'undefined') { - ctWlBrandname = ctAdminCommon.plugin_name; - encodedEmail = ctAdminCommon.encodedEmailNode; - } - - // get fade - document.body.classList.add('apbct-popup-fade'); - // popup show - let encoderPopup = document.getElementById('apbct_popup'); - if (!encoderPopup) { - // construct popup - let waitingPopup = document.createElement('div'); - waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); - waitingPopup.setAttribute('id', 'apbct_popup'); - - // construct text header - let popupHeaderWrapper = document.createElement('span'); - popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; - let popupHeader = document.createElement('p'); - popupHeader.innerText = ctWlBrandname; - popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); - popupHeaderWrapper.append(popupHeader); - - // construct text wrapper - let popupTextWrapper = document.createElement('div'); - popupTextWrapper.setAttribute('id', 'apbct_popup_text'); - popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); - popupTextWrapper.style.color = 'black'; - - // construct text first node - // todo make translatable - let popupTextWaiting = document.createElement('p'); - popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; - } - popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); - - // construct text second node - // todo make translatable - let popupTextDecoding = document.createElement('p'); - popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { - popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; - } else { - popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; - } - - // appending - popupTextWrapper.append(popupTextWaiting); - popupTextWrapper.append(popupTextDecoding); - waitingPopup.append(popupHeaderWrapper); - waitingPopup.append(popupTextWrapper); - waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); - document.body.append(waitingPopup); - } else { - encoderPopup.setAttribute('style', 'display: inherit'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; - } - } - - apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); -} - -/** - * @param {mixed} event - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { - if (event && clickSource) { - // collect data - const javascriptClientData = getJavascriptClientData(); - let data = { - event_javascript_data: javascriptClientData, - post_url: document.location.href, - referrer: document.referrer, - encodedEmails: '', - }; - let encodedEmailsCollection = {}; - for (let i = 0; i < encodedEmailNodes.length; i++) { - // disable click for mailto - if ( - typeof encodedEmailNodes[i].href !== 'undefined' && - encodedEmailNodes[i].href.indexOf('mailto:') === 0 - ) { - event.preventDefault(); - ctPublic.encodedEmailNodesIsMixed = true; - } - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - apbct(encodedEmailNodes[i]).append(apbctTooltip); - - // collect encoded email strings - encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; - } - - // JSONify encoded email strings - data.encodedEmails = JSON.stringify(encodedEmailsCollection); - - // Using REST API handler - if ( ctPublicFunctions.data__ajax_type === 'rest' ) { - apbct_public_sendREST( - 'apbct_decode_email', - { - data: data, - method: 'POST', - callback: function(result) { - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - - // Using AJAX request and handler - } else { - data.action = 'apbct_decode_email'; - apbct_public_sendAJAX( - data, - { - notJson: false, - callback: function(result) { - console.log('result'); - console.log(result); - - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - } - } else { - const encodedEmail = encodedEmailNodes.dataset.originalString; - let data = { - encodedEmails: JSON.stringify({0: encodedEmail}), - }; - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - encodedEmailNodes.appendChild(apbctTooltip); - - apbct_admin_sendAJAX( - { - 'action': 'apbct_decode_email', - 'encodedEmails': data.encodedEmails, - }, - { - 'callback': function(result) { - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); - }, - 'notJson': true, - }, - ); - } -} - -/** - * @param {mixed} result - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { - if (result.success && result.data[0].is_allowed === true) { - // start process of visual decoding - setTimeout(function() { - // popup remove - let popup = document.getElementById('apbct_popup'); - if (popup !== null) { - let email = ''; - if (clickSource) { - let currentResultData; - result.data.forEach((row) => { - if (row.encoded_email === clickSource.dataset.originalString) { - currentResultData = row; - } - }); - - email = currentResultData.decoded_email.split(/[&?]/)[0]; - } else { - email = result.data[0].decoded_email; - } - // handle first node - let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); - // get email selectable by click - let selectableEmail = document.createElement('b'); - selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); - selectableEmail.innerText = email; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { - selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; - } else { - selectableEmail.title = ctAdminCommon.text__ee_click_to_select; - } - // add email to the first node - if (firstNode) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { - firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } else { - firstNode.innerHTML = ctAdminCommon.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } - - firstNode.setAttribute('style', 'flex-direction: row;'); - } - // remove animation - let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); - if (wrapper) { - wrapper.remove(); - } - // remove second node - let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); - if (secondNode) { - secondNode.remove(); - } - // add button - let buttonWrapper = document.createElement('span'); - buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; - if (!document.querySelector('.apbct-email-encoder-got-it-button')) { - let button = document.createElement('button'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { - button.innerText = ctPublicFunctions.text__ee_got_it; - } else { - button.innerText = ctAdminCommon.text__ee_got_it; - } - button.classList = 'apbct-email-encoder-got-it-button'; - button.addEventListener('click', function() { - document.body.classList.remove('apbct-popup-fade'); - popup.setAttribute('style', 'display:none'); - fillDecodedNodes(encodedEmailNodes, result); - // click on mailto if so - if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { - clickSource.click(); - } - }); - buttonWrapper.append(button); - popup.append(buttonWrapper); - } - } - }, 3000); - } else { - if (clickSource) { - if (result.success) { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { - ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); - } - } else { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { - ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); - } - } - } else { - console.log('result', result); - } - } -} - -/** - * Reset click event for encoded email - */ -function resetEncodedNodes() { - if (typeof ctPublic.encodedEmailNodes !== 'undefined') { - ctPublic.encodedEmailNodes.forEach(function(element) { - element.addEventListener('click', ctFillDecodedEmailHandler); - }); - } -} - -/** - * Show Decode Comment - * @param {string} comment - */ -function ctShowDecodeComment(comment) { - if ( ! comment ) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { - comment = ctPublicFunctions.text__ee_cannot_decode; - } else { - comment = ctAdminCommon.text__ee_cannot_decode; - } - } - - let popup = document.getElementById('apbct_popup'); - let popupText = document.getElementById('apbct_popup_text'); - if (popup !== null) { - document.body.classList.remove('apbct-popup-fade'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { - popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; - } else { - popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; - } - setTimeout(function() { - popup.setAttribute('style', 'display:none'); - }, 3000); - } -} - -/** - * Run filling for every node with decoding result. - * @param {mixed} encodedNodes - * @param {mixed} decodingResult - */ -function fillDecodedNodes(encodedNodes, decodingResult) { - if (encodedNodes.length > 0) { - for (let i = 0; i < encodedNodes.length; i++) { - // chek what is what - let currentResultData; - decodingResult.data.forEach((row) => { - if (row.encoded_email === encodedNodes[i].dataset.originalString) { - currentResultData = row; - } - }); - // quit case on cloud block - if (currentResultData.is_allowed === false) { - return; - } - // handler for mailto - if ( - typeof encodedNodes[i].href !== 'undefined' && - ( - encodedNodes[i].href.indexOf('mailto:') === 0 || - encodedNodes[i].href.indexOf('tel:') === 0 - ) - ) { - let linkTypePrefix; - if (encodedNodes[i].href.indexOf('mailto:') === 0) { - linkTypePrefix = 'mailto:'; - } else if (encodedNodes[i].href.indexOf('tel:') === 0) { - linkTypePrefix = 'tel:'; - } else { - continue; - } - let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); - let baseElementContent = encodedNodes[i].innerHTML; - encodedNodes[i].innerHTML = baseElementContent.replace( - encodedEmail, - currentResultData.decoded_email, - ); - encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; - - encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { - let encodedEmailTextInsideMailto = ''; - decodingResult.data.forEach((row) => { - if (row.encoded_email === el.dataset.originalString) { - encodedEmailTextInsideMailto = row.decoded_email; - } - }); - el.innerHTML = encodedEmailTextInsideMailto; - }); - } else { - encodedNodes[i].classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); - }, 2000); - } - // remove listeners - encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); - } - } else { - let currentResultData = decodingResult.data[0]; - encodedNodes.classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes); - }, 2000); - encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); - } -} - -/** - * @param {mixed} response - * @param {mixed} targetElement - */ -function ctProcessDecodedDataResult(response, targetElement) { - targetElement.setAttribute('title', ''); - targetElement.removeAttribute('style'); - ctFillDecodedEmail(targetElement, response.decoded_email); -} - -/** - * @param {mixed} target - * @param {string} email - */ -function ctFillDecodedEmail(target, email) { - target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); -} diff --git a/js/src/apbct-public-bundle_comm-func.js b/js/src/apbct-public-bundle_comm-func.js new file mode 100644 index 000000000..763eae30a --- /dev/null +++ b/js/src/apbct-public-bundle_comm-func.js @@ -0,0 +1,4693 @@ +/** + * @return {HTMLElement} event + */ +function apbctSetEmailDecoderPopupAnimation() { + const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; + const animationWrapper = document.createElement('div'); + animationWrapper.classList = 'apbct-ee-animation-wrapper'; + for (let i = 0; i < animationElements.length; i++) { + const apbctEEAnimationDogOne = document.createElement('span'); + apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; + apbctEEAnimationDogOne.innerText = '@'; + animationWrapper.append(apbctEEAnimationDogOne); + } + return animationWrapper; +} + +/** + * @param {mixed} event + */ +function ctFillDecodedEmailHandler(event = false) { + let clickSource = false; + let ctWlBrandname = ''; + let encodedEmail = ''; + if (typeof ctPublic !== 'undefined') { + this.removeEventListener('click', ctFillDecodedEmailHandler); + // remember clickSource + clickSource = this; + // globally remember if emails is mixed with mailto + ctPublic.encodedEmailNodesIsMixed = false; + ctWlBrandname = ctPublic.wl_brandname; + encodedEmail = ctPublic.encodedEmailNodes; + } else if (typeof ctAdminCommon !== 'undefined') { + ctWlBrandname = ctAdminCommon.plugin_name; + encodedEmail = ctAdminCommon.encodedEmailNode; + } + + // get fade + document.body.classList.add('apbct-popup-fade'); + // popup show + let encoderPopup = document.getElementById('apbct_popup'); + if (!encoderPopup) { + // construct popup + let waitingPopup = document.createElement('div'); + waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); + waitingPopup.setAttribute('id', 'apbct_popup'); + + // construct text header + let popupHeaderWrapper = document.createElement('span'); + popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; + let popupHeader = document.createElement('p'); + popupHeader.innerText = ctWlBrandname; + popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); + popupHeaderWrapper.append(popupHeader); + + // construct text wrapper + let popupTextWrapper = document.createElement('div'); + popupTextWrapper.setAttribute('id', 'apbct_popup_text'); + popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); + popupTextWrapper.style.color = 'black'; + + // construct text first node + // todo make translatable + let popupTextWaiting = document.createElement('p'); + popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; + } + popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); + + // construct text second node + // todo make translatable + let popupTextDecoding = document.createElement('p'); + popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { + popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; + } else { + popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; + } + + // appending + popupTextWrapper.append(popupTextWaiting); + popupTextWrapper.append(popupTextDecoding); + waitingPopup.append(popupHeaderWrapper); + waitingPopup.append(popupTextWrapper); + waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); + document.body.append(waitingPopup); + } else { + encoderPopup.setAttribute('style', 'display: inherit'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; + } + } + + apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); +} + +/** + * @param {mixed} event + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { + if (event && clickSource) { + // collect data + const javascriptClientData = getJavascriptClientData(); + let data = { + event_javascript_data: javascriptClientData, + post_url: document.location.href, + referrer: document.referrer, + encodedEmails: '', + }; + let encodedEmailsCollection = {}; + for (let i = 0; i < encodedEmailNodes.length; i++) { + // disable click for mailto + if ( + typeof encodedEmailNodes[i].href !== 'undefined' && + encodedEmailNodes[i].href.indexOf('mailto:') === 0 + ) { + event.preventDefault(); + ctPublic.encodedEmailNodesIsMixed = true; + } + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + apbct(encodedEmailNodes[i]).append(apbctTooltip); + + // collect encoded email strings + encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; + } + + // JSONify encoded email strings + data.encodedEmails = JSON.stringify(encodedEmailsCollection); + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_decode_email', + { + data: data, + method: 'POST', + callback: function(result) { + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + + // Using AJAX request and handler + } else { + data.action = 'apbct_decode_email'; + apbct_public_sendAJAX( + data, + { + notJson: false, + callback: function(result) { + console.log('result'); + console.log(result); + + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + } + } else { + const encodedEmail = encodedEmailNodes.dataset.originalString; + let data = { + encodedEmails: JSON.stringify({0: encodedEmail}), + }; + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + encodedEmailNodes.appendChild(apbctTooltip); + + apbct_admin_sendAJAX( + { + 'action': 'apbct_decode_email', + 'encodedEmails': data.encodedEmails, + }, + { + 'callback': function(result) { + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); + }, + 'notJson': true, + }, + ); + } +} + +/** + * @param {mixed} result + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { + if (result.success && result.data[0].is_allowed === true) { + // start process of visual decoding + setTimeout(function() { + // popup remove + let popup = document.getElementById('apbct_popup'); + if (popup !== null) { + let email = ''; + if (clickSource) { + let currentResultData; + result.data.forEach((row) => { + if (row.encoded_email === clickSource.dataset.originalString) { + currentResultData = row; + } + }); + + email = currentResultData.decoded_email.split(/[&?]/)[0]; + } else { + email = result.data[0].decoded_email; + } + // handle first node + let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); + // get email selectable by click + let selectableEmail = document.createElement('b'); + selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); + selectableEmail.innerText = email; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { + selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; + } else { + selectableEmail.title = ctAdminCommon.text__ee_click_to_select; + } + // add email to the first node + if (firstNode) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { + firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } else { + firstNode.innerHTML = ctAdminCommon.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } + + firstNode.setAttribute('style', 'flex-direction: row;'); + } + // remove animation + let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); + if (wrapper) { + wrapper.remove(); + } + // remove second node + let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); + if (secondNode) { + secondNode.remove(); + } + // add button + let buttonWrapper = document.createElement('span'); + buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; + if (!document.querySelector('.apbct-email-encoder-got-it-button')) { + let button = document.createElement('button'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { + button.innerText = ctPublicFunctions.text__ee_got_it; + } else { + button.innerText = ctAdminCommon.text__ee_got_it; + } + button.classList = 'apbct-email-encoder-got-it-button'; + button.addEventListener('click', function() { + document.body.classList.remove('apbct-popup-fade'); + popup.setAttribute('style', 'display:none'); + fillDecodedNodes(encodedEmailNodes, result); + // click on mailto if so + if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { + clickSource.click(); + } + }); + buttonWrapper.append(button); + popup.append(buttonWrapper); + } + } + }, 3000); + } else { + if (clickSource) { + if (result.success) { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { + ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); + } + } else { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { + ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); + } + } + } else { + console.log('result', result); + } + } +} + +/** + * Reset click event for encoded email + */ +function resetEncodedNodes() { + if (typeof ctPublic.encodedEmailNodes !== 'undefined') { + ctPublic.encodedEmailNodes.forEach(function(element) { + element.addEventListener('click', ctFillDecodedEmailHandler); + }); + } +} + +/** + * Show Decode Comment + * @param {string} comment + */ +function ctShowDecodeComment(comment) { + if ( ! comment ) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { + comment = ctPublicFunctions.text__ee_cannot_decode; + } else { + comment = ctAdminCommon.text__ee_cannot_decode; + } + } + + let popup = document.getElementById('apbct_popup'); + let popupText = document.getElementById('apbct_popup_text'); + if (popup !== null) { + document.body.classList.remove('apbct-popup-fade'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { + popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; + } else { + popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; + } + setTimeout(function() { + popup.setAttribute('style', 'display:none'); + }, 3000); + } +} + +/** + * Run filling for every node with decoding result. + * @param {mixed} encodedNodes + * @param {mixed} decodingResult + */ +function fillDecodedNodes(encodedNodes, decodingResult) { + if (encodedNodes.length > 0) { + for (let i = 0; i < encodedNodes.length; i++) { + // chek what is what + let currentResultData; + decodingResult.data.forEach((row) => { + if (row.encoded_email === encodedNodes[i].dataset.originalString) { + currentResultData = row; + } + }); + // quit case on cloud block + if (currentResultData.is_allowed === false) { + return; + } + // handler for mailto + if ( + typeof encodedNodes[i].href !== 'undefined' && + ( + encodedNodes[i].href.indexOf('mailto:') === 0 || + encodedNodes[i].href.indexOf('tel:') === 0 + ) + ) { + let linkTypePrefix; + if (encodedNodes[i].href.indexOf('mailto:') === 0) { + linkTypePrefix = 'mailto:'; + } else if (encodedNodes[i].href.indexOf('tel:') === 0) { + linkTypePrefix = 'tel:'; + } else { + continue; + } + let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); + let baseElementContent = encodedNodes[i].innerHTML; + encodedNodes[i].innerHTML = baseElementContent.replace( + encodedEmail, + currentResultData.decoded_email, + ); + encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; + + encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { + let encodedEmailTextInsideMailto = ''; + decodingResult.data.forEach((row) => { + if (row.encoded_email === el.dataset.originalString) { + encodedEmailTextInsideMailto = row.decoded_email; + } + }); + el.innerHTML = encodedEmailTextInsideMailto; + }); + } else { + encodedNodes[i].classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); + }, 2000); + } + // remove listeners + encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); + } + } else { + let currentResultData = decodingResult.data[0]; + encodedNodes.classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes); + }, 2000); + encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); + } +} + +/** + * @param {mixed} response + * @param {mixed} targetElement + */ +function ctProcessDecodedDataResult(response, targetElement) { + targetElement.setAttribute('title', ''); + targetElement.removeAttribute('style'); + ctFillDecodedEmail(targetElement, response.decoded_email); +} + +/** + * @param {mixed} target + * @param {string} email + */ +function ctFillDecodedEmail(target, email) { + target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); +} + +/** + * Base class + */ +class ApbctCore { + ajax_parameters = {}; + restParameters = {}; + + selector = null; + elements = []; + + // Event properties + eventCallback; + eventSelector; + event; + + /** + * Default constructor + * @param {string} selector + */ + constructor(selector) { + this.select(selector); + } + + /** + * Get elements by CSS selector + * + * @param {string} selector + * @return {*} + */ + select(selector) { + if (selector instanceof HTMLCollection) { + this.selector = null; + this.elements = []; + this.elements = Array.prototype.slice.call(selector); + } else if ( typeof selector === 'object' ) { + this.selector = null; + this.elements = []; + this.elements[0] = selector; + } else if ( typeof selector === 'string' ) { + this.selector = selector; + this.elements = Array.prototype.slice.call(document.querySelectorAll(selector)); + // this.elements = document.querySelectorAll(selector)[0]; + } else { + this.deselect(); + } + + return this; + } + + /** + * @param {object|string} elemToAdd + */ + addElement(elemToAdd) { + if ( typeof elemToAdd === 'object' ) { + this.elements.push(elemToAdd); + } else if ( typeof elemToAdd === 'string' ) { + this.selector = elemToAdd; + this.elements = Array.prototype.slice.call(document.querySelectorAll(elemToAdd)); + } else { + this.deselect(); + } + } + + /** + * @param {object} elem + */ + push(elem) { + this.elements.push(elem); + } + + /** + * reduce + */ + reduce() { + this.elements = this.elements.slice(0, -1); + } + + /** + * deselect + */ + deselect() { + this.elements = []; + } + + /** + * Set or get CSS for/of currently selected element + * + * @param {object|string} style + * @param {boolean} getRaw + * + * @return {boolean|*} + */ + css(style, getRaw) { + getRaw = getRaw || false; + + // Set style + if (typeof style === 'object') { + const stringToCamelCase = (str) => + str.replace(/([-_][a-z])/g, (group) => + group + .toUpperCase() + .replace('-', '') + .replace('_', ''), + ); + + // Apply multiple styles + for (const styleName in style) { + if (Object.hasOwn(style, styleName)) { + const DomStyleName = stringToCamelCase(styleName); + + // Apply to multiple elements (currently selected) + for (let i=0; i= 0; i-- ) { + if ( ! this.isElem(this.elements[i], filter) ) { + this.elements.splice(Number(i), 1); + } + } + + return this; + } + + /** + * NODES + */ + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parent(filter) { + this.select(this.elements[0].parentElement); + + if ( typeof filter !== 'undefined' && ! this.is(filter) ) { + this.deselect(); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parents(filter) { + this.select(this.elements[0]); + + for ( ; this.elements[this.elements.length - 1].parentElement !== null; ) { + this.push(this.elements[this.elements.length - 1].parentElement); + } + + this.elements.splice(0, 1); // Deleting initial element from the set + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + children(filter) { + this.select(this.elements[0].children); + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + siblings(filter) { + let current = this.elements[0]; // Remember current to delete it later + + this.parent(); + this.children(filter); + this.elements.splice(this.elements.indexOf(current), 1); // Remove current element + + return this; + } + + /** ************ DOM MANIPULATIONS **************/ + remove() { + for (let elem of this.elements) { + elem.remove(); + } + } + + /** + * @param {string} content + */ + after(content) { + for (let elem of this.elements) { + elem.after(content); + } + } + + /** + * @param {string} content + */ + append(content) { + for (let elem of this.elements) { + elem.append(content); + } + } + + /** ************ ANIMATION **************/ + /** + * @param {number} time + */ + fadeIn(time) { + for (let elem of this.elements) { + elem.style.opacity = 0; + elem.style.display = 'block'; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity + (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity < 1) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } + }; + + tick(); + } + } + + /** + * @param {number} time + */ + fadeOut(time) { + for (let elem of this.elements) { + elem.style.opacity = 1; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity > 0) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } else { + elem.style.display = 'none'; + } + }; + + tick(); + } + } +} + +/** + * Hack + * + * Make a proxy to keep both properties and methods from: + * - the native object and + * - the new one from ApbctCore for selected element. + * + * For example: + * apbct('#id).innerHTML = 'some'; + * apbct('#id).css({'backgorund-color': 'black'}); + */ +// apbct = new Proxy( +// apbct, +// { +// get(target, prop) { +// if (target.elements.length) { +// return target.elements[0][prop]; +// } else { +// return null; +// } +// }, +// set(target, prop, value){ +// if (target.elements.length) { +// target.elements[0][prop] = value; +// return true; +// } else { +// return false; +// } +// }, +// apply(target, thisArg, argArray) { +// +// } +// } +// ); + +/** + * @param {mixed} msg + * @param {string} url + */ +function ctProcessError(msg, url) { + let log = {}; + if (msg && msg.message) { + log.err = { + 'msg': msg.message, + 'file': !!msg.fileName ? msg.fileName : false, + 'ln': !!msg.lineNumber ? msg.lineNumber : !!lineNo ? lineNo : false, + 'col': !!msg.columnNumber ? msg.columnNumber : !!columnNo ? columnNo : false, + 'stacktrace': !!msg.stack ? msg.stack : false, + 'cause': !!url ? JSON.stringify(url) : false, + 'errorObj': !!error ? error : false, + }; + } else { + log.err = { + 'msg': msg, + }; + + if (!!url) { + log.err.file = url; + } + } + + log.url = window.location.href; + log.userAgent = window.navigator.userAgent; + + let ctJsErrors = 'ct_js_errors'; + let errArray = localStorage.getItem(ctJsErrors); + if (errArray === null) errArray = '[]'; + errArray = JSON.parse(errArray); + for (let i = 0; i < errArray.length; i++) { + if (errArray[i].err.msg === log.err.msg) { + return; + } + } + + errArray.push(log); + localStorage.setItem(ctJsErrors, JSON.stringify(errArray)); +} + +if (Math.floor(Math.random() * 100) === 1) { + window.onerror = function(exception, url) { + let filterWords = ['apbct', 'ctPublic']; + let length = filterWords.length; + while (length--) { + if (exception.indexOf(filterWords[length]) !== -1) { + ctProcessError(exception, url); + } + } + + return false; + }; +} + +/** + * Select actual WP nonce depending on the ajax type and the fresh nonce provided. + * @return {string} url + */ +function selectActualNonce() { + let defaultNonce = ''; + // return fresh nonce immediately if persists + if ( + ctPublicFunctions.hasOwnProperty('_fresh_nonce') && + typeof ctPublicFunctions._fresh_nonce === 'string' && + ctPublicFunctions._fresh_nonce.length > 0 + ) { + return ctPublicFunctions._fresh_nonce; + } + // select from default rest/ajax nonces + if ( + ctPublicFunctions.data__ajax_type === 'admin_ajax' && + ctPublicFunctions.hasOwnProperty('_ajax_nonce') && + typeof ctPublicFunctions._ajax_nonce === 'string' && + ctPublicFunctions._ajax_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._ajax_nonce; + } + if ( + ctPublicFunctions.data__ajax_type === 'rest' && + ctPublicFunctions.hasOwnProperty('_rest_nonce') && + typeof ctPublicFunctions._rest_nonce === 'string' && + ctPublicFunctions._rest_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._rest_nonce; + } + + return defaultNonce; +} + +/** + * Enter point to ApbctCore class + * + * @param {array|object} params + * @return {*} + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +function apbct(params) { + return new ApbctCore() + .select(params); +} + +/** + * ApbctXhr + */ +class ApbctXhr { + xhr = new XMLHttpRequest(); + + // Base parameters + method = 'POST'; // HTTP-request type + url = ''; // URL to send the request + async = true; + user = null; // HTTP-authorization username + password = null; // HTTP-authorization password + data = {}; // Data to send + + // Optional params + button = null; // Button that should be disabled when request is performing + spinner = null; // Spinner that should appear when request is in process + progressbar = null; // Progress bar for the current request + context = this; // Context + callback = null; + onErrorCallback = null; + + responseType = 'json'; // Expected data type from server + headers = {}; + timeout = 15000; // Request timeout in milliseconds + + methods_to_convert_data_to_URL = [ + 'GET', + 'HEAD', + ]; + + body = null; + http_code = 0; + status_text = ''; + + // eslint-disable-next-line require-jsdoc + constructor(parameters) { + // Set class properties + for ( let key in parameters ) { + if ( typeof this[key] !== 'undefined' ) { + this[key] = parameters[key]; + } + } + + // Modifying DOM-elements + this.prepare(); + + // Modify URL with data for GET and HEAD requests + if ( Object.keys(this.data).length ) { + this.deleteDoubleJSONEncoding(this.data); + this.convertData(); + } + + if ( ! this.url ) { + console.log('%cXHR%c not URL provided', + 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;'); + return false; + } + + // Configure the request + this.xhr.open(this.method, this.url, this.async, this.user, this.password); + this.setHeaders(); + + this.xhr.responseType = this.responseType; + this.xhr.timeout = this.timeout; + + /* EVENTS */ + // Monitoring status + this.xhr.onreadystatechange = function() { + if (this.isWpNonceError()) { + this.getFreshNonceAndRerunXHR(parameters); + return; + } + this.onReadyStateChange(); + }.bind(this); + + // Run callback + this.xhr.onload = function() { + this.onLoad(); + }.bind(this); + + // On progress + this.xhr.onprogress = function(event) { + this.onProgress(event); + }.bind(this); + + // On error + this.xhr.onerror = function() { + this.onError(); + }.bind(this); + + this.xhr.ontimeout = function() { + this.onTimeout(); + }.bind(this); + + // Send the request + this.xhr.send(this.body); + } + + /** + * prepare + */ + prepare() { + // Disable button + if (this.button) { + this.button.setAttribute('disabled', 'disabled'); + this.button.style.cursor = 'not-allowed'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'inline'; + } + } + + /** + * complete + */ + complete() { + this.http_code = this.xhr.status; + this.status_text = this.xhr.statusText; + + // Disable button + if (this.button) { + this.button.removeAttribute('disabled'); + this.button.style.cursor = 'auto'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'none'; + } + + if ( this.progressbar ) { + this.progressbar.fadeOut('slow'); + } + } + + /** + * onReadyStateChange + */ + onReadyStateChange() { + if (this.on_ready_state_change !== null && typeof this.on_ready_state_change === 'function') { + this.on_ready_state_change(); + } + } + + /** + * @param {object} event + */ + onProgress(event) { + if (this.on_progress !== null && typeof this.on_progress === 'function') { + this.on_progress(); + } + } + + /** + * onError + */ + onError() { + console.log('error'); + + this.complete(); + this.error( + this.http_code, + this.status_text, + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * onTimeout + */ + onTimeout() { + this.complete(); + this.error( + 0, + 'timeout', + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback('Timeout'); + } + } + + /** + * @return {boolean} + */ + onLoad() { + this.complete(); + + if (this.responseType === 'json' ) { + if (this.xhr.response === null) { + this.error(this.http_code, this.status_text, 'No response'); + return false; + } else if ( typeof this.xhr.response.error !== 'undefined') { + this.error(this.http_code, this.status_text, this.xhr.response.error); + return false; + } + } + + if (this.callback !== null && typeof this.callback === 'function') { + this.callback.call(this.context, this.xhr.response, this.data); + } + } + + /** + * Check if 403 code of WP nonce error + * @return {bool} + */ + isWpNonceError() { + let restErrror = false; + let ajaxErrror = false; + // check rest error + if (this.xhr.readyState == 4) { + restErrror = ( + typeof this.xhr.response === 'object' && this.xhr.response !== null && + this.xhr.response.hasOwnProperty('data') && + this.xhr.response.data.hasOwnProperty('status') && + this.xhr.response.data.status === 403 + ); + ajaxErrror = this.xhr.response === '-1' && this.xhr.status === 403; + } + // todo check AJAX error + return restErrror || ajaxErrror; + } + + /** + * Get the fresh nonce and rerun the initial XHR with params + * @param {[]} initialRequestParams + */ + getFreshNonceAndRerunXHR(initialRequestParams) { + let noncePrev = ''; + + // Check if initialRequestParams['headers']['X-WP-Nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('headers') && + initialRequestParams.headers.hasOwnProperty('X-WP-Nonce') + ) { + noncePrev = initialRequestParams['headers']['X-WP-Nonce']; + } + + // Check if initialRequestParams['data']['_ajax_nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('data') && + initialRequestParams.data.hasOwnProperty('_ajax_nonce') + ) { + noncePrev = initialRequestParams['data']['_ajax_nonce']; + } + + // Nonce is not provided. Exit. + if ( noncePrev === '' ) { + return; + } + + // prepare params for refreshing nonce + let params = {}; + params.method = 'POST'; + params.data = { + 'spbc_remote_call_action': 'get_fresh_wpnonce', + 'plugin_name': 'antispam', + 'nonce_prev': noncePrev, + 'initial_request_params': initialRequestParams, + }; + params.notJson = true; + params.url = ctPublicFunctions.host_url; + // this callback will rerun the XHR with initial params + params.callback = function(...args) { + // the refresh result itself + let freshNonceResult = args[0]; + let newRequestParams = false; + // provided initial params + if (args[1] !== undefined && args[1].hasOwnProperty('initial_request_params')) { + newRequestParams = args[1].initial_request_params; + } + if (newRequestParams && freshNonceResult.hasOwnProperty('wpnonce')) { + ctPublicFunctions._fresh_nonce = freshNonceResult.wpnonce; + if (ctPublicFunctions.data__ajax_type === 'rest') { + new ApbctCore().rest(newRequestParams); + } else { + new ApbctCore().ajax(newRequestParams); + } + } + }; + // run the nonce refreshing call + new ApbctXhr(params); + } + + /** + * @param {number} httpCode + * @param {string} statusText + * @param {string} additionalMsg + */ + error(httpCode, statusText, additionalMsg) { + let errorString = ''; + + if ( statusText === 'timeout' ) { + errorString += 'Server response timeout'; + } else if ( httpCode === 200 ) { + if ( statusText === 'parsererror' ) { + errorString += 'Unexpected response from server. See console for details.'; + } else { + errorString += 'Unexpected error. Status: ' + statusText + '.'; + if ( typeof additionalMsg !== 'undefined' ) { + errorString += ' Additional error info: ' + additionalMsg; + } + } + } else if (httpCode === 500) { + errorString += 'Internal server error.'; + } else { + errorString += 'Unexpected response code:' + httpCode; + } + + this.errorOutput( errorString ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * @param {string} errorMsg + */ + errorOutput(errorMsg) { + console.log( '%c ctXHR error: %c' + errorMsg, 'color: red;', 'color: grey;' ); + } + + /** + * setHeaders + */ + setHeaders() { + // Set headers if passed + for ( let headerName in this.headers ) { + if ( typeof this.headers[headerName] !== 'undefined' ) { + this.xhr.setRequestHeader(headerName, this.headers[headerName]); + } + } + } + + /** + * @return {string|*} + */ + convertData() { + // GET, HEAD request-type + if ( ~this.methods_to_convert_data_to_URL.indexOf( this.method ) ) { + return this.convertDataToURL(); + + // POST request-type + } else { + return this.convertDataToBody(); + } + } + + /** + * @return {string} + */ + convertDataToURL() { + let paramsAppendix = new URLSearchParams(this.data).toString(); + let paramsPrefix = this.url.match(/^(https?:\/{2})?[a-z0-9.]+\?/) ? '&' : '?'; + this.url += paramsPrefix + paramsAppendix; + + return this.url; + } + + /** + * @return {null} + */ + convertDataToBody() { + this.body = new FormData(); + for (let dataKey in this.data) { + if (Object.hasOwn(this.data, dataKey)) { + this.body.append( + dataKey, + typeof this.data[dataKey] === 'object' ? + JSON.stringify(this.data[dataKey]) : + this.data[dataKey], + ); + } + } + + return this.body; + } + + /** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {object} object + * @return {*} + */ + deleteDoubleJSONEncoding(object) { + if ( typeof object === 'object') { + for (let objectKey in object) { + if (Object.hasOwn(object, objectKey)) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = this.deleteDoubleJSONEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + let parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + } + + return object; + } +} +// eslint-disable-next-line require-jsdoc +class ApbctAjax extends ApbctXhr { + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + args.data._ajax_nonce = selectActualNonce(); + super(args); + } +} +// eslint-disable-next-line require-jsdoc +class ApbctRest extends ApbctXhr { + static default_route = ctPublicFunctions._rest_url + 'cleantalk-antispam/v1/'; + route = ''; + + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + const nonce = selectActualNonce(); + args.url = ApbctRest.default_route + args.route; + args.headers = { + 'X-WP-Nonce': nonce, + }; + super(args); + } +} + +// add hasOwn +if (!Object.prototype.hasOwn) { + Object.defineProperty(Object.prototype, 'hasOwn', { // eslint-disable-line + value: function(property) { + return Object.prototype.hasOwnProperty.call(this, property); + }, + enumerable: false, + configurable: true, + writable: true, + }); +} + +/** + * Class collecting user activity data + * + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +class ApbctCollectingUserActivity { + elementBody = document.querySelector('body'); + collectionForms = document.forms; + /** + * Constructor + */ + constructor() { + this.setListeners(); + } + + /** + * Set listeners + */ + setListeners() { + this.elementBody.addEventListener('click', (event) => { + this.checkElementInForms(event, 'addClicks'); + }); + + this.elementBody.addEventListener('mouseup', (event) => { + const selectedType = document.getSelection().type.toString(); + if (selectedType == 'Range') { + this.addSelected(); + } + }); + + this.elementBody.addEventListener('mousemove', (event) => { + this.checkElementInForms(event, 'trackMouseMovement'); + }); + } + + /** + * Checking if there is an element in the form + * @param {object} event + * @param {string} addTarget + */ + checkElementInForms(event, addTarget) { + let resultCheck; + for (let i = 0; i < this.collectionForms.length; i++) { + if ( + event.target.outerHTML.length > 0 && + this.collectionForms[i].innerHTML.length > 0 + ) { + resultCheck = this.collectionForms[i].innerHTML.indexOf(event.target.outerHTML); + } else { + resultCheck = -1; + } + } + + switch (addTarget) { + case 'addClicks': + if (resultCheck < 0) { + this.addClicks(); + } + break; + case 'trackMouseMovement': + if (resultCheck > -1) { + this.trackMouseMovement(); + } + break; + default: + break; + } + } + + /** + * Add clicks + */ + addClicks() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.clicks) { + document.ctCollectingUserActivityData.clicks++; + } else { + document.ctCollectingUserActivityData.clicks = 1; + } + return; + } + + document.ctCollectingUserActivityData = {clicks: 1}; + } + + /** + * Add selected + */ + addSelected() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.selected) { + document.ctCollectingUserActivityData.selected++; + } else { + document.ctCollectingUserActivityData.selected = 1; + } + return; + } + + document.ctCollectingUserActivityData = {selected: 1}; + } + + /** + * Track mouse movement + */ + trackMouseMovement() { + if (!document.ctCollectingUserActivityData) { + document.ctCollectingUserActivityData = {}; + } + if (!document.ctCollectingUserActivityData.mouseMovementsInsideForm) { + document.ctCollectingUserActivityData.mouseMovementsInsideForm = false; + } + + document.ctCollectingUserActivityData.mouseMovementsInsideForm = true; + } +} + +/** + * @param {object|array|string} cookies + * @param {object|array|string} value + * @param {string|number} expires + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetCookie( cookies, value, expires ) { + let listOfCookieNamesToForceAlt = [ + 'ct_sfw_pass_key', + 'ct_sfw_passed', + 'wordpress_apbct_antibot', + 'apbct_anticrawler_passed', + 'apbct_bot_detector_exist', + 'apbct_antiflood_passed', + 'apbct_email_encoder_passed', + ]; + + let skipAlt = false; + + if ( typeof cookies === 'string') { + skipAlt = cookies === 'ct_pointer_data'; + if ( typeof value === 'string' || typeof value === 'number' ) { + cookies = [[cookies, value, expires]]; + } + } + + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + let forcedAltCookiesSet = []; + cookies.forEach( function(item) { + if (listOfCookieNamesToForceAlt.indexOf(item[0]) !== -1) { + forcedAltCookiesSet.push(item); + } else { + apbctLocalStorage.set(item[0], item[1]); + } + }); + + // if cookies from list found use alt cookies for this selection set + if ( forcedAltCookiesSet.length > 0 ) { + ctSetAlternativeCookie(forcedAltCookiesSet); + } + + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } else { + ctNoCookieAttachHiddenFieldsToForms(); + } + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } + cookies.forEach( function(item) { + const _expires = typeof item[2] !== 'undefined' ? 'expires=' + expires + '; ' : ''; + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = ctPublicFunctions.cookiePrefix + + item[0] + + '=' + + encodeURIComponent(item[1]) + + '; ' + + _expires + + 'path=/; samesite=lax' + + ctSecure; + }); + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' && !skipAlt ) { + ctSetAlternativeCookie(cookies); + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctDetectForcedAltCookiesForms() { + let ninjaFormsSign = document.querySelectorAll('#tmpl-nf-layout').length > 0; + let elementorUltimateAddonsRegister = document.querySelectorAll('.uael-registration-form-wrapper').length > 0; + let smartFormsSign = document.querySelectorAll('script[id*="smart-forms"]').length > 0; + let jetpackCommentsForm = document.querySelectorAll('iframe[name="jetpack_remote_comment"]').length > 0; + let cwginstockForm = document.querySelectorAll('.cwginstock-subscribe-form').length > 0; + let userRegistrationProForm = document.querySelectorAll('div[id^="user-registration-form"]').length > 0; + let etPbDiviSubscriptionForm = document.querySelectorAll('div[class^="et_pb_newsletter_form"]').length > 0; + let fluentBookingApp = document.querySelectorAll('div[class^="fluent_booking_app"]').length > 0; + let bloomPopup = document.querySelectorAll('div[class^="et_bloom_form_container"]').length > 0; + let pafeFormsFormElementor = document.querySelectorAll('div[class*="pafe-form"]').length > 0; + let otterForm = document.querySelectorAll('div [class*="otter-form"]').length > 0; + let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').length > 0; + ctPublic.force_alt_cookies = smartFormsSign || + ninjaFormsSign || + jetpackCommentsForm || + elementorUltimateAddonsRegister || + cwginstockForm || + userRegistrationProForm || + etPbDiviSubscriptionForm || + fluentBookingApp || + pafeFormsFormElementor || + bloomPopup || + otterForm || + smartQuizBuilder; + + setTimeout(function() { + if (!ctPublic.force_alt_cookies) { + let bookingPress = document.querySelectorAll('main[id^="bookingpress_booking_form"]').length > 0; + ctPublic.force_alt_cookies = bookingPress; + } + }, 1000); +} + +// eslint-disable-next-line require-jsdoc +function ctSetAlternativeCookie(cookies, params) { + if (typeof (getJavascriptClientData) === 'function' ) { + // reprocess already gained cookies data + if (Array.isArray(cookies)) { + cookies = getJavascriptClientData(cookies); + } + } else { + console.log('APBCT ERROR: getJavascriptClientData() is not loaded'); + } + + try { + cookies = JSON.parse(cookies); + } catch (e) { + console.log('APBCT ERROR: JSON parse error:' + e); + return; + } + + const callback = params && params.callback || null; + const onErrorCallback = params && params.onErrorCallback || null; + + if ( params && params.forceAltCookies ) { + cookies.apbct_force_alt_cookies = true; + } + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + // fix for url encoded cookie apbct_pixel_url on REST route + if (typeof cookies.apbct_pixel_url === 'string' && + cookies.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); + } + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_alt_session__save__AJAX', + cookies: cookies, + }, + { + notJson: 1, + callback: callback, + onErrorCallback: onErrorCallback, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * Get cookie by name + * @param name + * @return {string|undefined} + */ +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctGetCookie(name) { + let matches = document.cookie.match(new RegExp( + '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)', + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctDeleteCookie(cookieName) { + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + return; + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = cookieName + '=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax' + ctSecure; + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' ) { + // @ToDo implement this logic + } +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendAJAX(data, params, obj) { + // Default params + let _params = []; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['callback_context'] = params.callback_context || null; + _params['callback_params'] = params.callback_params || null; + _params['async'] = params.async || true; + _params['notJson'] = params.notJson || null; + _params['responseType']= params.notJson ? 'text' : 'json'; + _params['timeout'] = params.timeout || 15000; + _params['obj'] = obj || null; + _params['button'] = params.button || null; + _params['spinner'] = params.spinner || null; + _params['progressbar'] = params.progressbar || null; + _params['silent'] = params.silent || null; + _params['no_nonce'] = params.no_nonce || null; + _params['data'] = data; + _params['url'] = ctPublicFunctions._ajax_url; + const nonce = selectActualNonce(); + + if (typeof (data) === 'string') { + if ( ! _params['no_nonce'] ) { + _params['data'] = _params['data'] + '&_ajax_nonce=' + nonce; + } + _params['data'] = _params['data'] + '&no_cache=' + Math.random(); + } else { + if ( ! _params['no_nonce'] ) { + _params['data']._ajax_nonce = nonce; + } + _params['data'].no_cache = Math.random(); + } + + new ApbctCore().ajax(_params); +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendREST( route, params ) { + let _params = []; + _params['route'] = route; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['data'] = params.data || []; + _params['method'] = params.method || 'POST'; + + new ApbctCore().rest(_params); +} + +/** + * Generate unique ID + * @return {string} + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function apbctGenerateUniqueID() { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10); +} + +let apbctLocalStorage = { + get: function(key, property) { + if ( typeof property === 'undefined' ) { + property = 'value'; + } + const storageValue = localStorage.getItem(key); + if ( storageValue !== null ) { + try { + const json = JSON.parse(storageValue); + if ( json.hasOwnProperty(property) ) { + try { + // if property can be parsed as JSON - do it + return JSON.parse( json[property] ); + } catch (e) { + // if not - return string of value + return json[property].toString(); + } + } else { + return json; + } + } catch (e) { + return storageValue; + } + } + return false; + }, + set: function(key, value, isJson = true) { + if (isJson) { + let objToSave = {'value': JSON.stringify(value), 'timestamp': Math.floor(new Date().getTime() / 1000)}; + localStorage.setItem(key, JSON.stringify(objToSave)); + } else { + localStorage.setItem(key, value); + } + }, + isAlive: function(key, maxLifetime) { + if ( typeof maxLifetime === 'undefined' ) { + maxLifetime = 86400; + } + const keyTimestamp = this.get(key, 'timestamp'); + return keyTimestamp + maxLifetime > Math.floor(new Date().getTime() / 1000); + }, + isSet: function(key) { + return localStorage.getItem(key) !== null; + }, + delete: function(key) { + localStorage.removeItem(key); + }, + getCleanTalkData: function() { + let data = {}; + for (let i=0; i this.checkBotCallback(result), + }); + } else if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + data.action = 'apbct_force_protection_check_bot'; + apbct_public_sendAJAX(data, {callback: (result) => this.checkBotCallback(result)}); + } + } + + /** + * Check bot callback + * @param {Object} result + * @return {void} + */ + checkBotCallback(result) { + // if error occurred + if (result.data && result.data.status && result.data.status !== 200) { + console.log('ApbctForceProtection connection error occurred'); + this.decodeForms(); + return; + } + + if (typeof result === 'string') { + try { + result = JSON.parse(result); + } catch (e) { + console.log('ApbctForceProtection decodeForms error', e); + this.decodeForms(); + return; + } + } + + if (typeof result === 'object' && result.allow && result.allow === 1) { + this.decodeForms(); + document.dispatchEvent(new Event('apbctForceProtectionAllowed')); + } else { + this.showMessageForBot(result.message); + } + } + + /** + * Decode forms + * @return {void} + */ + decodeForms() { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + + try { + if (form && typeof(form) == 'string') { + wrapper.outerHTML = atob(form); + } + } catch (error) { + console.log(error); + } + }); + } + + /** + * Show message for bot + * @param {string} message + * @return {void} + */ + showMessageForBot(message) { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + if (form) { + wrapper.outerHTML = '
' + message + '
'; + } + }); + } +} + +/** + * Force protection + */ +function apbctForceProtect() { + if (ctPublic.settings__forms__force_protection && typeof ApbctForceProtection !== 'undefined') { + new ApbctForceProtection(); + } +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbctForceProtect(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbctForceProtect); + } +} + +/** + * Class for gathering data about user typing. + * + * ============================== + * isAutoFill - only person can use auto fill + * isUseBuffer - use buffer for fill current field + * ============================== + * lastKeyTimestamp - timestamp of last key press in current field + * speedDelta - change for each key press in current field, + * as difference between current and previous key press timestamps, + * robots in general have constant speed of typing. + * If speedDelta is constant for each key press in current field, + * so, speedDelta will be roughly to 0, then it is robot. + * ============================== + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +class CTTypoData { + fieldData = { + isAutoFill: false, + isUseBuffer: false, + speedDelta: 0, + firstKeyTimestamp: 0, + lastKeyTimestamp: 0, + lastDelta: 0, + countOfKey: 0, + }; + + fields = document.querySelectorAll('textarea[name=comment]'); + + data = []; + + /** + * Gather fields. + */ + gatheringFields() { + let fieldSet = Array.prototype.slice.call(this.fields); + fieldSet.forEach((field, i) => { + this.data.push(Object.assign({}, this.fieldData)); + }); + } + + /** + * Set listeners. + */ + setListeners() { + this.fields.forEach((field, i) => { + field.addEventListener('paste', () => { + this.data[i].isUseBuffer = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('onautocomplete', () => { + this.data[i].isAutoFill = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('input', () => { + this.data[i].countOfKey++; + let time = + new Date(); + let currentDelta = 0; + + if (this.data[i].countOfKey === 1) { + this.data[i].lastKeyTimestamp = time; + this.data[i].firstKeyTimestamp = time; + return; + } + + currentDelta = time - this.data[i].lastKeyTimestamp; + if (this.data[i].countOfKey === 2) { + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + return; + } + + if (this.data[i].countOfKey > 2) { + this.data[i].speedDelta += Math.abs(this.data[i].lastDelta - currentDelta); + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + } + }); + }); + } +} + +// eslint-disable-next-line camelcase +const ctDate = new Date(); +const ctTimeMs = new Date().getTime(); +let ctMouseEventTimerFlag = true; // Reading interval flag +let ctMouseData = []; +let ctMouseDataCounter = 0; +let ctCheckedEmails = {}; +let ctCheckedEmailsExist = {}; +let ctMouseReadInterval; +let ctMouseWriteDataInterval; +let tokenCheckerIntervalId; +let botDetectorLogLastUpdate = 0; +let botDetectorLogEventTypesCollected = []; + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_attach_event_handler(elem, event, callback) { + if (typeof window.addEventListener === 'function') elem.addEventListener(event, callback); + else elem.attachEvent(event, callback); +} +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_remove_event_handler(elem, event, callback) { + if (typeof window.removeEventListener === 'function') elem.removeEventListener(event, callback); + else elem.detachEvent(event, callback); +} + +// Writing first key press timestamp +const ctFunctionFirstKey = function output(event) { + let KeyTimestamp = Math.floor(new Date().getTime() / 1000); + ctSetCookie('ct_fkp_timestamp', KeyTimestamp); + ctKeyStopStopListening(); +}; + +/** + * Run cron jobs + */ +// forms handler cron +cronFormsHandler(2000); + +// bot_detector frontend_data log alt session saving cron +if ( + ctPublicFunctions.hasOwnProperty('data__bot_detector_enabled') && + ctPublicFunctions.data__bot_detector_enabled == 1 && + ctPublicFunctions.hasOwnProperty('data__frontend_data_log_enabled') && + ctPublicFunctions.data__frontend_data_log_enabled == 1 +) { + sendBotDetectorLogToAltSessions(1000); +} +/** + * Cron jobs end. + */ + +// mouse read +if (ctPublic.data__key_is_ok) { + // Reading interval + ctMouseReadInterval = setInterval(function() { + ctMouseEventTimerFlag = true; + }, 150); + + // Writting interval + ctMouseWriteDataInterval = setInterval(function() { + ctSetCookie('ct_pointer_data', JSON.stringify(ctMouseData)); + }, 1200); +} + +// Logging mouse position each 150 ms +const ctFunctionMouseMove = function output(event) { + ctSetMouseMoved(); + if (ctMouseEventTimerFlag === true) { + ctMouseData.push([ + Math.round(event.clientY), + Math.round(event.clientX), + Math.round(new Date().getTime() - ctTimeMs), + ]); + + ctMouseDataCounter++; + ctMouseEventTimerFlag = false; + if (ctMouseDataCounter >= 50) { + ctMouseStopData(); + } + } +}; + +/** + * Do handle periodical actions. + * @param {int} cronStartTimeout Time to go before cron start. + */ +function cronFormsHandler(cronStartTimeout = 2000) { + setTimeout(function() { + setInterval(function() { + restartFieldsListening(); + restartBotDetectorEventTokenAttach(); + }, 2000); + }, cronStartTimeout); +} + +/** + * Send BotDetector logs data to alternative sessions. + * If log_last_update has changed and log contains new event types, the log will be sent to the alternative sessions. + * @param {int} cronStartTimeout delay before cron start + * @param {int} interval check fires on interval + */ +function sendBotDetectorLogToAltSessions(cronStartTimeout = 3000, interval = 1000) { + setTimeout(function() { + setInterval(function() { + const currentLog = apbctLocalStorage.get('ct_bot_detector_frontend_data_log'); + if (needsSaveLogToAltSessions(currentLog)) { + botDetectorLogLastUpdate = currentLog.log_last_update; + // the log will be taken from javascriptclientdata + ctSetAlternativeCookie([], {forceAltCookies: true}); + } + }, interval); + }, cronStartTimeout); +} + +/** + * Check if the log needs to be saved to the alt sessions. If the log has new event types, it will be saved. + * @param {object} currentLog + * @return {boolean} + */ +function needsSaveLogToAltSessions(currentLog) { + if ( + currentLog && currentLog.hasOwnProperty('log_last_update') && + botDetectorLogLastUpdate !== currentLog.log_last_update + ) { + try { + for (let i = 0; i < currentLog.records.length; i++) { + const currentType = currentLog.records[i].frontend_data.js_event; + // check if this event type was already collected + if (currentType !== undefined && botDetectorLogEventTypesCollected.includes(currentType)) { + continue; + } + // add new event type to collection, this type will be sent to the alt sessions further + botDetectorLogEventTypesCollected.push(currentType); + return true; + } + } catch (e) { + console.log('APBCT: bot detector log collection error: ' . e.toString()); + } + } + return false; +} + +/** + * Restart event_token attachment if some forms load after document ready. + */ +function restartBotDetectorEventTokenAttach() { + // List there any new conditions, right now it works only for LatePoint forms. + // Probably, we can remove this condition at all, because setEventTokenField() + // checks all the forms without the field + const doAttach = ( + document.getElementsByClassName('latepoint-form').length > 0 || + document.getElementsByClassName('mec-booking-form-container').length > 0 || + document.getElementById('login-form-popup') !== null + ); + + try { + if ( doAttach ) { + // get token from LS + const token = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof setEventTokenField === 'function' && token !== undefined && token.length === 64) { + setEventTokenField(token); + } + // probably there we could use a new botDetectorInit if token is not found + } + } catch (e) { + console.log(e.toString()); + } +} + +/** + * Stop mouse observing function + */ +function ctMouseStopData() { + apbct_remove_event_handler(document, 'mousemove', ctFunctionMouseMove); + clearInterval(ctMouseReadInterval); + clearInterval(ctMouseWriteDataInterval); +} + +/** + * Stop key listening function + */ +function ctKeyStopStopListening() { + apbct_remove_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_remove_event_handler(document, 'keydown', ctFunctionFirstKey); +} + +/** + * @param {mixed} e + */ +function checkEmail(e) { + let currentEmail = e.target.value; + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail && !(currentEmail in ctCheckedEmails)) { + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'check_email_before_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_before_post', + email: currentEmail, + }, + { + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + } + } +} + +/** + * @param {mixed} e + */ +function checkEmailExist(e) { + let currentEmail = e.target.value; + let result; + + if (!currentEmail || !currentEmail.length) { + let envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.remove(); + } + let hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.remove(); + } + return; + } + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail in ctCheckedEmailsExist) { + result = ctCheckedEmailsExist[currentEmail]; + getResultCheckEmailExist(e, result, currentEmail); + + return; + } + + viewCheckEmailExist(e, 'load'); + + // Using REST API handler + ctPublicFunctions.data__ajax_type = 'rest'; + if (ctPublicFunctions.data__ajax_type === 'rest') { + apbct_public_sendREST( + 'check_email_exist_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + + return; + } + + if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_exist_post', + email: currentEmail, + }, + { + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + } +} + +/** + * @param {mixed} e + * @param {mixed} result + * @param {string} currentEmail + */ +function getResultCheckEmailExist(e, result, currentEmail) { + if (!result || !result.result) { + return; + } + + result = result.result; + + ctCheckedEmailsExist[currentEmail] = { + 'result': result, + 'timestamp': Date.now() / 1000 |0, + }; + + if (result.result == 'EXISTS') { + viewCheckEmailExist(e, 'good_email', result.text_result); + } else { + viewCheckEmailExist(e, 'bad_email', result.text_result); + } + + ctSetCookie('ct_checked_emails_exist', JSON.stringify(ctCheckedEmailsExist)); +} + +/** + * @param {mixed} e + * @param {string} state + * @param {string} textResult + */ +function viewCheckEmailExist(e, state, textResult) { + let parentElement = e.target.parentElement; + let inputEmail = parentElement.querySelector('[name*="email"]'); + + if (!inputEmail) { + return; + } + + let envelope; + let hint; + + // envelope + if (document.getElementById('apbct-check_email_exist-block')) { + envelope = document.getElementById('apbct-check_email_exist-block'); + } else { + envelope = document.createElement('div'); + envelope.setAttribute('class', 'apbct-check_email_exist-block'); + envelope.setAttribute('id', 'apbct-check_email_exist-block'); + window.addEventListener('scroll', function() { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + }); + parentElement.after(envelope); + } + + // hint + if (document.getElementById('apbct-check_email_exist-popup_description')) { + hint = document.getElementById('apbct-check_email_exist-popup_description'); + } else { + hint = document.createElement('div'); + hint.setAttribute('class', 'apbct-check_email_exist-popup_description'); + hint.setAttribute('id', 'apbct-check_email_exist-popup_description'); + window.addEventListener('scroll', function() { + hint.style.top = envelope.getBoundingClientRect().top + 'px'; + }); + + envelope.after(hint); + } + + ctEmailExistSetElementsPositions(); + + window.addEventListener('resize', function(event) { + ctEmailExistSetElementsPositions(); + }); + + switch (state) { + case 'load': + envelope.classList.remove('apbct-check_email_exist-good_email', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-load'); + break; + + case 'good_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-good_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#1C7129'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + case 'bad_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-good_email'); + envelope.classList.add('apbct-check_email_exist-bad_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#E01111'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + default: + break; + } +} + +/** + * Shift the envelope to the input field on resizing the window + * @param {object} envelope + * @param {object} inputEmail + */ +function ctEmailExistSetElementsPositions() { + const envelopeWidth = 35; + const inputEmail = document.querySelector('comment-form input[name*="email"], input#email'); + if (!inputEmail) { + return; + } + const envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + envelope.style.left = inputEmail.getBoundingClientRect().right - envelopeWidth - 10 + 'px'; + envelope.style.height = inputEmail.offsetHeight + 'px'; + envelope.style.width = envelopeWidth + 'px'; + } + + const hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.style.width = inputEmail.offsetWidth + 'px'; + hint.style.left = inputEmail.getBoundingClientRect().left + 'px'; + } +} + +/** + * @return {bool} + */ +function ctIsDrawPixel() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + return +ctPublic.pixel__enabled || + (ctPublic.data__cookies_type === 'none' && document.querySelectorAll('img#apbct_pixel').length === 0) || + (ctPublic.data__cookies_type === 'alternative' && document.querySelectorAll('img#apbct_pixel').length === 0); +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImg(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + ctSetCookie('apbct_pixel_url', pixelUrl); + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', pixelUrl); + apbct('body').append(insertedImg); + } + } +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImgFromLocalstorage(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', decodeURIComponent(pixelUrl)); + apbct('body').append(insertedImg); + } + } +} + +/** + * ctGetPixelUrl + * @return {bool} + */ +function ctGetPixelUrl() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + // Check if pixel is already in localstorage and is not outdated + let localStoragePixelUrl = apbctLocalStorage.get('apbct_pixel_url'); + if ( localStoragePixelUrl !== false ) { + if ( ! apbctLocalStorage.isAlive('apbct_pixel_url', 3600 * 3) ) { + apbctLocalStorage.delete('apbct_pixel_url'); + } else { + // if so - load pixel from localstorage and draw it skipping AJAX + ctSetPixelImgFromLocalstorage(localStoragePixelUrl); + return; + } + } + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_get_pixel_url', + { + method: 'POST', + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + }, + ); + // Using AJAX request and handler + } else { + apbct_public_sendAJAX( + { + action: 'apbct_get_pixel_url', + }, + { + notJson: true, + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * ctSetHasScrolled + */ +function ctSetHasScrolled() { + if ( ! apbctLocalStorage.isSet('ct_has_scrolled') || ! apbctLocalStorage.get('ct_has_scrolled') ) { + ctSetCookie('ct_has_scrolled', 'true'); + apbctLocalStorage.set('ct_has_scrolled', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_scrolled') === undefined + ) { + ctSetCookie('ct_has_scrolled', 'true'); + } +} + +/** + * ctSetMouseMoved + */ +function ctSetMouseMoved() { + if ( ! apbctLocalStorage.isSet('ct_mouse_moved') || ! apbctLocalStorage.get('ct_mouse_moved') ) { + ctSetCookie('ct_mouse_moved', 'true'); + apbctLocalStorage.set('ct_mouse_moved', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_mouse_moved') === undefined + ) { + ctSetCookie('ct_mouse_moved', 'true'); + } +} + +/** + * Restart listen fields to set ct_has_input_focused or ct_has_key_up + */ +function restartFieldsListening() { + if (!apbctLocalStorage.isSet('ct_has_input_focused') && !apbctLocalStorage.isSet('ct_has_key_up')) { + ctStartFieldsListening(); + } +} + +/** + * init listeners for keyup and focus events + */ +function ctStartFieldsListening() { + if ( + (apbctLocalStorage.isSet('ct_has_key_up') || apbctLocalStorage.get('ct_has_key_up')) && + (apbctLocalStorage.isSet('ct_has_input_focused') || apbctLocalStorage.get('ct_has_input_focused')) && + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') !== undefined && + ctGetCookie('ct_has_key_up') !== undefined + ) + ) { + // already set + return; + } + + let forms = ctGetPageForms(); + ctPublic.handled_fields = []; + + if (forms.length > 0) { + for (let i = 0; i < forms.length; i++) { + // handle only inputs and textareas + const handledFormFields = forms[i].querySelectorAll('input,textarea'); + for (let i = 0; i < handledFormFields.length; i++) { + if (handledFormFields[i].type !== 'hidden') { + // collect handled fields to remove handler in the future + ctPublic.handled_fields.push(handledFormFields[i]); + // do attach handlers + apbct_attach_event_handler(handledFormFields[i], 'focus', ctFunctionHasInputFocused); + apbct_attach_event_handler(handledFormFields[i], 'keyup', ctFunctionHasKeyUp); + } + } + } + } +} + +/** + * stop listening keyup and focus + * @param {string} eventName + * @param {string} functionName + */ +function ctStopFieldsListening(eventName, functionName) { + if (typeof ctPublic.handled_fields !== 'undefined' && ctPublic.handled_fields.length > 0) { + for (let i = 0; i < ctPublic.handled_fields.length; i++) { + apbct_remove_event_handler(ctPublic.handled_fields[i], eventName, functionName); + } + } +} + +let ctFunctionHasInputFocused = function output(event) { + ctSetHasInputFocused(); + ctStopFieldsListening('focus', ctFunctionHasInputFocused); +}; + +let ctFunctionHasKeyUp = function output(event) { + ctSetHasKeyUp(); + ctStopFieldsListening('keyup', ctFunctionHasKeyUp); +}; + +/** + * set ct_has_input_focused ct_has_key_up cookies on session period + */ +function ctSetHasInputFocused() { + if ( ! apbctLocalStorage.isSet('ct_has_input_focused') || ! apbctLocalStorage.get('ct_has_input_focused') ) { + apbctLocalStorage.set('ct_has_input_focused', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_input_focused', 'true'); + } +} + +/** + * ctSetHasKeyUp + */ +function ctSetHasKeyUp() { + if ( ! apbctLocalStorage.isSet('ct_has_key_up') || ! apbctLocalStorage.get('ct_has_key_up') ) { + apbctLocalStorage.set('ct_has_key_up', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_key_up') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_key_up', 'true'); + } +} + +if (ctPublic.data__key_is_ok) { + apbct_attach_event_handler(document, 'mousemove', ctFunctionMouseMove); + apbct_attach_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'keydown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'scroll', ctSetHasScrolled); +} + +/** + * Prepare block to intercept AJAX response + */ +function apbctPrepareBlockForAjaxForms() { + // eslint-disable-next-line require-jsdoc + function ctPrepareBlockMessage(xhr) { + if (xhr.responseText && + xhr.responseText.indexOf('"apbct') !== -1 && + xhr.responseText.indexOf('DOCTYPE') === -1 + ) { + try { + ctParseBlockMessage(JSON.parse(xhr.responseText)); + } catch (e) { + console.log(e.toString()); + } + } + } + + if (typeof jQuery !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + if (typeof jQuery(document).ajaxComplete() !== 'function') { + jQuery(document).on('ajaxComplete', function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } else { + jQuery(document).ajaxComplete( function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } + } else { + // if Jquery is not avaliable try to use xhr + if (typeof XMLHttpRequest !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + document.addEventListener('readystatechange', function(event) { + if (event.target.readyState === 4) { + ctPrepareBlockMessage(event.target); + } + }); + } + } +} + +/** + * For forced alt cookies. + * If token is not added to the LS on apbc_ready, check every second if so and send token to the alt sessions. + */ +function startForcedAltEventTokenChecker() { + tokenCheckerIntervalId = setInterval( function() { + if (apbctLocalStorage.get('event_token_forced_set') === '1') { + clearInterval(tokenCheckerIntervalId); + return; + } + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if (eventToken) { + ctSetAlternativeCookie([['ct_bot_detector_event_token', eventToken]], {forceAltCookies: true}); + apbctLocalStorage.set('event_token_forced_set', '1'); + clearInterval(tokenCheckerIntervalId); + } else { + } + }, 1000); +} + + +/** + * Ready function + */ +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_ready() { + document.addEventListener('gform_page_loaded', function() { + if ( + typeof ctPublic.force_alt_cookies === 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + if (typeof setEventTokenField === 'function' && typeof botDetectorLocalStorage === 'function') { + setEventTokenField(botDetectorLocalStorage.get('bot_detector_event_token')); + } + } + }); + if ( ! ctPublic.wc_ajax_add_to_cart ) { + apbctCheckAddToCartByGet(); + } + + apbctPrepareBlockForAjaxForms(); + + // set session ID + if (!apbctSessionStorage.isSet('apbct_session_id')) { + const sessionID = apbctGenerateUniqueID(); + apbctSessionStorage.set('apbct_session_id', sessionID, false); + apbctLocalStorage.set('apbct_page_hits', 1); + if (document.referrer) { + let urlReferer = new URL(document.referrer); + if (urlReferer.host !== location.host) { + apbctSessionStorage.set('apbct_site_referer', document.referrer, false); + } + } + } else { + apbctLocalStorage.set('apbct_page_hits', Number(apbctLocalStorage.get('apbct_page_hits')) + 1); + } + + apbctWriteReferrersToSessionStorage(); + + const cookiesType = apbctLocalStorage.get('ct_cookies_type'); + if ( ! cookiesType || cookiesType !== ctPublic.data__cookies_type ) { + apbctLocalStorage.set('ct_cookies_type', ctPublic.data__cookies_type); + apbctLocalStorage.delete('ct_mouse_moved'); + apbctLocalStorage.delete('ct_has_scrolled'); + } + + if (ctPublic.data__cookies_type !== 'alternative') { + ctStartFieldsListening(); + // 2nd try to add listeners for delayed appears forms + setTimeout(ctStartFieldsListening, 1000); + } + + window.addEventListener('animationstart', apbctOnAnimationStart, true); + window.addEventListener('input', apbctOnInput, true); + document.ctTypoData = new CTTypoData(); + document.ctTypoData.gatheringFields(); + document.ctTypoData.setListeners(); + + // Collect scrolling info + const initCookies = [ + ['ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)], + ['ct_fkp_timestamp', '0'], + ['ct_pointer_data', '0'], + // eslint-disable-next-line camelcase + ['ct_timezone', ctDate.getTimezoneOffset()/60*(-1)], + ['ct_screen_info', apbctGetScreenInfo()], + ['apbct_headless', navigator.webdriver], + ]; + + apbctLocalStorage.set('ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)); + apbctLocalStorage.set('ct_fkp_timestamp', '0'); + apbctLocalStorage.set('ct_pointer_data', '0'); + // eslint-disable-next-line camelcase + apbctLocalStorage.set('ct_timezone', ctDate.getTimezoneOffset()/60*(-1) ); + apbctLocalStorage.set('ct_screen_info', apbctGetScreenInfo()); + apbctLocalStorage.set('apbct_headless', navigator.webdriver); + + if ( ctPublic.data__cookies_type !== 'native' ) { + initCookies.push(['apbct_visible_fields', '0']); + } else { + // Delete all visible fields cookies on load the page + let cookiesArray = document.cookie.split(';'); + if ( cookiesArray.length !== 0 ) { + for ( let i = 0; i < cookiesArray.length; i++ ) { + let currentCookie = cookiesArray[i].trim(); + let cookieName = currentCookie.split('=')[0]; + if ( cookieName.indexOf('apbct_visible_fields_') === 0 ) { + ctDeleteCookie(cookieName); + } + } + } + } + + if ( + +ctPublic.pixel__setting && + !(+ctPublic.pixel__setting == 3 && ctPublic.settings__data__bot_detector_enabled == 1) + ) { + if ( ctIsDrawPixel() ) { + ctGetPixelUrl(); + } else { + initCookies.push(['apbct_pixel_url', ctPublic.pixel__url]); + } + } + + if ( +ctPublic.data__email_check_before_post) { + initCookies.push(['ct_checked_emails', '0']); + apbct('input[type = \'email\'], #email').on('blur', checkEmail); + } + + if ( +ctPublic.data__email_check_exist_post) { + initCookies.push(['ct_checked_emails_exist', '0']); + apbct('comment-form input[name = \'email\'], input#email').on('blur', checkEmailExist); + } + + if (apbctLocalStorage.isSet('ct_checkjs')) { + initCookies.push(['ct_checkjs', apbctLocalStorage.get('ct_checkjs')]); + } else { + initCookies.push(['ct_checkjs', 0]); + } + + // detect integrated forms that need to be handled via alternative cookies + ctDetectForcedAltCookiesForms(); + + // send bot detector event token to alt cookies on problem forms + let tokenForForceAlt = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof ctPublic.force_alt_cookies !== 'undefined' && + ctPublic.force_alt_cookies && + ctPublic.settings__data__bot_detector_enabled + ) { + apbctLocalStorage.set('event_token_forced_set', '0'); + if (tokenForForceAlt) { + initCookies.push(['ct_bot_detector_event_token', tokenForForceAlt]); + apbctLocalStorage.set('event_token_forced_set', '1'); + } else { + startForcedAltEventTokenChecker(); + } + } + + ctSetCookie(initCookies); + + setTimeout(function() { + if ( + typeof ctPublic.force_alt_cookies == 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + } + + if ( + typeof ctPublic.data__cookies_type !== 'undefined' && + ctPublic.data__cookies_type === 'none' + ) { + ctAjaxSetupAddCleanTalkDataBeforeSendAjax(); + ctAddWCMiddlewares(); + } + + for (let i = 0; i < document.forms.length; i++) { + let form = document.forms[i]; + + // Exclusion for forms + if (ctCheckHiddenFieldsExclusions(document.forms[i], 'visible_fields')) { + continue; + } + if (form.querySelector('input[name="wspsc_add_cart_submit"]') || + form.querySelector('input[name="option"][value="com_vikrentcar"]') || + form.querySelector('input[name="option"][value="com_vikbooking"]') + ) { + continue; + } + + // The Form has hidden field like apbct_visible_fields + if ( + document.forms[i].elements.apbct_visible_fields !== undefined && + document.forms[i].elements.apbct_visible_fields.length > 0 + ) { + continue; + } + + if (form.querySelector('input[name="apbct_visible_fields"]')) { + let visibleFields = form.querySelector('input[name="apbct_visible_fields"]'); + form.removeChild(visibleFields); + } + + let hiddenInput = document.createElement( 'input' ); + hiddenInput.setAttribute( 'type', 'hidden' ); + hiddenInput.setAttribute( 'id', 'apbct_visible_fields_' + i ); + hiddenInput.setAttribute( 'name', 'apbct_visible_fields'); + let visibleFieldsToInput = {}; + visibleFieldsToInput[0] = apbct_collect_visible_fields(form); + hiddenInput.value = btoa(JSON.stringify(visibleFieldsToInput)); + form.append( hiddenInput ); + + form.onsubmit_prev = form.onsubmit; + + form.ctFormIndex = i; + form.onsubmit = function(event) { + if ( ctPublic.data__cookies_type !== 'native' && typeof event.target.ctFormIndex !== 'undefined' ) { + apbct_visible_fields_set_cookie( apbct_collect_visible_fields(this), event.target.ctFormIndex ); + } + + if (ctPublic.data__cookies_type === 'none' && isFormThatNeedCatchXhr(event.target)) { + window.XMLHttpRequest.prototype.send = function(data) { + let noCookieData = getNoCookieData(); + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + defaultSend.call(this, noCookieData + data); + setTimeout(() => { + window.XMLHttpRequest.prototype.send = defaultSend; + }, 0); + }; + } + + // Call previous submit action + if (event.target.onsubmit_prev instanceof Function && !ctOnsubmitPrevCallExclude(event.target)) { + if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) { + event.preventDefault(); + } + setTimeout(function() { + event.target.onsubmit_prev.call(event.target, event); + }, 0); + } + }; + } + }, 1000); + + // Listen clicks on encoded emails + let encodedEmailNodes = document.querySelectorAll('[data-original-string]'); + ctPublic.encodedEmailNodes = encodedEmailNodes; + if (encodedEmailNodes.length) { + for (let i = 0; i < encodedEmailNodes.length; ++i) { + encodedEmailNodes[i].addEventListener('click', ctFillDecodedEmailHandler); + } + } + + // WordPress Search form processing + for (const _form of document.forms) { + if ( + typeof ctPublic !== 'undefined' && + + ctPublic.settings__forms__search_test === 1 && + ( + _form.getAttribute('id') === 'searchform' || + (_form.getAttribute('class') !== null && _form.getAttribute('class').indexOf('search-form') !== -1) || + (_form.getAttribute('role') !== null && _form.getAttribute('role').indexOf('search') !== -1) + ) + ) { + // fibosearch integration + if (_form.querySelector('input.dgwt-wcas-search-input')) { + continue; + } + + if ( + _form.getAttribute('id') === 'hero-search-form' || + _form.getAttribute('class') === 'hb-booking-search-form' + ) { + continue; + } + + // this handles search forms onsubmit process + _form.apbctSearchPrevOnsubmit = _form.onsubmit; + _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form); + } + } + + // Check any XMLHttpRequest connections + apbctCatchXmlHttpRequest(); + + // Initializing the collection of user activity + new ApbctCollectingUserActivity(); + + // Set important paramaters via ajax if problematic cache solutions found + // todo These AJAX calls removed untill we find a better solution, reason is a lot of requests to the server. + // apbctAjaxSetImportantParametersOnCacheExist(ctPublic.advancedCacheExists || ctPublic.varnishCacheExists); + + // Checking that the bot detector has loaded and received the event token for Anti-Crawler + if (ctPublic.settings__sfw__anti_crawler) { + checkBotDetectorExist(); + } +} + +/** + * Checking that the bot detector has loaded and received the event token + */ +function checkBotDetectorExist() { + if (ctPublic.settings__data__bot_detector_enabled) { + const botDetectorIntervalSearch = setInterval(() => { + let botDetectorEventToken = localStorage.bot_detector_event_token ? true : false; + + if (botDetectorEventToken) { + ctSetCookie('apbct_bot_detector_exist', '1', '3600'); + clearInterval(botDetectorIntervalSearch); + } + }, 500); + } +} + +/** + * Insert no_cookies_data to rest request + */ +function ctAddWCMiddlewares() { + const ctPinDataToRequest = (options, next) => { + if (typeof options !== 'object' || options === null || + !options.hasOwnProperty('data') || !options.hasOwnProperty('path') + ) { + return next(options); + } + + // add to cart + if (options.data.hasOwnProperty('requests') && + options.data.requests.length > 0 && + options.data.requests[0].hasOwnProperty('path') && + options.data.requests[0].path === '/wc/store/v1/cart/add-item' + ) { + options.data.requests[0].data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.requests[0].data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + // checkout + if (options.path === '/wc/store/v1/checkout') { + options.data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + return next(options); + }; + + if (window.hasOwnProperty('wp') && + window.wp.hasOwnProperty('apiFetch') && + typeof window.wp.apiFetch.use === 'function' + ) { + window.wp.apiFetch.use(ctPinDataToRequest); + } +} + +/** + * Insert event_token and no_cookies_data to some ajax request + */ +function apbctCatchXmlHttpRequest() { + // 1) Check the page if it needed to catch XHR + if ( document.querySelector('div.wfu_container') !== null ) { + const originalSend = XMLHttpRequest.prototype.send; + XMLHttpRequest.prototype.send = function(body) { + // 2) Check the caught request fi it needed to modify + if ( + body && + typeof body === 'string' && + ( + body.indexOf('action=wfu_ajax_action_ask_server') !== -1 + ) + ) { + let addidionalCleantalkData = ''; + let eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if ( + eventToken !== null && + eventToken !== false && + eventToken.hasOwnProperty('value') && + eventToken.value !== '' + ) { + eventToken = eventToken.value; + addidionalCleantalkData += '&' + 'data%5Bct_bot_detector_event_token%5D=' + eventToken; + } + + let noCookieData = getNoCookieData(); + addidionalCleantalkData += '&' + 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData; + + body += addidionalCleantalkData; + + return originalSend.apply(this, [body]); + } + return originalSend.apply(this, [body]); + }; + } +} + +/** + * Run AJAX to set important_parameters on the site backend if problematic cache solutions are defined. + * @param {boolean} cacheExist + */ +function apbctAjaxSetImportantParametersOnCacheExist(cacheExist) { // eslint-disable-line no-unused-vars + // Set important parameters via ajax + if ( cacheExist ) { + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST('apbct_set_important_parameters', {}); + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX({action: 'apbct_set_important_parameters'}, {}); + } + } +} + +/** + * Prepare jQuery.ajaxSetup to add nocookie data to the jQuery ajax request. + * Notes: + * - Do it just once, the ajaxSetup.beforeSend will be overwritten for any calls. + * - Signs of forms need to be caught will be checked during ajaxSetup.settings.data process on send. + * - Any sign of the form HTML of the caller is insignificant in this process. + * @return {void} + */ +function ctAjaxSetupAddCleanTalkDataBeforeSendAjax() { + // jquery ajax call intercept + // this is the only place where we can found hard dependency on jQuery, if the form use it - the script + // will work independing if jQuery is loaded by CleanTalk or not + let eventToken = false; + if ( typeof jQuery !== 'undefined' && typeof jQuery.ajaxSetup === 'function') { + jQuery.ajaxSetup({ + beforeSend: function(xhr, settings) { + let sourceSign = false; + // settings data is string (important!) + if ( typeof settings.data === 'string' ) { + if (settings.data.indexOf('twt_cc_signup') !== -1) { + sourceSign = 'twt_cc_signup'; + } + + if (settings.data.indexOf('action=mailpoet') !== -1) { + sourceSign = 'action=mailpoet'; + } + + if ( + settings.data.indexOf('action=user_registration') !== -1 && + settings.data.indexOf('ur_frontend_form_nonce') !== -1 + ) { + sourceSign = 'action=user_registration'; + } + + if (settings.data.indexOf('action=happyforms_message') !== -1) { + sourceSign = 'action=happyforms_message'; + } + + if (settings.data.indexOf('action=new_activity_comment') !== -1) { + sourceSign = 'action=new_activity_comment'; + } + } + if ( typeof settings.url === 'string' ) { + if (settings.url.indexOf('wc-ajax=add_to_cart') !== -1) { + sourceSign = 'wc-ajax=add_to_cart'; + if (localStorage.getItem('bot_detector_event_token') !== null) { + eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if (eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') { + eventToken = eventToken.value; + } + } + } + } + + if (sourceSign) { + let noCookieData = getNoCookieData(); + if (typeof eventToken === 'string') { + eventToken = 'data%5Bct_bot_detector_event_token%5D=' + eventToken + '&'; + } else { + eventToken = ''; + } + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + + settings.data = noCookieData + eventToken + settings.data; + } + }, + }); + } +} + +// eslint-disable-next-line require-jsdoc +function ctOnsubmitPrevCallExclude(form) { + if (form.classList.contains('hb-booking-search-form')) { + return true; + } + + return false; +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbct_ready(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbct_ready); + } + + apbctLocalStorage.set('ct_checkjs', ctPublic.ct_checkjs_key, true ); +} + +/** + * @param {SubmitEvent} e + * @param {object} targetForm + */ +function ctSearchFormOnSubmitHandler(e, targetForm) { + try { + // get honeypot field and it's value + const honeyPotField = targetForm.querySelector('[name*="apbct_email_id__"]'); + let hpValue = null; + if ( + honeyPotField !== null && + honeyPotField.value !== null + ) { + hpValue = honeyPotField.value; + } + + // get cookie data from storages + let cleantalkStorageDataArray = getCleanTalkStorageDataArray(); + + // get event token from storage + let eventTokenLocalStorage = apbctLocalStorage.get('bot_detector_event_token'); + + // if noCookie data or honeypot data is set, proceed handling + if ( cleantalkStorageDataArray !== null || honeyPotField !== null || eventTokenLocalStorage !== null ) { + e.preventDefault(); + const callBack = () => { + if (honeyPotField !== null) { + honeyPotField.parentNode.removeChild(honeyPotField); + } + if (typeof targetForm.apbctSearchPrevOnsubmit === 'function') { + targetForm.apbctSearchPrevOnsubmit(); + } else { + HTMLFormElement.prototype.submit.call(targetForm); + } + }; + + let cookiesArray = cleantalkStorageDataArray; + + // if honeypot data provided add the fields to the parsed data + if ( hpValue !== null ) { + cookiesArray.apbct_search_form__honeypot_value = hpValue; + } + + // set event token + cookiesArray.ct_bot_detector_event_token = eventTokenLocalStorage; + + // if the pixel needs to be decoded + if ( + typeof cookiesArray.apbct_pixel_url === 'string' && + cookiesArray.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookiesArray.apbct_pixel_url = decodeURIComponent(cookiesArray.apbct_pixel_url); + } + + // data to JSON + const parsedCookies = JSON.stringify(cookiesArray); + + // if any data provided, proceed data to xhr + if ( typeof parsedCookies !== 'undefined' && parsedCookies.length !== 0 ) { + ctSetAlternativeCookie( + parsedCookies, + {callback: callBack, onErrorCallback: callBack, forceAltCookies: true}, + ); + } else { + callBack(); + } + } + } catch (error) { + console.warn('APBCT search form onsubmit handler error. ' + error); + } +} + +/** + * @param {mixed} commonCookies + * @return {string} + */ +function getJavascriptClientData(commonCookies = []) { // eslint-disable-line no-unused-vars + let resultDataJson = {}; + + resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails'); + resultDataJson.ct_checked_emails_exist = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails_exist'); + resultDataJson.ct_checkjs = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checkjs'); + resultDataJson.ct_fkp_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_fkp_timestamp'); + resultDataJson.ct_pointer_data = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_pointer_data'); + resultDataJson.ct_ps_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_ps_timestamp'); + resultDataJson.ct_screen_info = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_screen_info'); + resultDataJson.ct_timezone = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_timezone'); + + // collecting data from localstorage + const ctMouseMovedLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const apbctPageHits = apbctLocalStorage.get('apbct_page_hits'); + const apbctPrevReferer = apbctSessionStorage.get('apbct_prev_referer'); + const apbctSiteReferer = apbctSessionStorage.get('apbct_site_referer'); + const ctJsErrorsLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_js_errors'); + const ctPixelUrl = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadless = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + const ctBotDetectorFrontendDataLog = apbctLocalStorage.get( + ctPublicFunctions.cookiePrefix + 'ct_bot_detector_frontend_data_log', + ); + + // collecting data from cookies + const ctMouseMovedCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const ctCookiesPixelUrl = ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadlessNative = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + + + resultDataJson.ct_mouse_moved = ctMouseMovedLocalStorage !== undefined ? + ctMouseMovedLocalStorage : ctMouseMovedCookie; + resultDataJson.ct_has_scrolled = ctHasScrolledLocalStorage !== undefined ? + ctHasScrolledLocalStorage : ctHasScrolledCookie; + resultDataJson.ct_cookies_type = ctCookiesTypeLocalStorage !== undefined ? + ctCookiesTypeLocalStorage : ctCookiesTypeCookie; + resultDataJson.apbct_pixel_url = ctPixelUrl !== undefined ? + ctPixelUrl : ctCookiesPixelUrl; + resultDataJson.apbct_headless = apbctHeadless !== undefined ? + apbctHeadless : apbctHeadlessNative; + resultDataJson.ct_bot_detector_frontend_data_log = ctBotDetectorFrontendDataLog !== undefined ? + ctBotDetectorFrontendDataLog : ''; + if (resultDataJson.apbct_pixel_url && typeof(resultDataJson.apbct_pixel_url) == 'string') { + if (resultDataJson.apbct_pixel_url.indexOf('%3A%2F')) { + resultDataJson.apbct_pixel_url = decodeURIComponent(resultDataJson.apbct_pixel_url); + } + } + + resultDataJson.apbct_page_hits = apbctPageHits; + resultDataJson.apbct_prev_referer = apbctPrevReferer; + resultDataJson.apbct_site_referer = apbctSiteReferer; + resultDataJson.apbct_ct_js_errors = ctJsErrorsLocalStorage; + + if (!resultDataJson.apbct_pixel_url) { + resultDataJson.apbct_pixel_url = ctPublic.pixel__url; + } + + if ( typeof (commonCookies) === 'object') { + for (let i = 0; i < commonCookies.length; ++i) { + if ( typeof (commonCookies[i][1]) === 'object' ) { + // this is for handle SFW cookies + resultDataJson[commonCookies[i][1][0]] = commonCookies[i][1][1]; + } else { + resultDataJson[commonCookies[i][0]] = commonCookies[i][1]; + } + } + } else { + console.log('APBCT JS ERROR: Collecting data type mismatch'); + } + + // Parse JSON properties to prevent double JSON encoding + resultDataJson = removeDoubleJsonEncoding(resultDataJson); + + + return JSON.stringify(resultDataJson); +} + +/** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {mixed} object + * @return {*} + */ +function removeDoubleJsonEncoding(object) { + if ( typeof object === 'object') { + // eslint-disable-next-line guard-for-in + for (let objectKey in object) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = removeDoubleJsonEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + const parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + + return object; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_collect_visible_fields( form ) { + // Get only fields + let inputs = []; + let inputsVisible = ''; + let inputsVisibleCount = 0; + let inputsInvisible = ''; + let inputsInvisibleCount = 0; + let inputsWithDuplicateNames = []; + + for (let key in form.elements) { + if (!isNaN(+key)) { + inputs[key] = form.elements[key]; + } + } + + // Filter fields + inputs = inputs.filter(function(elem) { + // Filter already added fields + if ( inputsWithDuplicateNames.indexOf( elem.getAttribute('name') ) !== -1 ) { + return false; + } + // Filter inputs with same names for type == radio + if ( -1 !== ['radio', 'checkbox'].indexOf( elem.getAttribute('type') )) { + inputsWithDuplicateNames.push( elem.getAttribute('name') ); + return false; + } + return true; + }); + + // Visible fields + inputs.forEach(function(elem, i, elements) { + // Unnecessary fields + if ( + elem.getAttribute('type') === 'submit' || // type == submit + elem.getAttribute('name') === null || + elem.getAttribute('name') === 'ct_checkjs' + ) { + return; + } + // Invisible fields + if ( + getComputedStyle(elem).display === 'none' || // hidden + getComputedStyle(elem).visibility === 'hidden' || // hidden + getComputedStyle(elem).opacity === '0' || // hidden + elem.getAttribute('type') === 'hidden' // type == hidden + ) { + if ( elem.classList.contains('wp-editor-area') ) { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } else { + inputsInvisible += ' ' + elem.getAttribute('name'); + inputsInvisibleCount++; + } + // eslint-disable-next-line brace-style + } + // Visible fields + else { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } + }); + + inputsInvisible = inputsInvisible.trim(); + inputsVisible = inputsVisible.trim(); + + return { + visible_fields: inputsVisible, + visible_fields_count: inputsVisibleCount, + invisible_fields: inputsInvisible, + invisible_fields_count: inputsInvisibleCount, + }; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_visible_fields_set_cookie( visibleFieldsCollection, formId ) { + let collection = typeof visibleFieldsCollection === 'object' && visibleFieldsCollection !== null ? + visibleFieldsCollection : {}; + + if ( ctPublic.data__cookies_type === 'native' ) { + // eslint-disable-next-line guard-for-in + for ( let i in collection ) { + if ( i > 10 ) { + // Do not generate more than 10 cookies + return; + } + let collectionIndex = formId !== undefined ? formId : i; + ctSetCookie('apbct_visible_fields_' + collectionIndex, JSON.stringify( collection[i] ) ); + } + } else { + ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) ); + } +} + +// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars +function apbct_js_keys__set_input_value(result, data, params, obj) { + if ( document.querySelectorAll('[name^=ct_checkjs]').length > 0 ) { + let elements = document.querySelectorAll('[name^=ct_checkjs]'); + for ( let i = 0; i < elements.length; i++ ) { + elements[i].value = result.js_key; + } + } +} + +/** + * @return {string} + */ +function apbctGetScreenInfo() { + return JSON.stringify({ + fullWidth: document.documentElement.scrollWidth, + fullHeight: Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight, + ), + visibleWidth: document.documentElement.clientWidth, + visibleHeight: document.documentElement.clientHeight, + }); +} + +// eslint-disable-next-line require-jsdoc +function ctParseBlockMessage(response) { + let msg = ''; + if (typeof response.apbct !== 'undefined') { + response = response.apbct; + if (response.blocked) { + msg = response.comment; + } + } + if (typeof response.data !== 'undefined') { + response = response.data; + if (response.message !== undefined) { + msg = response.message; + } + } + + if (msg) { + document.dispatchEvent( + new CustomEvent( 'apbctAjaxBockAlert', { + bubbles: true, + detail: {message: msg}, + } ), + ); + + // Show the result by modal + cleantalkModal.loaded = msg; + cleantalkModal.open(); + + if (+response.stop_script === 1) { + window.stop(); + } + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetPixelUrlLocalstorage(ajaxPixelUrl) { + // set pixel to the storage + ctSetCookie('apbct_pixel_url', ajaxPixelUrl); +} + +// eslint-disable-next-line require-jsdoc +function ctNoCookieConstructHiddenField(type) { + let inputType = 'hidden'; + if (type === 'submit') { + inputType = 'submit'; + } + let field = ''; + + let noCookieData = getCleanTalkStorageDataArray(); + noCookieData = JSON.stringify(noCookieData); + noCookieData = '_ct_no_cookie_data_' + btoa(noCookieData); + field = document.createElement('input'); + field.setAttribute('name', 'ct_no_cookie_hidden_field'); + field.setAttribute('value', noCookieData); + field.setAttribute('type', inputType); + field.classList.add('apbct_special_field'); + field.classList.add('ct_no_cookie_hidden_field'); + return field; +} + +/** + * Retrieves the clentalk "cookie" data from starages. + * Contains {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}. + * @return {string} + */ +function getCleanTalkStorageDataArray() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + + let noCookieDataTypo = {typo: []}; + if (document.ctTypoData && document.ctTypoData.data) { + noCookieDataTypo = {typo: document.ctTypoData.data}; + } + + let noCookieDataFromUserActivity = {collecting_user_activity_data: []}; + + if (document.ctCollectingUserActivityData) { + let collectingUserActivityData = JSON.parse(JSON.stringify(document.ctCollectingUserActivityData)); + noCookieDataFromUserActivity = {collecting_user_activity_data: collectingUserActivityData}; + } + + return {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}; +} + +/** + * @return {boolean|*} + */ +function ctGetPageForms() { + let forms = document.forms; + if (forms) { + return forms; + } + return false; +} + +/** + * Get type of the field should be excluded. Return exclusion signs via object. + * @param {object} form Form dom object. + * @return {object} {'no_cookie': 1|0, 'visible_fields': 1|0} + */ +function ctGetHiddenFieldExclusionsType(form) { + // visible fields + let result = {'no_cookie': 0, 'visible_fields': 0}; + if ( + +ctPublic.data__visible_fields_required === 0 || + (form.method.toString().toLowerCase() === 'get' && + form.querySelectorAll('.nf-form-content').length === 0 && + form.id !== 'twt_cc_signup') || + form.classList.contains('slp_search_form') || // StoreLocatorPlus form + form.parentElement.classList.contains('mec-booking') || + form.action.toString().indexOf('activehosted.com') !== -1 || // Active Campaign + (form.id && form.id === 'caspioform') || // Caspio Form + (form.classList && form.classList.contains('tinkoffPayRow')) || // TinkoffPayForm + (form.classList && form.classList.contains('give-form')) || // GiveWP + (form.id && form.id === 'ult-forgot-password-form') || // ult forgot password + (form.id && form.id.toString().indexOf('calculatedfields') !== -1) || // CalculatedFieldsForm + (form.id && form.id.toString().indexOf('sac-form') !== -1) || // Simple Ajax Chat + (form.id && + form.id.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + (form.name && + form.name.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + form.action.toString() === 'https://epayment.epymtservice.com/epay.jhtml' || // Custom form + (form.name && form.name.toString().indexOf('tribe-bar-form') !== -1) || // The Events Calendar + (form.id && form.id === 'ihf-login-form') || // Optima Express login + (form.id && + form.id === 'subscriberForm' && + form.action.toString().indexOf('actionType=update') !== -1) || // Optima Express update + (form.id && form.id === 'ihf-main-search-form') || // Optima Express search + (form.id && form.id === 'frmCalc') || // nobletitle-calc + form.action.toString().indexOf('property-organizer-delete-saved-search-submit') !== -1 || + form.querySelector('a[name="login"]') !== null // digimember login form + ) { + result.visible_fields = 1; + } + + // ajax search pro exclusion + let ncFieldExclusionsSign = form.parentNode; + if ( + ncFieldExclusionsSign && ncFieldExclusionsSign.classList.contains('proinput') || + (form.name === 'options' && form.classList.contains('asp-fss-flex')) + ) { + result.no_cookie = 1; + } + + // woocommerce login form + if ( + form && form.classList.contains('woocommerce-form-login') + ) { + result.visible_fields = 1; + result.no_cookie = 1; + } + + return result; +} + +/** + * Check if the form should be skipped from hidden field attach. + * Return exclusion description if it is found, false otherwise. + * @param {object} form Form dom object. + * @param {string} hiddenFieldType Type of hidden field that needs to be checked. + * Possible values: 'no_cookie'|'visible_fields'. + * @return {boolean} + */ +function ctCheckHiddenFieldsExclusions(form, hiddenFieldType) { + const formAction = typeof(form.action) == 'string' ? form.action : ''; + // Ajax Search Lite + if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) { + return true; + } + // Super WooCommerce Product Filter + if (form.classList.contains('swpf-instant-filtering')) { + return true; + } + // PayU 3-rd party service forms + if (formAction.indexOf('secure.payu.com') !== -1 ) { + return true; + } + + if (formAction.indexOf('hsforms') !== -1 ) { + return true; + } + + if (typeof (hiddenFieldType) === 'string' && + ['visible_fields', 'no_cookie'].indexOf(hiddenFieldType) !== -1) { + const exclusions = ctGetHiddenFieldExclusionsType(form); + return exclusions[hiddenFieldType] === 1; + } + + return false; +} + +/** + * ctNoCookieAttachHiddenFieldsToForms + */ +function ctNoCookieAttachHiddenFieldsToForms() { + if (ctPublic.data__cookies_type !== 'none') { + return; + } + + let forms = ctGetPageForms(); + + if (forms) { + for ( let i = 0; i < forms.length; i++ ) { + if ( ctCheckHiddenFieldsExclusions(document.forms[i], 'no_cookie') ) { + continue; + } + + // ignore forms with get method @todo We need to think about this + if (document.forms[i].getAttribute('method') === null || + document.forms[i].getAttribute('method').toLowerCase() === 'post') { + // remove old sets + let fields = forms[i].querySelectorAll('.ct_no_cookie_hidden_field'); + for ( let j = 0; j < fields.length; j++ ) { + fields[j].outerHTML = ''; + } + // add new set + document.forms[i].append(ctNoCookieConstructHiddenField()); + } + } + } +} + +const defaultFetch = window.fetch; +const defaultSend = XMLHttpRequest.prototype.send; + +if (document.readyState !== 'loading') { + checkFormsExistForCatching(); +} else { + apbct_attach_event_handler(document, 'DOMContentLoaded', checkFormsExistForCatching); +} + +/** + * checkFormsExistForCatching + */ +function checkFormsExistForCatching() { + setTimeout(function() { + if (isFormThatNeedCatch()) { + window.fetch = function(...args) { + if (args && + args[0] && + typeof args[0].includes === 'function' && + args[0].includes('/wp-json/metform/') + ) { + let noCookieData = getNoCookieData(); + + if (args && args[1] && args[1].body) { + args[1].body.append('ct_no_cookie_hidden_field', noCookieData); + } + } + + return defaultFetch.apply(window, args); + }; + } + }, 1000); +} + +/** + * @return {boolean} + */ +function isFormThatNeedCatch() { + const formClasses = [ + 'metform-form-content', + ]; + let classExists = false; + + const forms = document.forms; + for (let form of forms) { + formClasses.forEach(function(classForm) { + if (form.classList.contains(classForm)) { + classExists = true; + } + }); + } + + return classExists; +} + +/** + * @param {HTMLElement} form + * @return {boolean} + */ +function isFormThatNeedCatchXhr(form) { + if (document.querySelector('div.elementor-widget[title=\'Login/Signup\']') != null) { + return false; + } + if (form && form.action && form.action.toString().indexOf('mailpoet_subscription_form') !== -1) { + return true; + } + + return false; +} + +/** + * @return {string} + */ +function getNoCookieData() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + let noCookieData = {...noCookieDataLocal, ...noCookieDataSession}; + noCookieData = JSON.stringify(noCookieData); + + return '_ct_no_cookie_data_' + btoa(noCookieData); +} + +/** + * Set three statements to the sessions storage: apbct_session_current_page, apbct_prev_referer. + * @return {void} + */ +function apbctWriteReferrersToSessionStorage() { + const sessionCurrentPage = apbctSessionStorage.get('apbct_session_current_page'); + + // set session apbct_referer + if (sessionCurrentPage!== false && document.location.href !== sessionCurrentPage) { + apbctSessionStorage.set('apbct_prev_referer', sessionCurrentPage, false); + } + + // set session current page to know referrer + apbctSessionStorage.set('apbct_session_current_page', document.location.href, false); +} + +/** + * WooCommerce add to cart by GET request params collecting + */ +function apbctCheckAddToCartByGet() { + // 1) Collect all links with add_to_cart_button class + document.querySelectorAll('a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)').forEach((el) => { + el.addEventListener('click', function(e) { + let href = el.getAttribute('href'); + // 2) Add to href attribute additional parameter ct_bot_detector_event_token gathered from apbctLocalStorage + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if ( eventToken ) { + if ( href.indexOf('?') === -1 ) { + href += '?'; + } else { + href += '&'; + } + href += 'ct_bot_detector_event_token=' + eventToken; + el.setAttribute('href', href); + } + }); + }); +} + +/* Cleantalk Modal object */ +let cleantalkModal = { + + // Flags + loaded: false, + loading: false, + opened: false, + opening: false, + ignoreURLConvert: false, + + // Methods + load: function( action ) { + if ( ! this.loaded ) { + this.loading = true; + let callback = function( result, data, params, obj ) { + cleantalkModal.loading = false; + cleantalkModal.loaded = result; + document.dispatchEvent( + new CustomEvent( 'cleantalkModalContentLoaded', { + bubbles: true, + } ), + ); + }; + // eslint-disable-next-line camelcase + if ( typeof apbct_admin_sendAJAX === 'function' ) { + apbct_admin_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } else { + apbct_public_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } + } + }, + + open: function() { + /* Cleantalk Modal CSS start */ + let renderCss = function() { + let cssStr = ''; + // eslint-disable-next-line guard-for-in + for ( const key in this.styles ) { + cssStr += key + ':' + this.styles[key] + ';'; + } + return cssStr; + }; + let overlayCss = { + styles: { + 'z-index': '9999999999', + 'position': 'fixed', + 'top': '0', + 'left': '0', + 'width': '100%', + 'height': '100%', + 'background': 'rgba(0,0,0,0.5)', + 'display': 'flex', + 'justify-content': 'center', + 'align-items': 'center', + }, + toString: renderCss, + }; + let innerCss = { + styles: { + 'position': 'relative', + 'padding': '30px', + 'background': '#FFF', + 'border': '1px solid rgba(0,0,0,0.75)', + 'border-radius': '4px', + 'box-shadow': '7px 7px 5px 0px rgba(50,50,50,0.75)', + }, + toString: renderCss, + }; + let closeCss = { + styles: { + 'position': 'absolute', + 'background': '#FFF', + 'width': '20px', + 'height': '20px', + 'border': '2px solid rgba(0,0,0,0.75)', + 'border-radius': '15px', + 'cursor': 'pointer', + 'top': '-8px', + 'right': '-8px', + 'box-sizing': 'content-box', + }, + toString: renderCss, + }; + let closeCssBefore = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(45deg)', + }, + toString: renderCss, + }; + let closeCssAfter = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(-45deg)', + }, + toString: renderCss, + }; + let bodyCss = { + styles: { + 'overflow': 'hidden', + }, + toString: renderCss, + }; + let cleantalkModalStyle = document.createElement( 'style' ); + cleantalkModalStyle.setAttribute( 'id', 'cleantalk-modal-styles' ); + cleantalkModalStyle.innerHTML = 'body.cleantalk-modal-opened{' + bodyCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-overlay{' + overlayCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close{' + closeCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:before{' + closeCssBefore + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:after{' + closeCssAfter + '}'; + document.body.append( cleantalkModalStyle ); + /* Cleantalk Modal CSS end */ + + let overlay = document.createElement( 'div' ); + overlay.setAttribute( 'id', 'cleantalk-modal-overlay' ); + document.body.append( overlay ); + + document.body.classList.add( 'cleantalk-modal-opened' ); + + let inner = document.createElement( 'div' ); + inner.setAttribute( 'id', 'cleantalk-modal-inner' ); + inner.setAttribute( 'style', innerCss ); + overlay.append( inner ); + + let close = document.createElement( 'div' ); + close.setAttribute( 'id', 'cleantalk-modal-close' ); + inner.append( close ); + + let content = document.createElement( 'div' ); + if ( this.loaded ) { + const urlRegex = /(https?:\/\/[^\s]+)/g; + const serviceContentRegex = /.*\/inc/g; + if (serviceContentRegex.test(this.loaded) || this.ignoreURLConvert) { + content.innerHTML = this.loaded; + } else { + content.innerHTML = this.loaded.replace(urlRegex, '$1'); + } + } else { + content.innerHTML = 'Loading...'; + // @ToDo Here is hardcoded parameter. Have to get this from a 'data-' attribute. + this.load( 'get_options_template' ); + } + content.setAttribute( 'id', 'cleantalk-modal-content' ); + inner.append( content ); + + this.opened = true; + }, + + close: function() { + document.body.classList.remove( 'cleantalk-modal-opened' ); + document.getElementById( 'cleantalk-modal-overlay' ).remove(); + document.getElementById( 'cleantalk-modal-styles' ).remove(); + document.dispatchEvent( + new CustomEvent( 'cleantalkModalClosed', { + bubbles: true, + } ), + ); + }, + +}; + +/* Cleantalk Modal helpers */ +document.addEventListener('click', function( e ) { + if ( e.target && (e.target.id === 'cleantalk-modal-overlay' || e.target.id === 'cleantalk-modal-close') ) { + cleantalkModal.close(); + } +}); +document.addEventListener('cleantalkModalContentLoaded', function( e ) { + if ( cleantalkModal.opened && cleantalkModal.loaded ) { + document.getElementById( 'cleantalk-modal-content' ).innerHTML = cleantalkModal.loaded; + } +}); + +document.addEventListener('DOMContentLoaded', function() { + let ctTrpLocalize = undefined; + let ctTrpIsAdminCommentsList = false; + + if ( typeof ctPublic !== 'undefined' || typeof ctTrpAdminLocalize !== 'undefined' ) { + if ( typeof ctPublic !== 'undefined' && ctPublic.theRealPerson ) { + ctTrpLocalize = ctPublic.theRealPerson; + } + if ( + typeof ctTrpLocalize === 'undefined' && + typeof ctTrpAdminLocalize !== 'undefined' && + ctTrpAdminLocalize.theRealPerson + ) { + ctTrpLocalize = ctTrpAdminLocalize.theRealPerson; + ctTrpIsAdminCommentsList = true; + } + } + + if ( ! ctTrpLocalize ) { + return; + } + + // Selectors. Try to handle the WIDE range of themes. + let themesCommentsSelector = '.apbct-trp *[class*="comment-author"]'; + if ( document.querySelector('.apbct-trp .comment-author .comment-author-link') ) { + // For Spacious theme + themesCommentsSelector = '.apbct-trp *[class*="comment-author-link"]'; + } + let woocommerceReviewsSelector = '.apbct-trp *[class*="review__author"]'; + let adminCommentsListSelector = '.apbct-trp td[class*="column-author"] > strong'; + const trpComments = document.querySelectorAll( + themesCommentsSelector + ',' + + woocommerceReviewsSelector + ',' + + adminCommentsListSelector); + + if ( trpComments.length === 0 ) { + return; + } + + trpComments.forEach(( element, index ) => { + // Exceptions for items that are included in the selection + if ( + typeof pagenow == 'undefined' && + element.parentElement.className.indexOf('group') < 0 && + element.tagName != 'DIV' + ) { + return; + } + + let trpLayout = document.createElement('div'); + trpLayout.setAttribute('class', 'apbct-real-user-badge'); + + let trpImage = document.createElement('img'); + trpImage.setAttribute('src', ctTrpLocalize.imgPersonUrl); + trpImage.setAttribute('class', 'apbct-real-user-popup-img'); + + let trpDescription = document.createElement('div'); + trpDescription.setAttribute('class', 'apbct-real-user-popup'); + + let trpDescriptionHeading = document.createElement('p'); + trpDescriptionHeading.setAttribute('class', 'apbct-real-user-popup-header'); + trpDescriptionHeading.append(ctTrpLocalize.phrases.trpHeading); + + let trpDescriptionContent = document.createElement('div'); + trpDescriptionContent.setAttribute('class', 'apbct-real-user-popup-content_row'); + + let trpDescriptionContentSpan = document.createElement('span'); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent1 + ' '); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent2); + + if ( ctTrpIsAdminCommentsList ) { + let learnMoreLink = document.createElement('a'); + learnMoreLink.setAttribute('href', ctTrpLocalize.trpContentLink); + learnMoreLink.setAttribute('target', '_blank'); + learnMoreLink.text = ctTrpLocalize.phrases.trpContentLearnMore; + trpDescriptionContentSpan.append(' '); // Need one space + trpDescriptionContentSpan.append(learnMoreLink); + } + + trpDescriptionContent.append(trpDescriptionContentSpan); + trpDescription.append(trpDescriptionHeading, trpDescriptionContent); + trpLayout.append(trpImage); + element.append(trpLayout); + element.append(trpDescription); + }); + + const badges = document.querySelectorAll('.apbct-real-user-badge'); + + badges.forEach((badge) => { + let hideTimeout = undefined; + + this.body.addEventListener('click', function(e) { + if ( + e.target.className.indexOf('apbct-real-user') == -1 && + e.target.parentElement.className.indexOf('apbct-real-user') == -1 + ) { + closeAllPopupTRP(); + } + }); + + badge.addEventListener('click', function() { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.toggle('visible'); + } + }); + + badge.addEventListener('mouseenter', function() { + closeAllPopupTRP(); + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.add('visible'); + } + }); + + badge.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + const popup = badge.nextElementSibling; + popup.addEventListener('mouseenter', function() { + clearTimeout(hideTimeout); + popup.classList.add('visible'); + }); + + popup.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + if (popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + // For mobile devices + badge.addEventListener('touchend', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + const selection = window.getSelection(); + // Check if no text is selected + if (popup && selection && popup.classList.contains('apbct-real-user-popup') && + selection.toString().length === 0 + ) { + popup.classList.remove('visible'); + } else { + clearTimeout(hideTimeout); + document.addEventListener('selectionchange', function onSelectionChange() { + const selection = window.getSelection(); + if (selection && selection.toString().length === 0) { + // Restart the hide timeout when selection is cleared + hideTimeout = setTimeout(() => { + const popup = badge.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 3000); + document.removeEventListener('selectionchange', onSelectionChange); + } + }); + } + }, 3000); + }); + }); +}); + +/** + * Closing all TRP popup + */ +function closeAllPopupTRP() { + let allDisplayPopup = document.querySelectorAll('.apbct-real-user-popup.visible'); + if (allDisplayPopup.length > 0) { + allDisplayPopup.forEach((element) => { + element.classList.remove('visible'); + }); + } +} diff --git a/js/src/apbct-public-bundle_ext-protection.js b/js/src/apbct-public-bundle_ext-protection.js index cae5bdec0..e4fb2d2e1 100644 --- a/js/src/apbct-public-bundle_ext-protection.js +++ b/js/src/apbct-public-bundle_ext-protection.js @@ -5306,444 +5306,3 @@ function apbctIsFormInDiv(formObj, divClassName) { } return false; } - -/** - * @return {HTMLElement} event - */ -function apbctSetEmailDecoderPopupAnimation() { - const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; - const animationWrapper = document.createElement('div'); - animationWrapper.classList = 'apbct-ee-animation-wrapper'; - for (let i = 0; i < animationElements.length; i++) { - const apbctEEAnimationDogOne = document.createElement('span'); - apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; - apbctEEAnimationDogOne.innerText = '@'; - animationWrapper.append(apbctEEAnimationDogOne); - } - return animationWrapper; -} - -/** - * @param {mixed} event - */ -function ctFillDecodedEmailHandler(event = false) { - let clickSource = false; - let ctWlBrandname = ''; - let encodedEmail = ''; - if (typeof ctPublic !== 'undefined') { - this.removeEventListener('click', ctFillDecodedEmailHandler); - // remember clickSource - clickSource = this; - // globally remember if emails is mixed with mailto - ctPublic.encodedEmailNodesIsMixed = false; - ctWlBrandname = ctPublic.wl_brandname; - encodedEmail = ctPublic.encodedEmailNodes; - } else if (typeof ctAdminCommon !== 'undefined') { - ctWlBrandname = ctAdminCommon.plugin_name; - encodedEmail = ctAdminCommon.encodedEmailNode; - } - - // get fade - document.body.classList.add('apbct-popup-fade'); - // popup show - let encoderPopup = document.getElementById('apbct_popup'); - if (!encoderPopup) { - // construct popup - let waitingPopup = document.createElement('div'); - waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); - waitingPopup.setAttribute('id', 'apbct_popup'); - - // construct text header - let popupHeaderWrapper = document.createElement('span'); - popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; - let popupHeader = document.createElement('p'); - popupHeader.innerText = ctWlBrandname; - popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); - popupHeaderWrapper.append(popupHeader); - - // construct text wrapper - let popupTextWrapper = document.createElement('div'); - popupTextWrapper.setAttribute('id', 'apbct_popup_text'); - popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); - popupTextWrapper.style.color = 'black'; - - // construct text first node - // todo make translatable - let popupTextWaiting = document.createElement('p'); - popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; - } - popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); - - // construct text second node - // todo make translatable - let popupTextDecoding = document.createElement('p'); - popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { - popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; - } else { - popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; - } - - // appending - popupTextWrapper.append(popupTextWaiting); - popupTextWrapper.append(popupTextDecoding); - waitingPopup.append(popupHeaderWrapper); - waitingPopup.append(popupTextWrapper); - waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); - document.body.append(waitingPopup); - } else { - encoderPopup.setAttribute('style', 'display: inherit'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; - } - } - - apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); -} - -/** - * @param {mixed} event - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { - if (event && clickSource) { - // collect data - const javascriptClientData = getJavascriptClientData(); - let data = { - event_javascript_data: javascriptClientData, - post_url: document.location.href, - referrer: document.referrer, - encodedEmails: '', - }; - let encodedEmailsCollection = {}; - for (let i = 0; i < encodedEmailNodes.length; i++) { - // disable click for mailto - if ( - typeof encodedEmailNodes[i].href !== 'undefined' && - encodedEmailNodes[i].href.indexOf('mailto:') === 0 - ) { - event.preventDefault(); - ctPublic.encodedEmailNodesIsMixed = true; - } - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - apbct(encodedEmailNodes[i]).append(apbctTooltip); - - // collect encoded email strings - encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; - } - - // JSONify encoded email strings - data.encodedEmails = JSON.stringify(encodedEmailsCollection); - - // Using REST API handler - if ( ctPublicFunctions.data__ajax_type === 'rest' ) { - apbct_public_sendREST( - 'apbct_decode_email', - { - data: data, - method: 'POST', - callback: function(result) { - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - - // Using AJAX request and handler - } else { - data.action = 'apbct_decode_email'; - apbct_public_sendAJAX( - data, - { - notJson: false, - callback: function(result) { - console.log('result'); - console.log(result); - - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - } - } else { - const encodedEmail = encodedEmailNodes.dataset.originalString; - let data = { - encodedEmails: JSON.stringify({0: encodedEmail}), - }; - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - encodedEmailNodes.appendChild(apbctTooltip); - - apbct_admin_sendAJAX( - { - 'action': 'apbct_decode_email', - 'encodedEmails': data.encodedEmails, - }, - { - 'callback': function(result) { - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); - }, - 'notJson': true, - }, - ); - } -} - -/** - * @param {mixed} result - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { - if (result.success && result.data[0].is_allowed === true) { - // start process of visual decoding - setTimeout(function() { - // popup remove - let popup = document.getElementById('apbct_popup'); - if (popup !== null) { - let email = ''; - if (clickSource) { - let currentResultData; - result.data.forEach((row) => { - if (row.encoded_email === clickSource.dataset.originalString) { - currentResultData = row; - } - }); - - email = currentResultData.decoded_email.split(/[&?]/)[0]; - } else { - email = result.data[0].decoded_email; - } - // handle first node - let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); - // get email selectable by click - let selectableEmail = document.createElement('b'); - selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); - selectableEmail.innerText = email; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { - selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; - } else { - selectableEmail.title = ctAdminCommon.text__ee_click_to_select; - } - // add email to the first node - if (firstNode) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { - firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } else { - firstNode.innerHTML = ctAdminCommon.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } - - firstNode.setAttribute('style', 'flex-direction: row;'); - } - // remove animation - let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); - if (wrapper) { - wrapper.remove(); - } - // remove second node - let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); - if (secondNode) { - secondNode.remove(); - } - // add button - let buttonWrapper = document.createElement('span'); - buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; - if (!document.querySelector('.apbct-email-encoder-got-it-button')) { - let button = document.createElement('button'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { - button.innerText = ctPublicFunctions.text__ee_got_it; - } else { - button.innerText = ctAdminCommon.text__ee_got_it; - } - button.classList = 'apbct-email-encoder-got-it-button'; - button.addEventListener('click', function() { - document.body.classList.remove('apbct-popup-fade'); - popup.setAttribute('style', 'display:none'); - fillDecodedNodes(encodedEmailNodes, result); - // click on mailto if so - if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { - clickSource.click(); - } - }); - buttonWrapper.append(button); - popup.append(buttonWrapper); - } - } - }, 3000); - } else { - if (clickSource) { - if (result.success) { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { - ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); - } - } else { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { - ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); - } - } - } else { - console.log('result', result); - } - } -} - -/** - * Reset click event for encoded email - */ -function resetEncodedNodes() { - if (typeof ctPublic.encodedEmailNodes !== 'undefined') { - ctPublic.encodedEmailNodes.forEach(function(element) { - element.addEventListener('click', ctFillDecodedEmailHandler); - }); - } -} - -/** - * Show Decode Comment - * @param {string} comment - */ -function ctShowDecodeComment(comment) { - if ( ! comment ) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { - comment = ctPublicFunctions.text__ee_cannot_decode; - } else { - comment = ctAdminCommon.text__ee_cannot_decode; - } - } - - let popup = document.getElementById('apbct_popup'); - let popupText = document.getElementById('apbct_popup_text'); - if (popup !== null) { - document.body.classList.remove('apbct-popup-fade'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { - popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; - } else { - popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; - } - setTimeout(function() { - popup.setAttribute('style', 'display:none'); - }, 3000); - } -} - -/** - * Run filling for every node with decoding result. - * @param {mixed} encodedNodes - * @param {mixed} decodingResult - */ -function fillDecodedNodes(encodedNodes, decodingResult) { - if (encodedNodes.length > 0) { - for (let i = 0; i < encodedNodes.length; i++) { - // chek what is what - let currentResultData; - decodingResult.data.forEach((row) => { - if (row.encoded_email === encodedNodes[i].dataset.originalString) { - currentResultData = row; - } - }); - // quit case on cloud block - if (currentResultData.is_allowed === false) { - return; - } - // handler for mailto - if ( - typeof encodedNodes[i].href !== 'undefined' && - ( - encodedNodes[i].href.indexOf('mailto:') === 0 || - encodedNodes[i].href.indexOf('tel:') === 0 - ) - ) { - let linkTypePrefix; - if (encodedNodes[i].href.indexOf('mailto:') === 0) { - linkTypePrefix = 'mailto:'; - } else if (encodedNodes[i].href.indexOf('tel:') === 0) { - linkTypePrefix = 'tel:'; - } else { - continue; - } - let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); - let baseElementContent = encodedNodes[i].innerHTML; - encodedNodes[i].innerHTML = baseElementContent.replace( - encodedEmail, - currentResultData.decoded_email, - ); - encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; - - encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { - let encodedEmailTextInsideMailto = ''; - decodingResult.data.forEach((row) => { - if (row.encoded_email === el.dataset.originalString) { - encodedEmailTextInsideMailto = row.decoded_email; - } - }); - el.innerHTML = encodedEmailTextInsideMailto; - }); - } else { - encodedNodes[i].classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); - }, 2000); - } - // remove listeners - encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); - } - } else { - let currentResultData = decodingResult.data[0]; - encodedNodes.classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes); - }, 2000); - encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); - } -} - -/** - * @param {mixed} response - * @param {mixed} targetElement - */ -function ctProcessDecodedDataResult(response, targetElement) { - targetElement.setAttribute('title', ''); - targetElement.removeAttribute('style'); - ctFillDecodedEmail(targetElement, response.decoded_email); -} - -/** - * @param {mixed} target - * @param {string} email - */ -function ctFillDecodedEmail(target, email) { - target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); -} diff --git a/js/src/apbct-public-bundle_ext-protection_comm-func.js b/js/src/apbct-public-bundle_ext-protection_comm-func.js new file mode 100644 index 000000000..394191d30 --- /dev/null +++ b/js/src/apbct-public-bundle_ext-protection_comm-func.js @@ -0,0 +1,5749 @@ +/** + * @return {HTMLElement} event + */ +function apbctSetEmailDecoderPopupAnimation() { + const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; + const animationWrapper = document.createElement('div'); + animationWrapper.classList = 'apbct-ee-animation-wrapper'; + for (let i = 0; i < animationElements.length; i++) { + const apbctEEAnimationDogOne = document.createElement('span'); + apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; + apbctEEAnimationDogOne.innerText = '@'; + animationWrapper.append(apbctEEAnimationDogOne); + } + return animationWrapper; +} + +/** + * @param {mixed} event + */ +function ctFillDecodedEmailHandler(event = false) { + let clickSource = false; + let ctWlBrandname = ''; + let encodedEmail = ''; + if (typeof ctPublic !== 'undefined') { + this.removeEventListener('click', ctFillDecodedEmailHandler); + // remember clickSource + clickSource = this; + // globally remember if emails is mixed with mailto + ctPublic.encodedEmailNodesIsMixed = false; + ctWlBrandname = ctPublic.wl_brandname; + encodedEmail = ctPublic.encodedEmailNodes; + } else if (typeof ctAdminCommon !== 'undefined') { + ctWlBrandname = ctAdminCommon.plugin_name; + encodedEmail = ctAdminCommon.encodedEmailNode; + } + + // get fade + document.body.classList.add('apbct-popup-fade'); + // popup show + let encoderPopup = document.getElementById('apbct_popup'); + if (!encoderPopup) { + // construct popup + let waitingPopup = document.createElement('div'); + waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); + waitingPopup.setAttribute('id', 'apbct_popup'); + + // construct text header + let popupHeaderWrapper = document.createElement('span'); + popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; + let popupHeader = document.createElement('p'); + popupHeader.innerText = ctWlBrandname; + popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); + popupHeaderWrapper.append(popupHeader); + + // construct text wrapper + let popupTextWrapper = document.createElement('div'); + popupTextWrapper.setAttribute('id', 'apbct_popup_text'); + popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); + popupTextWrapper.style.color = 'black'; + + // construct text first node + // todo make translatable + let popupTextWaiting = document.createElement('p'); + popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; + } + popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); + + // construct text second node + // todo make translatable + let popupTextDecoding = document.createElement('p'); + popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { + popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; + } else { + popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; + } + + // appending + popupTextWrapper.append(popupTextWaiting); + popupTextWrapper.append(popupTextDecoding); + waitingPopup.append(popupHeaderWrapper); + waitingPopup.append(popupTextWrapper); + waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); + document.body.append(waitingPopup); + } else { + encoderPopup.setAttribute('style', 'display: inherit'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; + } + } + + apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); +} + +/** + * @param {mixed} event + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { + if (event && clickSource) { + // collect data + const javascriptClientData = getJavascriptClientData(); + let data = { + event_javascript_data: javascriptClientData, + post_url: document.location.href, + referrer: document.referrer, + encodedEmails: '', + }; + let encodedEmailsCollection = {}; + for (let i = 0; i < encodedEmailNodes.length; i++) { + // disable click for mailto + if ( + typeof encodedEmailNodes[i].href !== 'undefined' && + encodedEmailNodes[i].href.indexOf('mailto:') === 0 + ) { + event.preventDefault(); + ctPublic.encodedEmailNodesIsMixed = true; + } + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + apbct(encodedEmailNodes[i]).append(apbctTooltip); + + // collect encoded email strings + encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; + } + + // JSONify encoded email strings + data.encodedEmails = JSON.stringify(encodedEmailsCollection); + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_decode_email', + { + data: data, + method: 'POST', + callback: function(result) { + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + + // Using AJAX request and handler + } else { + data.action = 'apbct_decode_email'; + apbct_public_sendAJAX( + data, + { + notJson: false, + callback: function(result) { + console.log('result'); + console.log(result); + + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + } + } else { + const encodedEmail = encodedEmailNodes.dataset.originalString; + let data = { + encodedEmails: JSON.stringify({0: encodedEmail}), + }; + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + encodedEmailNodes.appendChild(apbctTooltip); + + apbct_admin_sendAJAX( + { + 'action': 'apbct_decode_email', + 'encodedEmails': data.encodedEmails, + }, + { + 'callback': function(result) { + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); + }, + 'notJson': true, + }, + ); + } +} + +/** + * @param {mixed} result + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { + if (result.success && result.data[0].is_allowed === true) { + // start process of visual decoding + setTimeout(function() { + // popup remove + let popup = document.getElementById('apbct_popup'); + if (popup !== null) { + let email = ''; + if (clickSource) { + let currentResultData; + result.data.forEach((row) => { + if (row.encoded_email === clickSource.dataset.originalString) { + currentResultData = row; + } + }); + + email = currentResultData.decoded_email.split(/[&?]/)[0]; + } else { + email = result.data[0].decoded_email; + } + // handle first node + let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); + // get email selectable by click + let selectableEmail = document.createElement('b'); + selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); + selectableEmail.innerText = email; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { + selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; + } else { + selectableEmail.title = ctAdminCommon.text__ee_click_to_select; + } + // add email to the first node + if (firstNode) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { + firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } else { + firstNode.innerHTML = ctAdminCommon.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } + + firstNode.setAttribute('style', 'flex-direction: row;'); + } + // remove animation + let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); + if (wrapper) { + wrapper.remove(); + } + // remove second node + let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); + if (secondNode) { + secondNode.remove(); + } + // add button + let buttonWrapper = document.createElement('span'); + buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; + if (!document.querySelector('.apbct-email-encoder-got-it-button')) { + let button = document.createElement('button'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { + button.innerText = ctPublicFunctions.text__ee_got_it; + } else { + button.innerText = ctAdminCommon.text__ee_got_it; + } + button.classList = 'apbct-email-encoder-got-it-button'; + button.addEventListener('click', function() { + document.body.classList.remove('apbct-popup-fade'); + popup.setAttribute('style', 'display:none'); + fillDecodedNodes(encodedEmailNodes, result); + // click on mailto if so + if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { + clickSource.click(); + } + }); + buttonWrapper.append(button); + popup.append(buttonWrapper); + } + } + }, 3000); + } else { + if (clickSource) { + if (result.success) { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { + ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); + } + } else { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { + ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); + } + } + } else { + console.log('result', result); + } + } +} + +/** + * Reset click event for encoded email + */ +function resetEncodedNodes() { + if (typeof ctPublic.encodedEmailNodes !== 'undefined') { + ctPublic.encodedEmailNodes.forEach(function(element) { + element.addEventListener('click', ctFillDecodedEmailHandler); + }); + } +} + +/** + * Show Decode Comment + * @param {string} comment + */ +function ctShowDecodeComment(comment) { + if ( ! comment ) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { + comment = ctPublicFunctions.text__ee_cannot_decode; + } else { + comment = ctAdminCommon.text__ee_cannot_decode; + } + } + + let popup = document.getElementById('apbct_popup'); + let popupText = document.getElementById('apbct_popup_text'); + if (popup !== null) { + document.body.classList.remove('apbct-popup-fade'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { + popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; + } else { + popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; + } + setTimeout(function() { + popup.setAttribute('style', 'display:none'); + }, 3000); + } +} + +/** + * Run filling for every node with decoding result. + * @param {mixed} encodedNodes + * @param {mixed} decodingResult + */ +function fillDecodedNodes(encodedNodes, decodingResult) { + if (encodedNodes.length > 0) { + for (let i = 0; i < encodedNodes.length; i++) { + // chek what is what + let currentResultData; + decodingResult.data.forEach((row) => { + if (row.encoded_email === encodedNodes[i].dataset.originalString) { + currentResultData = row; + } + }); + // quit case on cloud block + if (currentResultData.is_allowed === false) { + return; + } + // handler for mailto + if ( + typeof encodedNodes[i].href !== 'undefined' && + ( + encodedNodes[i].href.indexOf('mailto:') === 0 || + encodedNodes[i].href.indexOf('tel:') === 0 + ) + ) { + let linkTypePrefix; + if (encodedNodes[i].href.indexOf('mailto:') === 0) { + linkTypePrefix = 'mailto:'; + } else if (encodedNodes[i].href.indexOf('tel:') === 0) { + linkTypePrefix = 'tel:'; + } else { + continue; + } + let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); + let baseElementContent = encodedNodes[i].innerHTML; + encodedNodes[i].innerHTML = baseElementContent.replace( + encodedEmail, + currentResultData.decoded_email, + ); + encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; + + encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { + let encodedEmailTextInsideMailto = ''; + decodingResult.data.forEach((row) => { + if (row.encoded_email === el.dataset.originalString) { + encodedEmailTextInsideMailto = row.decoded_email; + } + }); + el.innerHTML = encodedEmailTextInsideMailto; + }); + } else { + encodedNodes[i].classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); + }, 2000); + } + // remove listeners + encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); + } + } else { + let currentResultData = decodingResult.data[0]; + encodedNodes.classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes); + }, 2000); + encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); + } +} + +/** + * @param {mixed} response + * @param {mixed} targetElement + */ +function ctProcessDecodedDataResult(response, targetElement) { + targetElement.setAttribute('title', ''); + targetElement.removeAttribute('style'); + ctFillDecodedEmail(targetElement, response.decoded_email); +} + +/** + * @param {mixed} target + * @param {string} email + */ +function ctFillDecodedEmail(target, email) { + target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); +} + +/** + * Base class + */ +class ApbctCore { + ajax_parameters = {}; + restParameters = {}; + + selector = null; + elements = []; + + // Event properties + eventCallback; + eventSelector; + event; + + /** + * Default constructor + * @param {string} selector + */ + constructor(selector) { + this.select(selector); + } + + /** + * Get elements by CSS selector + * + * @param {string} selector + * @return {*} + */ + select(selector) { + if (selector instanceof HTMLCollection) { + this.selector = null; + this.elements = []; + this.elements = Array.prototype.slice.call(selector); + } else if ( typeof selector === 'object' ) { + this.selector = null; + this.elements = []; + this.elements[0] = selector; + } else if ( typeof selector === 'string' ) { + this.selector = selector; + this.elements = Array.prototype.slice.call(document.querySelectorAll(selector)); + // this.elements = document.querySelectorAll(selector)[0]; + } else { + this.deselect(); + } + + return this; + } + + /** + * @param {object|string} elemToAdd + */ + addElement(elemToAdd) { + if ( typeof elemToAdd === 'object' ) { + this.elements.push(elemToAdd); + } else if ( typeof elemToAdd === 'string' ) { + this.selector = elemToAdd; + this.elements = Array.prototype.slice.call(document.querySelectorAll(elemToAdd)); + } else { + this.deselect(); + } + } + + /** + * @param {object} elem + */ + push(elem) { + this.elements.push(elem); + } + + /** + * reduce + */ + reduce() { + this.elements = this.elements.slice(0, -1); + } + + /** + * deselect + */ + deselect() { + this.elements = []; + } + + /** + * Set or get CSS for/of currently selected element + * + * @param {object|string} style + * @param {boolean} getRaw + * + * @return {boolean|*} + */ + css(style, getRaw) { + getRaw = getRaw || false; + + // Set style + if (typeof style === 'object') { + const stringToCamelCase = (str) => + str.replace(/([-_][a-z])/g, (group) => + group + .toUpperCase() + .replace('-', '') + .replace('_', ''), + ); + + // Apply multiple styles + for (const styleName in style) { + if (Object.hasOwn(style, styleName)) { + const DomStyleName = stringToCamelCase(styleName); + + // Apply to multiple elements (currently selected) + for (let i=0; i= 0; i-- ) { + if ( ! this.isElem(this.elements[i], filter) ) { + this.elements.splice(Number(i), 1); + } + } + + return this; + } + + /** + * NODES + */ + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parent(filter) { + this.select(this.elements[0].parentElement); + + if ( typeof filter !== 'undefined' && ! this.is(filter) ) { + this.deselect(); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parents(filter) { + this.select(this.elements[0]); + + for ( ; this.elements[this.elements.length - 1].parentElement !== null; ) { + this.push(this.elements[this.elements.length - 1].parentElement); + } + + this.elements.splice(0, 1); // Deleting initial element from the set + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + children(filter) { + this.select(this.elements[0].children); + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + siblings(filter) { + let current = this.elements[0]; // Remember current to delete it later + + this.parent(); + this.children(filter); + this.elements.splice(this.elements.indexOf(current), 1); // Remove current element + + return this; + } + + /** ************ DOM MANIPULATIONS **************/ + remove() { + for (let elem of this.elements) { + elem.remove(); + } + } + + /** + * @param {string} content + */ + after(content) { + for (let elem of this.elements) { + elem.after(content); + } + } + + /** + * @param {string} content + */ + append(content) { + for (let elem of this.elements) { + elem.append(content); + } + } + + /** ************ ANIMATION **************/ + /** + * @param {number} time + */ + fadeIn(time) { + for (let elem of this.elements) { + elem.style.opacity = 0; + elem.style.display = 'block'; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity + (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity < 1) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } + }; + + tick(); + } + } + + /** + * @param {number} time + */ + fadeOut(time) { + for (let elem of this.elements) { + elem.style.opacity = 1; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity > 0) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } else { + elem.style.display = 'none'; + } + }; + + tick(); + } + } +} + +/** + * Hack + * + * Make a proxy to keep both properties and methods from: + * - the native object and + * - the new one from ApbctCore for selected element. + * + * For example: + * apbct('#id).innerHTML = 'some'; + * apbct('#id).css({'backgorund-color': 'black'}); + */ +// apbct = new Proxy( +// apbct, +// { +// get(target, prop) { +// if (target.elements.length) { +// return target.elements[0][prop]; +// } else { +// return null; +// } +// }, +// set(target, prop, value){ +// if (target.elements.length) { +// target.elements[0][prop] = value; +// return true; +// } else { +// return false; +// } +// }, +// apply(target, thisArg, argArray) { +// +// } +// } +// ); + +/** + * @param {mixed} msg + * @param {string} url + */ +function ctProcessError(msg, url) { + let log = {}; + if (msg && msg.message) { + log.err = { + 'msg': msg.message, + 'file': !!msg.fileName ? msg.fileName : false, + 'ln': !!msg.lineNumber ? msg.lineNumber : !!lineNo ? lineNo : false, + 'col': !!msg.columnNumber ? msg.columnNumber : !!columnNo ? columnNo : false, + 'stacktrace': !!msg.stack ? msg.stack : false, + 'cause': !!url ? JSON.stringify(url) : false, + 'errorObj': !!error ? error : false, + }; + } else { + log.err = { + 'msg': msg, + }; + + if (!!url) { + log.err.file = url; + } + } + + log.url = window.location.href; + log.userAgent = window.navigator.userAgent; + + let ctJsErrors = 'ct_js_errors'; + let errArray = localStorage.getItem(ctJsErrors); + if (errArray === null) errArray = '[]'; + errArray = JSON.parse(errArray); + for (let i = 0; i < errArray.length; i++) { + if (errArray[i].err.msg === log.err.msg) { + return; + } + } + + errArray.push(log); + localStorage.setItem(ctJsErrors, JSON.stringify(errArray)); +} + +if (Math.floor(Math.random() * 100) === 1) { + window.onerror = function(exception, url) { + let filterWords = ['apbct', 'ctPublic']; + let length = filterWords.length; + while (length--) { + if (exception.indexOf(filterWords[length]) !== -1) { + ctProcessError(exception, url); + } + } + + return false; + }; +} + +/** + * Select actual WP nonce depending on the ajax type and the fresh nonce provided. + * @return {string} url + */ +function selectActualNonce() { + let defaultNonce = ''; + // return fresh nonce immediately if persists + if ( + ctPublicFunctions.hasOwnProperty('_fresh_nonce') && + typeof ctPublicFunctions._fresh_nonce === 'string' && + ctPublicFunctions._fresh_nonce.length > 0 + ) { + return ctPublicFunctions._fresh_nonce; + } + // select from default rest/ajax nonces + if ( + ctPublicFunctions.data__ajax_type === 'admin_ajax' && + ctPublicFunctions.hasOwnProperty('_ajax_nonce') && + typeof ctPublicFunctions._ajax_nonce === 'string' && + ctPublicFunctions._ajax_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._ajax_nonce; + } + if ( + ctPublicFunctions.data__ajax_type === 'rest' && + ctPublicFunctions.hasOwnProperty('_rest_nonce') && + typeof ctPublicFunctions._rest_nonce === 'string' && + ctPublicFunctions._rest_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._rest_nonce; + } + + return defaultNonce; +} + +/** + * Enter point to ApbctCore class + * + * @param {array|object} params + * @return {*} + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +function apbct(params) { + return new ApbctCore() + .select(params); +} + +/** + * ApbctXhr + */ +class ApbctXhr { + xhr = new XMLHttpRequest(); + + // Base parameters + method = 'POST'; // HTTP-request type + url = ''; // URL to send the request + async = true; + user = null; // HTTP-authorization username + password = null; // HTTP-authorization password + data = {}; // Data to send + + // Optional params + button = null; // Button that should be disabled when request is performing + spinner = null; // Spinner that should appear when request is in process + progressbar = null; // Progress bar for the current request + context = this; // Context + callback = null; + onErrorCallback = null; + + responseType = 'json'; // Expected data type from server + headers = {}; + timeout = 15000; // Request timeout in milliseconds + + methods_to_convert_data_to_URL = [ + 'GET', + 'HEAD', + ]; + + body = null; + http_code = 0; + status_text = ''; + + // eslint-disable-next-line require-jsdoc + constructor(parameters) { + // Set class properties + for ( let key in parameters ) { + if ( typeof this[key] !== 'undefined' ) { + this[key] = parameters[key]; + } + } + + // Modifying DOM-elements + this.prepare(); + + // Modify URL with data for GET and HEAD requests + if ( Object.keys(this.data).length ) { + this.deleteDoubleJSONEncoding(this.data); + this.convertData(); + } + + if ( ! this.url ) { + console.log('%cXHR%c not URL provided', + 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;'); + return false; + } + + // Configure the request + this.xhr.open(this.method, this.url, this.async, this.user, this.password); + this.setHeaders(); + + this.xhr.responseType = this.responseType; + this.xhr.timeout = this.timeout; + + /* EVENTS */ + // Monitoring status + this.xhr.onreadystatechange = function() { + if (this.isWpNonceError()) { + this.getFreshNonceAndRerunXHR(parameters); + return; + } + this.onReadyStateChange(); + }.bind(this); + + // Run callback + this.xhr.onload = function() { + this.onLoad(); + }.bind(this); + + // On progress + this.xhr.onprogress = function(event) { + this.onProgress(event); + }.bind(this); + + // On error + this.xhr.onerror = function() { + this.onError(); + }.bind(this); + + this.xhr.ontimeout = function() { + this.onTimeout(); + }.bind(this); + + // Send the request + this.xhr.send(this.body); + } + + /** + * prepare + */ + prepare() { + // Disable button + if (this.button) { + this.button.setAttribute('disabled', 'disabled'); + this.button.style.cursor = 'not-allowed'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'inline'; + } + } + + /** + * complete + */ + complete() { + this.http_code = this.xhr.status; + this.status_text = this.xhr.statusText; + + // Disable button + if (this.button) { + this.button.removeAttribute('disabled'); + this.button.style.cursor = 'auto'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'none'; + } + + if ( this.progressbar ) { + this.progressbar.fadeOut('slow'); + } + } + + /** + * onReadyStateChange + */ + onReadyStateChange() { + if (this.on_ready_state_change !== null && typeof this.on_ready_state_change === 'function') { + this.on_ready_state_change(); + } + } + + /** + * @param {object} event + */ + onProgress(event) { + if (this.on_progress !== null && typeof this.on_progress === 'function') { + this.on_progress(); + } + } + + /** + * onError + */ + onError() { + console.log('error'); + + this.complete(); + this.error( + this.http_code, + this.status_text, + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * onTimeout + */ + onTimeout() { + this.complete(); + this.error( + 0, + 'timeout', + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback('Timeout'); + } + } + + /** + * @return {boolean} + */ + onLoad() { + this.complete(); + + if (this.responseType === 'json' ) { + if (this.xhr.response === null) { + this.error(this.http_code, this.status_text, 'No response'); + return false; + } else if ( typeof this.xhr.response.error !== 'undefined') { + this.error(this.http_code, this.status_text, this.xhr.response.error); + return false; + } + } + + if (this.callback !== null && typeof this.callback === 'function') { + this.callback.call(this.context, this.xhr.response, this.data); + } + } + + /** + * Check if 403 code of WP nonce error + * @return {bool} + */ + isWpNonceError() { + let restErrror = false; + let ajaxErrror = false; + // check rest error + if (this.xhr.readyState == 4) { + restErrror = ( + typeof this.xhr.response === 'object' && this.xhr.response !== null && + this.xhr.response.hasOwnProperty('data') && + this.xhr.response.data.hasOwnProperty('status') && + this.xhr.response.data.status === 403 + ); + ajaxErrror = this.xhr.response === '-1' && this.xhr.status === 403; + } + // todo check AJAX error + return restErrror || ajaxErrror; + } + + /** + * Get the fresh nonce and rerun the initial XHR with params + * @param {[]} initialRequestParams + */ + getFreshNonceAndRerunXHR(initialRequestParams) { + let noncePrev = ''; + + // Check if initialRequestParams['headers']['X-WP-Nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('headers') && + initialRequestParams.headers.hasOwnProperty('X-WP-Nonce') + ) { + noncePrev = initialRequestParams['headers']['X-WP-Nonce']; + } + + // Check if initialRequestParams['data']['_ajax_nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('data') && + initialRequestParams.data.hasOwnProperty('_ajax_nonce') + ) { + noncePrev = initialRequestParams['data']['_ajax_nonce']; + } + + // Nonce is not provided. Exit. + if ( noncePrev === '' ) { + return; + } + + // prepare params for refreshing nonce + let params = {}; + params.method = 'POST'; + params.data = { + 'spbc_remote_call_action': 'get_fresh_wpnonce', + 'plugin_name': 'antispam', + 'nonce_prev': noncePrev, + 'initial_request_params': initialRequestParams, + }; + params.notJson = true; + params.url = ctPublicFunctions.host_url; + // this callback will rerun the XHR with initial params + params.callback = function(...args) { + // the refresh result itself + let freshNonceResult = args[0]; + let newRequestParams = false; + // provided initial params + if (args[1] !== undefined && args[1].hasOwnProperty('initial_request_params')) { + newRequestParams = args[1].initial_request_params; + } + if (newRequestParams && freshNonceResult.hasOwnProperty('wpnonce')) { + ctPublicFunctions._fresh_nonce = freshNonceResult.wpnonce; + if (ctPublicFunctions.data__ajax_type === 'rest') { + new ApbctCore().rest(newRequestParams); + } else { + new ApbctCore().ajax(newRequestParams); + } + } + }; + // run the nonce refreshing call + new ApbctXhr(params); + } + + /** + * @param {number} httpCode + * @param {string} statusText + * @param {string} additionalMsg + */ + error(httpCode, statusText, additionalMsg) { + let errorString = ''; + + if ( statusText === 'timeout' ) { + errorString += 'Server response timeout'; + } else if ( httpCode === 200 ) { + if ( statusText === 'parsererror' ) { + errorString += 'Unexpected response from server. See console for details.'; + } else { + errorString += 'Unexpected error. Status: ' + statusText + '.'; + if ( typeof additionalMsg !== 'undefined' ) { + errorString += ' Additional error info: ' + additionalMsg; + } + } + } else if (httpCode === 500) { + errorString += 'Internal server error.'; + } else { + errorString += 'Unexpected response code:' + httpCode; + } + + this.errorOutput( errorString ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * @param {string} errorMsg + */ + errorOutput(errorMsg) { + console.log( '%c ctXHR error: %c' + errorMsg, 'color: red;', 'color: grey;' ); + } + + /** + * setHeaders + */ + setHeaders() { + // Set headers if passed + for ( let headerName in this.headers ) { + if ( typeof this.headers[headerName] !== 'undefined' ) { + this.xhr.setRequestHeader(headerName, this.headers[headerName]); + } + } + } + + /** + * @return {string|*} + */ + convertData() { + // GET, HEAD request-type + if ( ~this.methods_to_convert_data_to_URL.indexOf( this.method ) ) { + return this.convertDataToURL(); + + // POST request-type + } else { + return this.convertDataToBody(); + } + } + + /** + * @return {string} + */ + convertDataToURL() { + let paramsAppendix = new URLSearchParams(this.data).toString(); + let paramsPrefix = this.url.match(/^(https?:\/{2})?[a-z0-9.]+\?/) ? '&' : '?'; + this.url += paramsPrefix + paramsAppendix; + + return this.url; + } + + /** + * @return {null} + */ + convertDataToBody() { + this.body = new FormData(); + for (let dataKey in this.data) { + if (Object.hasOwn(this.data, dataKey)) { + this.body.append( + dataKey, + typeof this.data[dataKey] === 'object' ? + JSON.stringify(this.data[dataKey]) : + this.data[dataKey], + ); + } + } + + return this.body; + } + + /** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {object} object + * @return {*} + */ + deleteDoubleJSONEncoding(object) { + if ( typeof object === 'object') { + for (let objectKey in object) { + if (Object.hasOwn(object, objectKey)) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = this.deleteDoubleJSONEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + let parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + } + + return object; + } +} +// eslint-disable-next-line require-jsdoc +class ApbctAjax extends ApbctXhr { + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + args.data._ajax_nonce = selectActualNonce(); + super(args); + } +} +// eslint-disable-next-line require-jsdoc +class ApbctRest extends ApbctXhr { + static default_route = ctPublicFunctions._rest_url + 'cleantalk-antispam/v1/'; + route = ''; + + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + const nonce = selectActualNonce(); + args.url = ApbctRest.default_route + args.route; + args.headers = { + 'X-WP-Nonce': nonce, + }; + super(args); + } +} + +// add hasOwn +if (!Object.prototype.hasOwn) { + Object.defineProperty(Object.prototype, 'hasOwn', { // eslint-disable-line + value: function(property) { + return Object.prototype.hasOwnProperty.call(this, property); + }, + enumerable: false, + configurable: true, + writable: true, + }); +} + +/** + * Class collecting user activity data + * + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +class ApbctCollectingUserActivity { + elementBody = document.querySelector('body'); + collectionForms = document.forms; + /** + * Constructor + */ + constructor() { + this.setListeners(); + } + + /** + * Set listeners + */ + setListeners() { + this.elementBody.addEventListener('click', (event) => { + this.checkElementInForms(event, 'addClicks'); + }); + + this.elementBody.addEventListener('mouseup', (event) => { + const selectedType = document.getSelection().type.toString(); + if (selectedType == 'Range') { + this.addSelected(); + } + }); + + this.elementBody.addEventListener('mousemove', (event) => { + this.checkElementInForms(event, 'trackMouseMovement'); + }); + } + + /** + * Checking if there is an element in the form + * @param {object} event + * @param {string} addTarget + */ + checkElementInForms(event, addTarget) { + let resultCheck; + for (let i = 0; i < this.collectionForms.length; i++) { + if ( + event.target.outerHTML.length > 0 && + this.collectionForms[i].innerHTML.length > 0 + ) { + resultCheck = this.collectionForms[i].innerHTML.indexOf(event.target.outerHTML); + } else { + resultCheck = -1; + } + } + + switch (addTarget) { + case 'addClicks': + if (resultCheck < 0) { + this.addClicks(); + } + break; + case 'trackMouseMovement': + if (resultCheck > -1) { + this.trackMouseMovement(); + } + break; + default: + break; + } + } + + /** + * Add clicks + */ + addClicks() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.clicks) { + document.ctCollectingUserActivityData.clicks++; + } else { + document.ctCollectingUserActivityData.clicks = 1; + } + return; + } + + document.ctCollectingUserActivityData = {clicks: 1}; + } + + /** + * Add selected + */ + addSelected() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.selected) { + document.ctCollectingUserActivityData.selected++; + } else { + document.ctCollectingUserActivityData.selected = 1; + } + return; + } + + document.ctCollectingUserActivityData = {selected: 1}; + } + + /** + * Track mouse movement + */ + trackMouseMovement() { + if (!document.ctCollectingUserActivityData) { + document.ctCollectingUserActivityData = {}; + } + if (!document.ctCollectingUserActivityData.mouseMovementsInsideForm) { + document.ctCollectingUserActivityData.mouseMovementsInsideForm = false; + } + + document.ctCollectingUserActivityData.mouseMovementsInsideForm = true; + } +} + +/** + * @param {object|array|string} cookies + * @param {object|array|string} value + * @param {string|number} expires + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetCookie( cookies, value, expires ) { + let listOfCookieNamesToForceAlt = [ + 'ct_sfw_pass_key', + 'ct_sfw_passed', + 'wordpress_apbct_antibot', + 'apbct_anticrawler_passed', + 'apbct_bot_detector_exist', + 'apbct_antiflood_passed', + 'apbct_email_encoder_passed', + ]; + + let skipAlt = false; + + if ( typeof cookies === 'string') { + skipAlt = cookies === 'ct_pointer_data'; + if ( typeof value === 'string' || typeof value === 'number' ) { + cookies = [[cookies, value, expires]]; + } + } + + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + let forcedAltCookiesSet = []; + cookies.forEach( function(item) { + if (listOfCookieNamesToForceAlt.indexOf(item[0]) !== -1) { + forcedAltCookiesSet.push(item); + } else { + apbctLocalStorage.set(item[0], item[1]); + } + }); + + // if cookies from list found use alt cookies for this selection set + if ( forcedAltCookiesSet.length > 0 ) { + ctSetAlternativeCookie(forcedAltCookiesSet); + } + + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } else { + ctNoCookieAttachHiddenFieldsToForms(); + } + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } + cookies.forEach( function(item) { + const _expires = typeof item[2] !== 'undefined' ? 'expires=' + expires + '; ' : ''; + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = ctPublicFunctions.cookiePrefix + + item[0] + + '=' + + encodeURIComponent(item[1]) + + '; ' + + _expires + + 'path=/; samesite=lax' + + ctSecure; + }); + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' && !skipAlt ) { + ctSetAlternativeCookie(cookies); + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctDetectForcedAltCookiesForms() { + let ninjaFormsSign = document.querySelectorAll('#tmpl-nf-layout').length > 0; + let elementorUltimateAddonsRegister = document.querySelectorAll('.uael-registration-form-wrapper').length > 0; + let smartFormsSign = document.querySelectorAll('script[id*="smart-forms"]').length > 0; + let jetpackCommentsForm = document.querySelectorAll('iframe[name="jetpack_remote_comment"]').length > 0; + let cwginstockForm = document.querySelectorAll('.cwginstock-subscribe-form').length > 0; + let userRegistrationProForm = document.querySelectorAll('div[id^="user-registration-form"]').length > 0; + let etPbDiviSubscriptionForm = document.querySelectorAll('div[class^="et_pb_newsletter_form"]').length > 0; + let fluentBookingApp = document.querySelectorAll('div[class^="fluent_booking_app"]').length > 0; + let bloomPopup = document.querySelectorAll('div[class^="et_bloom_form_container"]').length > 0; + let pafeFormsFormElementor = document.querySelectorAll('div[class*="pafe-form"]').length > 0; + let otterForm = document.querySelectorAll('div [class*="otter-form"]').length > 0; + let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').length > 0; + ctPublic.force_alt_cookies = smartFormsSign || + ninjaFormsSign || + jetpackCommentsForm || + elementorUltimateAddonsRegister || + cwginstockForm || + userRegistrationProForm || + etPbDiviSubscriptionForm || + fluentBookingApp || + pafeFormsFormElementor || + bloomPopup || + otterForm || + smartQuizBuilder; + + setTimeout(function() { + if (!ctPublic.force_alt_cookies) { + let bookingPress = document.querySelectorAll('main[id^="bookingpress_booking_form"]').length > 0; + ctPublic.force_alt_cookies = bookingPress; + } + }, 1000); +} + +// eslint-disable-next-line require-jsdoc +function ctSetAlternativeCookie(cookies, params) { + if (typeof (getJavascriptClientData) === 'function' ) { + // reprocess already gained cookies data + if (Array.isArray(cookies)) { + cookies = getJavascriptClientData(cookies); + } + } else { + console.log('APBCT ERROR: getJavascriptClientData() is not loaded'); + } + + try { + cookies = JSON.parse(cookies); + } catch (e) { + console.log('APBCT ERROR: JSON parse error:' + e); + return; + } + + const callback = params && params.callback || null; + const onErrorCallback = params && params.onErrorCallback || null; + + if ( params && params.forceAltCookies ) { + cookies.apbct_force_alt_cookies = true; + } + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + // fix for url encoded cookie apbct_pixel_url on REST route + if (typeof cookies.apbct_pixel_url === 'string' && + cookies.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); + } + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_alt_session__save__AJAX', + cookies: cookies, + }, + { + notJson: 1, + callback: callback, + onErrorCallback: onErrorCallback, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * Get cookie by name + * @param name + * @return {string|undefined} + */ +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctGetCookie(name) { + let matches = document.cookie.match(new RegExp( + '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)', + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctDeleteCookie(cookieName) { + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + return; + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = cookieName + '=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax' + ctSecure; + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' ) { + // @ToDo implement this logic + } +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendAJAX(data, params, obj) { + // Default params + let _params = []; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['callback_context'] = params.callback_context || null; + _params['callback_params'] = params.callback_params || null; + _params['async'] = params.async || true; + _params['notJson'] = params.notJson || null; + _params['responseType']= params.notJson ? 'text' : 'json'; + _params['timeout'] = params.timeout || 15000; + _params['obj'] = obj || null; + _params['button'] = params.button || null; + _params['spinner'] = params.spinner || null; + _params['progressbar'] = params.progressbar || null; + _params['silent'] = params.silent || null; + _params['no_nonce'] = params.no_nonce || null; + _params['data'] = data; + _params['url'] = ctPublicFunctions._ajax_url; + const nonce = selectActualNonce(); + + if (typeof (data) === 'string') { + if ( ! _params['no_nonce'] ) { + _params['data'] = _params['data'] + '&_ajax_nonce=' + nonce; + } + _params['data'] = _params['data'] + '&no_cache=' + Math.random(); + } else { + if ( ! _params['no_nonce'] ) { + _params['data']._ajax_nonce = nonce; + } + _params['data'].no_cache = Math.random(); + } + + new ApbctCore().ajax(_params); +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendREST( route, params ) { + let _params = []; + _params['route'] = route; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['data'] = params.data || []; + _params['method'] = params.method || 'POST'; + + new ApbctCore().rest(_params); +} + +/** + * Generate unique ID + * @return {string} + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function apbctGenerateUniqueID() { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10); +} + +let apbctLocalStorage = { + get: function(key, property) { + if ( typeof property === 'undefined' ) { + property = 'value'; + } + const storageValue = localStorage.getItem(key); + if ( storageValue !== null ) { + try { + const json = JSON.parse(storageValue); + if ( json.hasOwnProperty(property) ) { + try { + // if property can be parsed as JSON - do it + return JSON.parse( json[property] ); + } catch (e) { + // if not - return string of value + return json[property].toString(); + } + } else { + return json; + } + } catch (e) { + return storageValue; + } + } + return false; + }, + set: function(key, value, isJson = true) { + if (isJson) { + let objToSave = {'value': JSON.stringify(value), 'timestamp': Math.floor(new Date().getTime() / 1000)}; + localStorage.setItem(key, JSON.stringify(objToSave)); + } else { + localStorage.setItem(key, value); + } + }, + isAlive: function(key, maxLifetime) { + if ( typeof maxLifetime === 'undefined' ) { + maxLifetime = 86400; + } + const keyTimestamp = this.get(key, 'timestamp'); + return keyTimestamp + maxLifetime > Math.floor(new Date().getTime() / 1000); + }, + isSet: function(key) { + return localStorage.getItem(key) !== null; + }, + delete: function(key) { + localStorage.removeItem(key); + }, + getCleanTalkData: function() { + let data = {}; + for (let i=0; i this.checkBotCallback(result), + }); + } else if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + data.action = 'apbct_force_protection_check_bot'; + apbct_public_sendAJAX(data, {callback: (result) => this.checkBotCallback(result)}); + } + } + + /** + * Check bot callback + * @param {Object} result + * @return {void} + */ + checkBotCallback(result) { + // if error occurred + if (result.data && result.data.status && result.data.status !== 200) { + console.log('ApbctForceProtection connection error occurred'); + this.decodeForms(); + return; + } + + if (typeof result === 'string') { + try { + result = JSON.parse(result); + } catch (e) { + console.log('ApbctForceProtection decodeForms error', e); + this.decodeForms(); + return; + } + } + + if (typeof result === 'object' && result.allow && result.allow === 1) { + this.decodeForms(); + document.dispatchEvent(new Event('apbctForceProtectionAllowed')); + } else { + this.showMessageForBot(result.message); + } + } + + /** + * Decode forms + * @return {void} + */ + decodeForms() { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + + try { + if (form && typeof(form) == 'string') { + wrapper.outerHTML = atob(form); + } + } catch (error) { + console.log(error); + } + }); + } + + /** + * Show message for bot + * @param {string} message + * @return {void} + */ + showMessageForBot(message) { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + if (form) { + wrapper.outerHTML = '
' + message + '
'; + } + }); + } +} + +/** + * Force protection + */ +function apbctForceProtect() { + if (ctPublic.settings__forms__force_protection && typeof ApbctForceProtection !== 'undefined') { + new ApbctForceProtection(); + } +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbctForceProtect(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbctForceProtect); + } +} + +/** + * Class for gathering data about user typing. + * + * ============================== + * isAutoFill - only person can use auto fill + * isUseBuffer - use buffer for fill current field + * ============================== + * lastKeyTimestamp - timestamp of last key press in current field + * speedDelta - change for each key press in current field, + * as difference between current and previous key press timestamps, + * robots in general have constant speed of typing. + * If speedDelta is constant for each key press in current field, + * so, speedDelta will be roughly to 0, then it is robot. + * ============================== + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +class CTTypoData { + fieldData = { + isAutoFill: false, + isUseBuffer: false, + speedDelta: 0, + firstKeyTimestamp: 0, + lastKeyTimestamp: 0, + lastDelta: 0, + countOfKey: 0, + }; + + fields = document.querySelectorAll('textarea[name=comment]'); + + data = []; + + /** + * Gather fields. + */ + gatheringFields() { + let fieldSet = Array.prototype.slice.call(this.fields); + fieldSet.forEach((field, i) => { + this.data.push(Object.assign({}, this.fieldData)); + }); + } + + /** + * Set listeners. + */ + setListeners() { + this.fields.forEach((field, i) => { + field.addEventListener('paste', () => { + this.data[i].isUseBuffer = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('onautocomplete', () => { + this.data[i].isAutoFill = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('input', () => { + this.data[i].countOfKey++; + let time = + new Date(); + let currentDelta = 0; + + if (this.data[i].countOfKey === 1) { + this.data[i].lastKeyTimestamp = time; + this.data[i].firstKeyTimestamp = time; + return; + } + + currentDelta = time - this.data[i].lastKeyTimestamp; + if (this.data[i].countOfKey === 2) { + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + return; + } + + if (this.data[i].countOfKey > 2) { + this.data[i].speedDelta += Math.abs(this.data[i].lastDelta - currentDelta); + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + } + }); + }); + } +} + +// eslint-disable-next-line camelcase +const ctDate = new Date(); +const ctTimeMs = new Date().getTime(); +let ctMouseEventTimerFlag = true; // Reading interval flag +let ctMouseData = []; +let ctMouseDataCounter = 0; +let ctCheckedEmails = {}; +let ctCheckedEmailsExist = {}; +let ctMouseReadInterval; +let ctMouseWriteDataInterval; +let tokenCheckerIntervalId; +let botDetectorLogLastUpdate = 0; +let botDetectorLogEventTypesCollected = []; + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_attach_event_handler(elem, event, callback) { + if (typeof window.addEventListener === 'function') elem.addEventListener(event, callback); + else elem.attachEvent(event, callback); +} +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_remove_event_handler(elem, event, callback) { + if (typeof window.removeEventListener === 'function') elem.removeEventListener(event, callback); + else elem.detachEvent(event, callback); +} + +// Writing first key press timestamp +const ctFunctionFirstKey = function output(event) { + let KeyTimestamp = Math.floor(new Date().getTime() / 1000); + ctSetCookie('ct_fkp_timestamp', KeyTimestamp); + ctKeyStopStopListening(); +}; + +/** + * Run cron jobs + */ +// forms handler cron +cronFormsHandler(2000); + +// bot_detector frontend_data log alt session saving cron +if ( + ctPublicFunctions.hasOwnProperty('data__bot_detector_enabled') && + ctPublicFunctions.data__bot_detector_enabled == 1 && + ctPublicFunctions.hasOwnProperty('data__frontend_data_log_enabled') && + ctPublicFunctions.data__frontend_data_log_enabled == 1 +) { + sendBotDetectorLogToAltSessions(1000); +} +/** + * Cron jobs end. + */ + +// mouse read +if (ctPublic.data__key_is_ok) { + // Reading interval + ctMouseReadInterval = setInterval(function() { + ctMouseEventTimerFlag = true; + }, 150); + + // Writting interval + ctMouseWriteDataInterval = setInterval(function() { + ctSetCookie('ct_pointer_data', JSON.stringify(ctMouseData)); + }, 1200); +} + +// Logging mouse position each 150 ms +const ctFunctionMouseMove = function output(event) { + ctSetMouseMoved(); + if (ctMouseEventTimerFlag === true) { + ctMouseData.push([ + Math.round(event.clientY), + Math.round(event.clientX), + Math.round(new Date().getTime() - ctTimeMs), + ]); + + ctMouseDataCounter++; + ctMouseEventTimerFlag = false; + if (ctMouseDataCounter >= 50) { + ctMouseStopData(); + } + } +}; + +/** + * Do handle periodical actions. + * @param {int} cronStartTimeout Time to go before cron start. + */ +function cronFormsHandler(cronStartTimeout = 2000) { + setTimeout(function() { + setInterval(function() { + restartFieldsListening(); + restartBotDetectorEventTokenAttach(); + }, 2000); + }, cronStartTimeout); +} + +/** + * Send BotDetector logs data to alternative sessions. + * If log_last_update has changed and log contains new event types, the log will be sent to the alternative sessions. + * @param {int} cronStartTimeout delay before cron start + * @param {int} interval check fires on interval + */ +function sendBotDetectorLogToAltSessions(cronStartTimeout = 3000, interval = 1000) { + setTimeout(function() { + setInterval(function() { + const currentLog = apbctLocalStorage.get('ct_bot_detector_frontend_data_log'); + if (needsSaveLogToAltSessions(currentLog)) { + botDetectorLogLastUpdate = currentLog.log_last_update; + // the log will be taken from javascriptclientdata + ctSetAlternativeCookie([], {forceAltCookies: true}); + } + }, interval); + }, cronStartTimeout); +} + +/** + * Check if the log needs to be saved to the alt sessions. If the log has new event types, it will be saved. + * @param {object} currentLog + * @return {boolean} + */ +function needsSaveLogToAltSessions(currentLog) { + if ( + currentLog && currentLog.hasOwnProperty('log_last_update') && + botDetectorLogLastUpdate !== currentLog.log_last_update + ) { + try { + for (let i = 0; i < currentLog.records.length; i++) { + const currentType = currentLog.records[i].frontend_data.js_event; + // check if this event type was already collected + if (currentType !== undefined && botDetectorLogEventTypesCollected.includes(currentType)) { + continue; + } + // add new event type to collection, this type will be sent to the alt sessions further + botDetectorLogEventTypesCollected.push(currentType); + return true; + } + } catch (e) { + console.log('APBCT: bot detector log collection error: ' . e.toString()); + } + } + return false; +} + +/** + * Restart event_token attachment if some forms load after document ready. + */ +function restartBotDetectorEventTokenAttach() { + // List there any new conditions, right now it works only for LatePoint forms. + // Probably, we can remove this condition at all, because setEventTokenField() + // checks all the forms without the field + const doAttach = ( + document.getElementsByClassName('latepoint-form').length > 0 || + document.getElementsByClassName('mec-booking-form-container').length > 0 || + document.getElementById('login-form-popup') !== null + ); + + try { + if ( doAttach ) { + // get token from LS + const token = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof setEventTokenField === 'function' && token !== undefined && token.length === 64) { + setEventTokenField(token); + } + // probably there we could use a new botDetectorInit if token is not found + } + } catch (e) { + console.log(e.toString()); + } +} + +/** + * Stop mouse observing function + */ +function ctMouseStopData() { + apbct_remove_event_handler(document, 'mousemove', ctFunctionMouseMove); + clearInterval(ctMouseReadInterval); + clearInterval(ctMouseWriteDataInterval); +} + +/** + * Stop key listening function + */ +function ctKeyStopStopListening() { + apbct_remove_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_remove_event_handler(document, 'keydown', ctFunctionFirstKey); +} + +/** + * @param {mixed} e + */ +function checkEmail(e) { + let currentEmail = e.target.value; + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail && !(currentEmail in ctCheckedEmails)) { + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'check_email_before_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_before_post', + email: currentEmail, + }, + { + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + } + } +} + +/** + * @param {mixed} e + */ +function checkEmailExist(e) { + let currentEmail = e.target.value; + let result; + + if (!currentEmail || !currentEmail.length) { + let envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.remove(); + } + let hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.remove(); + } + return; + } + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail in ctCheckedEmailsExist) { + result = ctCheckedEmailsExist[currentEmail]; + getResultCheckEmailExist(e, result, currentEmail); + + return; + } + + viewCheckEmailExist(e, 'load'); + + // Using REST API handler + ctPublicFunctions.data__ajax_type = 'rest'; + if (ctPublicFunctions.data__ajax_type === 'rest') { + apbct_public_sendREST( + 'check_email_exist_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + + return; + } + + if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_exist_post', + email: currentEmail, + }, + { + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + } +} + +/** + * @param {mixed} e + * @param {mixed} result + * @param {string} currentEmail + */ +function getResultCheckEmailExist(e, result, currentEmail) { + if (!result || !result.result) { + return; + } + + result = result.result; + + ctCheckedEmailsExist[currentEmail] = { + 'result': result, + 'timestamp': Date.now() / 1000 |0, + }; + + if (result.result == 'EXISTS') { + viewCheckEmailExist(e, 'good_email', result.text_result); + } else { + viewCheckEmailExist(e, 'bad_email', result.text_result); + } + + ctSetCookie('ct_checked_emails_exist', JSON.stringify(ctCheckedEmailsExist)); +} + +/** + * @param {mixed} e + * @param {string} state + * @param {string} textResult + */ +function viewCheckEmailExist(e, state, textResult) { + let parentElement = e.target.parentElement; + let inputEmail = parentElement.querySelector('[name*="email"]'); + + if (!inputEmail) { + return; + } + + let envelope; + let hint; + + // envelope + if (document.getElementById('apbct-check_email_exist-block')) { + envelope = document.getElementById('apbct-check_email_exist-block'); + } else { + envelope = document.createElement('div'); + envelope.setAttribute('class', 'apbct-check_email_exist-block'); + envelope.setAttribute('id', 'apbct-check_email_exist-block'); + window.addEventListener('scroll', function() { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + }); + parentElement.after(envelope); + } + + // hint + if (document.getElementById('apbct-check_email_exist-popup_description')) { + hint = document.getElementById('apbct-check_email_exist-popup_description'); + } else { + hint = document.createElement('div'); + hint.setAttribute('class', 'apbct-check_email_exist-popup_description'); + hint.setAttribute('id', 'apbct-check_email_exist-popup_description'); + window.addEventListener('scroll', function() { + hint.style.top = envelope.getBoundingClientRect().top + 'px'; + }); + + envelope.after(hint); + } + + ctEmailExistSetElementsPositions(); + + window.addEventListener('resize', function(event) { + ctEmailExistSetElementsPositions(); + }); + + switch (state) { + case 'load': + envelope.classList.remove('apbct-check_email_exist-good_email', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-load'); + break; + + case 'good_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-good_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#1C7129'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + case 'bad_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-good_email'); + envelope.classList.add('apbct-check_email_exist-bad_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#E01111'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + default: + break; + } +} + +/** + * Shift the envelope to the input field on resizing the window + * @param {object} envelope + * @param {object} inputEmail + */ +function ctEmailExistSetElementsPositions() { + const envelopeWidth = 35; + const inputEmail = document.querySelector('comment-form input[name*="email"], input#email'); + if (!inputEmail) { + return; + } + const envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + envelope.style.left = inputEmail.getBoundingClientRect().right - envelopeWidth - 10 + 'px'; + envelope.style.height = inputEmail.offsetHeight + 'px'; + envelope.style.width = envelopeWidth + 'px'; + } + + const hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.style.width = inputEmail.offsetWidth + 'px'; + hint.style.left = inputEmail.getBoundingClientRect().left + 'px'; + } +} + +/** + * @return {bool} + */ +function ctIsDrawPixel() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + return +ctPublic.pixel__enabled || + (ctPublic.data__cookies_type === 'none' && document.querySelectorAll('img#apbct_pixel').length === 0) || + (ctPublic.data__cookies_type === 'alternative' && document.querySelectorAll('img#apbct_pixel').length === 0); +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImg(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + ctSetCookie('apbct_pixel_url', pixelUrl); + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', pixelUrl); + apbct('body').append(insertedImg); + } + } +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImgFromLocalstorage(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', decodeURIComponent(pixelUrl)); + apbct('body').append(insertedImg); + } + } +} + +/** + * ctGetPixelUrl + * @return {bool} + */ +function ctGetPixelUrl() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + // Check if pixel is already in localstorage and is not outdated + let localStoragePixelUrl = apbctLocalStorage.get('apbct_pixel_url'); + if ( localStoragePixelUrl !== false ) { + if ( ! apbctLocalStorage.isAlive('apbct_pixel_url', 3600 * 3) ) { + apbctLocalStorage.delete('apbct_pixel_url'); + } else { + // if so - load pixel from localstorage and draw it skipping AJAX + ctSetPixelImgFromLocalstorage(localStoragePixelUrl); + return; + } + } + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_get_pixel_url', + { + method: 'POST', + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + }, + ); + // Using AJAX request and handler + } else { + apbct_public_sendAJAX( + { + action: 'apbct_get_pixel_url', + }, + { + notJson: true, + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * ctSetHasScrolled + */ +function ctSetHasScrolled() { + if ( ! apbctLocalStorage.isSet('ct_has_scrolled') || ! apbctLocalStorage.get('ct_has_scrolled') ) { + ctSetCookie('ct_has_scrolled', 'true'); + apbctLocalStorage.set('ct_has_scrolled', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_scrolled') === undefined + ) { + ctSetCookie('ct_has_scrolled', 'true'); + } +} + +/** + * ctSetMouseMoved + */ +function ctSetMouseMoved() { + if ( ! apbctLocalStorage.isSet('ct_mouse_moved') || ! apbctLocalStorage.get('ct_mouse_moved') ) { + ctSetCookie('ct_mouse_moved', 'true'); + apbctLocalStorage.set('ct_mouse_moved', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_mouse_moved') === undefined + ) { + ctSetCookie('ct_mouse_moved', 'true'); + } +} + +/** + * Restart listen fields to set ct_has_input_focused or ct_has_key_up + */ +function restartFieldsListening() { + if (!apbctLocalStorage.isSet('ct_has_input_focused') && !apbctLocalStorage.isSet('ct_has_key_up')) { + ctStartFieldsListening(); + } +} + +/** + * init listeners for keyup and focus events + */ +function ctStartFieldsListening() { + if ( + (apbctLocalStorage.isSet('ct_has_key_up') || apbctLocalStorage.get('ct_has_key_up')) && + (apbctLocalStorage.isSet('ct_has_input_focused') || apbctLocalStorage.get('ct_has_input_focused')) && + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') !== undefined && + ctGetCookie('ct_has_key_up') !== undefined + ) + ) { + // already set + return; + } + + let forms = ctGetPageForms(); + ctPublic.handled_fields = []; + + if (forms.length > 0) { + for (let i = 0; i < forms.length; i++) { + // handle only inputs and textareas + const handledFormFields = forms[i].querySelectorAll('input,textarea'); + for (let i = 0; i < handledFormFields.length; i++) { + if (handledFormFields[i].type !== 'hidden') { + // collect handled fields to remove handler in the future + ctPublic.handled_fields.push(handledFormFields[i]); + // do attach handlers + apbct_attach_event_handler(handledFormFields[i], 'focus', ctFunctionHasInputFocused); + apbct_attach_event_handler(handledFormFields[i], 'keyup', ctFunctionHasKeyUp); + } + } + } + } +} + +/** + * stop listening keyup and focus + * @param {string} eventName + * @param {string} functionName + */ +function ctStopFieldsListening(eventName, functionName) { + if (typeof ctPublic.handled_fields !== 'undefined' && ctPublic.handled_fields.length > 0) { + for (let i = 0; i < ctPublic.handled_fields.length; i++) { + apbct_remove_event_handler(ctPublic.handled_fields[i], eventName, functionName); + } + } +} + +let ctFunctionHasInputFocused = function output(event) { + ctSetHasInputFocused(); + ctStopFieldsListening('focus', ctFunctionHasInputFocused); +}; + +let ctFunctionHasKeyUp = function output(event) { + ctSetHasKeyUp(); + ctStopFieldsListening('keyup', ctFunctionHasKeyUp); +}; + +/** + * set ct_has_input_focused ct_has_key_up cookies on session period + */ +function ctSetHasInputFocused() { + if ( ! apbctLocalStorage.isSet('ct_has_input_focused') || ! apbctLocalStorage.get('ct_has_input_focused') ) { + apbctLocalStorage.set('ct_has_input_focused', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_input_focused', 'true'); + } +} + +/** + * ctSetHasKeyUp + */ +function ctSetHasKeyUp() { + if ( ! apbctLocalStorage.isSet('ct_has_key_up') || ! apbctLocalStorage.get('ct_has_key_up') ) { + apbctLocalStorage.set('ct_has_key_up', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_key_up') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_key_up', 'true'); + } +} + +if (ctPublic.data__key_is_ok) { + apbct_attach_event_handler(document, 'mousemove', ctFunctionMouseMove); + apbct_attach_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'keydown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'scroll', ctSetHasScrolled); +} + +/** + * Prepare block to intercept AJAX response + */ +function apbctPrepareBlockForAjaxForms() { + // eslint-disable-next-line require-jsdoc + function ctPrepareBlockMessage(xhr) { + if (xhr.responseText && + xhr.responseText.indexOf('"apbct') !== -1 && + xhr.responseText.indexOf('DOCTYPE') === -1 + ) { + try { + ctParseBlockMessage(JSON.parse(xhr.responseText)); + } catch (e) { + console.log(e.toString()); + } + } + } + + if (typeof jQuery !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + if (typeof jQuery(document).ajaxComplete() !== 'function') { + jQuery(document).on('ajaxComplete', function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } else { + jQuery(document).ajaxComplete( function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } + } else { + // if Jquery is not avaliable try to use xhr + if (typeof XMLHttpRequest !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + document.addEventListener('readystatechange', function(event) { + if (event.target.readyState === 4) { + ctPrepareBlockMessage(event.target); + } + }); + } + } +} + +/** + * For forced alt cookies. + * If token is not added to the LS on apbc_ready, check every second if so and send token to the alt sessions. + */ +function startForcedAltEventTokenChecker() { + tokenCheckerIntervalId = setInterval( function() { + if (apbctLocalStorage.get('event_token_forced_set') === '1') { + clearInterval(tokenCheckerIntervalId); + return; + } + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if (eventToken) { + ctSetAlternativeCookie([['ct_bot_detector_event_token', eventToken]], {forceAltCookies: true}); + apbctLocalStorage.set('event_token_forced_set', '1'); + clearInterval(tokenCheckerIntervalId); + } else { + } + }, 1000); +} + + +/** + * Ready function + */ +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_ready() { + document.addEventListener('gform_page_loaded', function() { + if ( + typeof ctPublic.force_alt_cookies === 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + if (typeof setEventTokenField === 'function' && typeof botDetectorLocalStorage === 'function') { + setEventTokenField(botDetectorLocalStorage.get('bot_detector_event_token')); + } + } + }); + if ( ! ctPublic.wc_ajax_add_to_cart ) { + apbctCheckAddToCartByGet(); + } + + apbctPrepareBlockForAjaxForms(); + + // set session ID + if (!apbctSessionStorage.isSet('apbct_session_id')) { + const sessionID = apbctGenerateUniqueID(); + apbctSessionStorage.set('apbct_session_id', sessionID, false); + apbctLocalStorage.set('apbct_page_hits', 1); + if (document.referrer) { + let urlReferer = new URL(document.referrer); + if (urlReferer.host !== location.host) { + apbctSessionStorage.set('apbct_site_referer', document.referrer, false); + } + } + } else { + apbctLocalStorage.set('apbct_page_hits', Number(apbctLocalStorage.get('apbct_page_hits')) + 1); + } + + apbctWriteReferrersToSessionStorage(); + + const cookiesType = apbctLocalStorage.get('ct_cookies_type'); + if ( ! cookiesType || cookiesType !== ctPublic.data__cookies_type ) { + apbctLocalStorage.set('ct_cookies_type', ctPublic.data__cookies_type); + apbctLocalStorage.delete('ct_mouse_moved'); + apbctLocalStorage.delete('ct_has_scrolled'); + } + + if (ctPublic.data__cookies_type !== 'alternative') { + ctStartFieldsListening(); + // 2nd try to add listeners for delayed appears forms + setTimeout(ctStartFieldsListening, 1000); + } + + window.addEventListener('animationstart', apbctOnAnimationStart, true); + window.addEventListener('input', apbctOnInput, true); + document.ctTypoData = new CTTypoData(); + document.ctTypoData.gatheringFields(); + document.ctTypoData.setListeners(); + + // Collect scrolling info + const initCookies = [ + ['ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)], + ['ct_fkp_timestamp', '0'], + ['ct_pointer_data', '0'], + // eslint-disable-next-line camelcase + ['ct_timezone', ctDate.getTimezoneOffset()/60*(-1)], + ['ct_screen_info', apbctGetScreenInfo()], + ['apbct_headless', navigator.webdriver], + ]; + + apbctLocalStorage.set('ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)); + apbctLocalStorage.set('ct_fkp_timestamp', '0'); + apbctLocalStorage.set('ct_pointer_data', '0'); + // eslint-disable-next-line camelcase + apbctLocalStorage.set('ct_timezone', ctDate.getTimezoneOffset()/60*(-1) ); + apbctLocalStorage.set('ct_screen_info', apbctGetScreenInfo()); + apbctLocalStorage.set('apbct_headless', navigator.webdriver); + + if ( ctPublic.data__cookies_type !== 'native' ) { + initCookies.push(['apbct_visible_fields', '0']); + } else { + // Delete all visible fields cookies on load the page + let cookiesArray = document.cookie.split(';'); + if ( cookiesArray.length !== 0 ) { + for ( let i = 0; i < cookiesArray.length; i++ ) { + let currentCookie = cookiesArray[i].trim(); + let cookieName = currentCookie.split('=')[0]; + if ( cookieName.indexOf('apbct_visible_fields_') === 0 ) { + ctDeleteCookie(cookieName); + } + } + } + } + + if ( + +ctPublic.pixel__setting && + !(+ctPublic.pixel__setting == 3 && ctPublic.settings__data__bot_detector_enabled == 1) + ) { + if ( ctIsDrawPixel() ) { + ctGetPixelUrl(); + } else { + initCookies.push(['apbct_pixel_url', ctPublic.pixel__url]); + } + } + + if ( +ctPublic.data__email_check_before_post) { + initCookies.push(['ct_checked_emails', '0']); + apbct('input[type = \'email\'], #email').on('blur', checkEmail); + } + + if ( +ctPublic.data__email_check_exist_post) { + initCookies.push(['ct_checked_emails_exist', '0']); + apbct('comment-form input[name = \'email\'], input#email').on('blur', checkEmailExist); + } + + if (apbctLocalStorage.isSet('ct_checkjs')) { + initCookies.push(['ct_checkjs', apbctLocalStorage.get('ct_checkjs')]); + } else { + initCookies.push(['ct_checkjs', 0]); + } + + // detect integrated forms that need to be handled via alternative cookies + ctDetectForcedAltCookiesForms(); + + // send bot detector event token to alt cookies on problem forms + let tokenForForceAlt = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof ctPublic.force_alt_cookies !== 'undefined' && + ctPublic.force_alt_cookies && + ctPublic.settings__data__bot_detector_enabled + ) { + apbctLocalStorage.set('event_token_forced_set', '0'); + if (tokenForForceAlt) { + initCookies.push(['ct_bot_detector_event_token', tokenForForceAlt]); + apbctLocalStorage.set('event_token_forced_set', '1'); + } else { + startForcedAltEventTokenChecker(); + } + } + + ctSetCookie(initCookies); + + setTimeout(function() { + if ( + typeof ctPublic.force_alt_cookies == 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + } + + if ( + typeof ctPublic.data__cookies_type !== 'undefined' && + ctPublic.data__cookies_type === 'none' + ) { + ctAjaxSetupAddCleanTalkDataBeforeSendAjax(); + ctAddWCMiddlewares(); + } + + for (let i = 0; i < document.forms.length; i++) { + let form = document.forms[i]; + + // Exclusion for forms + if (ctCheckHiddenFieldsExclusions(document.forms[i], 'visible_fields')) { + continue; + } + if (form.querySelector('input[name="wspsc_add_cart_submit"]') || + form.querySelector('input[name="option"][value="com_vikrentcar"]') || + form.querySelector('input[name="option"][value="com_vikbooking"]') + ) { + continue; + } + + // The Form has hidden field like apbct_visible_fields + if ( + document.forms[i].elements.apbct_visible_fields !== undefined && + document.forms[i].elements.apbct_visible_fields.length > 0 + ) { + continue; + } + + if (form.querySelector('input[name="apbct_visible_fields"]')) { + let visibleFields = form.querySelector('input[name="apbct_visible_fields"]'); + form.removeChild(visibleFields); + } + + let hiddenInput = document.createElement( 'input' ); + hiddenInput.setAttribute( 'type', 'hidden' ); + hiddenInput.setAttribute( 'id', 'apbct_visible_fields_' + i ); + hiddenInput.setAttribute( 'name', 'apbct_visible_fields'); + let visibleFieldsToInput = {}; + visibleFieldsToInput[0] = apbct_collect_visible_fields(form); + hiddenInput.value = btoa(JSON.stringify(visibleFieldsToInput)); + form.append( hiddenInput ); + + form.onsubmit_prev = form.onsubmit; + + form.ctFormIndex = i; + form.onsubmit = function(event) { + if ( ctPublic.data__cookies_type !== 'native' && typeof event.target.ctFormIndex !== 'undefined' ) { + apbct_visible_fields_set_cookie( apbct_collect_visible_fields(this), event.target.ctFormIndex ); + } + + if (ctPublic.data__cookies_type === 'none' && isFormThatNeedCatchXhr(event.target)) { + window.XMLHttpRequest.prototype.send = function(data) { + let noCookieData = getNoCookieData(); + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + defaultSend.call(this, noCookieData + data); + setTimeout(() => { + window.XMLHttpRequest.prototype.send = defaultSend; + }, 0); + }; + } + + // Call previous submit action + if (event.target.onsubmit_prev instanceof Function && !ctOnsubmitPrevCallExclude(event.target)) { + if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) { + event.preventDefault(); + } + setTimeout(function() { + event.target.onsubmit_prev.call(event.target, event); + }, 0); + } + }; + } + }, 1000); + + // Listen clicks on encoded emails + let encodedEmailNodes = document.querySelectorAll('[data-original-string]'); + ctPublic.encodedEmailNodes = encodedEmailNodes; + if (encodedEmailNodes.length) { + for (let i = 0; i < encodedEmailNodes.length; ++i) { + encodedEmailNodes[i].addEventListener('click', ctFillDecodedEmailHandler); + } + } + + // WordPress Search form processing + for (const _form of document.forms) { + if ( + typeof ctPublic !== 'undefined' && + + ctPublic.settings__forms__search_test === 1 && + ( + _form.getAttribute('id') === 'searchform' || + (_form.getAttribute('class') !== null && _form.getAttribute('class').indexOf('search-form') !== -1) || + (_form.getAttribute('role') !== null && _form.getAttribute('role').indexOf('search') !== -1) + ) + ) { + // fibosearch integration + if (_form.querySelector('input.dgwt-wcas-search-input')) { + continue; + } + + if ( + _form.getAttribute('id') === 'hero-search-form' || + _form.getAttribute('class') === 'hb-booking-search-form' + ) { + continue; + } + + // this handles search forms onsubmit process + _form.apbctSearchPrevOnsubmit = _form.onsubmit; + _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form); + } + } + + // Check any XMLHttpRequest connections + apbctCatchXmlHttpRequest(); + + // Initializing the collection of user activity + new ApbctCollectingUserActivity(); + + // Set important paramaters via ajax if problematic cache solutions found + // todo These AJAX calls removed untill we find a better solution, reason is a lot of requests to the server. + // apbctAjaxSetImportantParametersOnCacheExist(ctPublic.advancedCacheExists || ctPublic.varnishCacheExists); + + // Checking that the bot detector has loaded and received the event token for Anti-Crawler + if (ctPublic.settings__sfw__anti_crawler) { + checkBotDetectorExist(); + } +} + +/** + * Checking that the bot detector has loaded and received the event token + */ +function checkBotDetectorExist() { + if (ctPublic.settings__data__bot_detector_enabled) { + const botDetectorIntervalSearch = setInterval(() => { + let botDetectorEventToken = localStorage.bot_detector_event_token ? true : false; + + if (botDetectorEventToken) { + ctSetCookie('apbct_bot_detector_exist', '1', '3600'); + clearInterval(botDetectorIntervalSearch); + } + }, 500); + } +} + +/** + * Insert no_cookies_data to rest request + */ +function ctAddWCMiddlewares() { + const ctPinDataToRequest = (options, next) => { + if (typeof options !== 'object' || options === null || + !options.hasOwnProperty('data') || !options.hasOwnProperty('path') + ) { + return next(options); + } + + // add to cart + if (options.data.hasOwnProperty('requests') && + options.data.requests.length > 0 && + options.data.requests[0].hasOwnProperty('path') && + options.data.requests[0].path === '/wc/store/v1/cart/add-item' + ) { + options.data.requests[0].data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.requests[0].data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + // checkout + if (options.path === '/wc/store/v1/checkout') { + options.data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + return next(options); + }; + + if (window.hasOwnProperty('wp') && + window.wp.hasOwnProperty('apiFetch') && + typeof window.wp.apiFetch.use === 'function' + ) { + window.wp.apiFetch.use(ctPinDataToRequest); + } +} + +/** + * Insert event_token and no_cookies_data to some ajax request + */ +function apbctCatchXmlHttpRequest() { + // 1) Check the page if it needed to catch XHR + if ( document.querySelector('div.wfu_container') !== null ) { + const originalSend = XMLHttpRequest.prototype.send; + XMLHttpRequest.prototype.send = function(body) { + // 2) Check the caught request fi it needed to modify + if ( + body && + typeof body === 'string' && + ( + body.indexOf('action=wfu_ajax_action_ask_server') !== -1 + ) + ) { + let addidionalCleantalkData = ''; + let eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if ( + eventToken !== null && + eventToken !== false && + eventToken.hasOwnProperty('value') && + eventToken.value !== '' + ) { + eventToken = eventToken.value; + addidionalCleantalkData += '&' + 'data%5Bct_bot_detector_event_token%5D=' + eventToken; + } + + let noCookieData = getNoCookieData(); + addidionalCleantalkData += '&' + 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData; + + body += addidionalCleantalkData; + + return originalSend.apply(this, [body]); + } + return originalSend.apply(this, [body]); + }; + } +} + +/** + * Run AJAX to set important_parameters on the site backend if problematic cache solutions are defined. + * @param {boolean} cacheExist + */ +function apbctAjaxSetImportantParametersOnCacheExist(cacheExist) { // eslint-disable-line no-unused-vars + // Set important parameters via ajax + if ( cacheExist ) { + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST('apbct_set_important_parameters', {}); + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX({action: 'apbct_set_important_parameters'}, {}); + } + } +} + +/** + * Prepare jQuery.ajaxSetup to add nocookie data to the jQuery ajax request. + * Notes: + * - Do it just once, the ajaxSetup.beforeSend will be overwritten for any calls. + * - Signs of forms need to be caught will be checked during ajaxSetup.settings.data process on send. + * - Any sign of the form HTML of the caller is insignificant in this process. + * @return {void} + */ +function ctAjaxSetupAddCleanTalkDataBeforeSendAjax() { + // jquery ajax call intercept + // this is the only place where we can found hard dependency on jQuery, if the form use it - the script + // will work independing if jQuery is loaded by CleanTalk or not + let eventToken = false; + if ( typeof jQuery !== 'undefined' && typeof jQuery.ajaxSetup === 'function') { + jQuery.ajaxSetup({ + beforeSend: function(xhr, settings) { + let sourceSign = false; + // settings data is string (important!) + if ( typeof settings.data === 'string' ) { + if (settings.data.indexOf('twt_cc_signup') !== -1) { + sourceSign = 'twt_cc_signup'; + } + + if (settings.data.indexOf('action=mailpoet') !== -1) { + sourceSign = 'action=mailpoet'; + } + + if ( + settings.data.indexOf('action=user_registration') !== -1 && + settings.data.indexOf('ur_frontend_form_nonce') !== -1 + ) { + sourceSign = 'action=user_registration'; + } + + if (settings.data.indexOf('action=happyforms_message') !== -1) { + sourceSign = 'action=happyforms_message'; + } + + if (settings.data.indexOf('action=new_activity_comment') !== -1) { + sourceSign = 'action=new_activity_comment'; + } + } + if ( typeof settings.url === 'string' ) { + if (settings.url.indexOf('wc-ajax=add_to_cart') !== -1) { + sourceSign = 'wc-ajax=add_to_cart'; + if (localStorage.getItem('bot_detector_event_token') !== null) { + eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if (eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') { + eventToken = eventToken.value; + } + } + } + } + + if (sourceSign) { + let noCookieData = getNoCookieData(); + if (typeof eventToken === 'string') { + eventToken = 'data%5Bct_bot_detector_event_token%5D=' + eventToken + '&'; + } else { + eventToken = ''; + } + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + + settings.data = noCookieData + eventToken + settings.data; + } + }, + }); + } +} + +// eslint-disable-next-line require-jsdoc +function ctOnsubmitPrevCallExclude(form) { + if (form.classList.contains('hb-booking-search-form')) { + return true; + } + + return false; +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbct_ready(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbct_ready); + } + + apbctLocalStorage.set('ct_checkjs', ctPublic.ct_checkjs_key, true ); +} + +/** + * @param {SubmitEvent} e + * @param {object} targetForm + */ +function ctSearchFormOnSubmitHandler(e, targetForm) { + try { + // get honeypot field and it's value + const honeyPotField = targetForm.querySelector('[name*="apbct_email_id__"]'); + let hpValue = null; + if ( + honeyPotField !== null && + honeyPotField.value !== null + ) { + hpValue = honeyPotField.value; + } + + // get cookie data from storages + let cleantalkStorageDataArray = getCleanTalkStorageDataArray(); + + // get event token from storage + let eventTokenLocalStorage = apbctLocalStorage.get('bot_detector_event_token'); + + // if noCookie data or honeypot data is set, proceed handling + if ( cleantalkStorageDataArray !== null || honeyPotField !== null || eventTokenLocalStorage !== null ) { + e.preventDefault(); + const callBack = () => { + if (honeyPotField !== null) { + honeyPotField.parentNode.removeChild(honeyPotField); + } + if (typeof targetForm.apbctSearchPrevOnsubmit === 'function') { + targetForm.apbctSearchPrevOnsubmit(); + } else { + HTMLFormElement.prototype.submit.call(targetForm); + } + }; + + let cookiesArray = cleantalkStorageDataArray; + + // if honeypot data provided add the fields to the parsed data + if ( hpValue !== null ) { + cookiesArray.apbct_search_form__honeypot_value = hpValue; + } + + // set event token + cookiesArray.ct_bot_detector_event_token = eventTokenLocalStorage; + + // if the pixel needs to be decoded + if ( + typeof cookiesArray.apbct_pixel_url === 'string' && + cookiesArray.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookiesArray.apbct_pixel_url = decodeURIComponent(cookiesArray.apbct_pixel_url); + } + + // data to JSON + const parsedCookies = JSON.stringify(cookiesArray); + + // if any data provided, proceed data to xhr + if ( typeof parsedCookies !== 'undefined' && parsedCookies.length !== 0 ) { + ctSetAlternativeCookie( + parsedCookies, + {callback: callBack, onErrorCallback: callBack, forceAltCookies: true}, + ); + } else { + callBack(); + } + } + } catch (error) { + console.warn('APBCT search form onsubmit handler error. ' + error); + } +} + +/** + * @param {mixed} commonCookies + * @return {string} + */ +function getJavascriptClientData(commonCookies = []) { // eslint-disable-line no-unused-vars + let resultDataJson = {}; + + resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails'); + resultDataJson.ct_checked_emails_exist = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails_exist'); + resultDataJson.ct_checkjs = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checkjs'); + resultDataJson.ct_fkp_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_fkp_timestamp'); + resultDataJson.ct_pointer_data = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_pointer_data'); + resultDataJson.ct_ps_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_ps_timestamp'); + resultDataJson.ct_screen_info = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_screen_info'); + resultDataJson.ct_timezone = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_timezone'); + + // collecting data from localstorage + const ctMouseMovedLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const apbctPageHits = apbctLocalStorage.get('apbct_page_hits'); + const apbctPrevReferer = apbctSessionStorage.get('apbct_prev_referer'); + const apbctSiteReferer = apbctSessionStorage.get('apbct_site_referer'); + const ctJsErrorsLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_js_errors'); + const ctPixelUrl = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadless = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + const ctBotDetectorFrontendDataLog = apbctLocalStorage.get( + ctPublicFunctions.cookiePrefix + 'ct_bot_detector_frontend_data_log', + ); + + // collecting data from cookies + const ctMouseMovedCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const ctCookiesPixelUrl = ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadlessNative = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + + + resultDataJson.ct_mouse_moved = ctMouseMovedLocalStorage !== undefined ? + ctMouseMovedLocalStorage : ctMouseMovedCookie; + resultDataJson.ct_has_scrolled = ctHasScrolledLocalStorage !== undefined ? + ctHasScrolledLocalStorage : ctHasScrolledCookie; + resultDataJson.ct_cookies_type = ctCookiesTypeLocalStorage !== undefined ? + ctCookiesTypeLocalStorage : ctCookiesTypeCookie; + resultDataJson.apbct_pixel_url = ctPixelUrl !== undefined ? + ctPixelUrl : ctCookiesPixelUrl; + resultDataJson.apbct_headless = apbctHeadless !== undefined ? + apbctHeadless : apbctHeadlessNative; + resultDataJson.ct_bot_detector_frontend_data_log = ctBotDetectorFrontendDataLog !== undefined ? + ctBotDetectorFrontendDataLog : ''; + if (resultDataJson.apbct_pixel_url && typeof(resultDataJson.apbct_pixel_url) == 'string') { + if (resultDataJson.apbct_pixel_url.indexOf('%3A%2F')) { + resultDataJson.apbct_pixel_url = decodeURIComponent(resultDataJson.apbct_pixel_url); + } + } + + resultDataJson.apbct_page_hits = apbctPageHits; + resultDataJson.apbct_prev_referer = apbctPrevReferer; + resultDataJson.apbct_site_referer = apbctSiteReferer; + resultDataJson.apbct_ct_js_errors = ctJsErrorsLocalStorage; + + if (!resultDataJson.apbct_pixel_url) { + resultDataJson.apbct_pixel_url = ctPublic.pixel__url; + } + + if ( typeof (commonCookies) === 'object') { + for (let i = 0; i < commonCookies.length; ++i) { + if ( typeof (commonCookies[i][1]) === 'object' ) { + // this is for handle SFW cookies + resultDataJson[commonCookies[i][1][0]] = commonCookies[i][1][1]; + } else { + resultDataJson[commonCookies[i][0]] = commonCookies[i][1]; + } + } + } else { + console.log('APBCT JS ERROR: Collecting data type mismatch'); + } + + // Parse JSON properties to prevent double JSON encoding + resultDataJson = removeDoubleJsonEncoding(resultDataJson); + + + return JSON.stringify(resultDataJson); +} + +/** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {mixed} object + * @return {*} + */ +function removeDoubleJsonEncoding(object) { + if ( typeof object === 'object') { + // eslint-disable-next-line guard-for-in + for (let objectKey in object) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = removeDoubleJsonEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + const parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + + return object; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_collect_visible_fields( form ) { + // Get only fields + let inputs = []; + let inputsVisible = ''; + let inputsVisibleCount = 0; + let inputsInvisible = ''; + let inputsInvisibleCount = 0; + let inputsWithDuplicateNames = []; + + for (let key in form.elements) { + if (!isNaN(+key)) { + inputs[key] = form.elements[key]; + } + } + + // Filter fields + inputs = inputs.filter(function(elem) { + // Filter already added fields + if ( inputsWithDuplicateNames.indexOf( elem.getAttribute('name') ) !== -1 ) { + return false; + } + // Filter inputs with same names for type == radio + if ( -1 !== ['radio', 'checkbox'].indexOf( elem.getAttribute('type') )) { + inputsWithDuplicateNames.push( elem.getAttribute('name') ); + return false; + } + return true; + }); + + // Visible fields + inputs.forEach(function(elem, i, elements) { + // Unnecessary fields + if ( + elem.getAttribute('type') === 'submit' || // type == submit + elem.getAttribute('name') === null || + elem.getAttribute('name') === 'ct_checkjs' + ) { + return; + } + // Invisible fields + if ( + getComputedStyle(elem).display === 'none' || // hidden + getComputedStyle(elem).visibility === 'hidden' || // hidden + getComputedStyle(elem).opacity === '0' || // hidden + elem.getAttribute('type') === 'hidden' // type == hidden + ) { + if ( elem.classList.contains('wp-editor-area') ) { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } else { + inputsInvisible += ' ' + elem.getAttribute('name'); + inputsInvisibleCount++; + } + // eslint-disable-next-line brace-style + } + // Visible fields + else { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } + }); + + inputsInvisible = inputsInvisible.trim(); + inputsVisible = inputsVisible.trim(); + + return { + visible_fields: inputsVisible, + visible_fields_count: inputsVisibleCount, + invisible_fields: inputsInvisible, + invisible_fields_count: inputsInvisibleCount, + }; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_visible_fields_set_cookie( visibleFieldsCollection, formId ) { + let collection = typeof visibleFieldsCollection === 'object' && visibleFieldsCollection !== null ? + visibleFieldsCollection : {}; + + if ( ctPublic.data__cookies_type === 'native' ) { + // eslint-disable-next-line guard-for-in + for ( let i in collection ) { + if ( i > 10 ) { + // Do not generate more than 10 cookies + return; + } + let collectionIndex = formId !== undefined ? formId : i; + ctSetCookie('apbct_visible_fields_' + collectionIndex, JSON.stringify( collection[i] ) ); + } + } else { + ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) ); + } +} + +// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars +function apbct_js_keys__set_input_value(result, data, params, obj) { + if ( document.querySelectorAll('[name^=ct_checkjs]').length > 0 ) { + let elements = document.querySelectorAll('[name^=ct_checkjs]'); + for ( let i = 0; i < elements.length; i++ ) { + elements[i].value = result.js_key; + } + } +} + +/** + * @return {string} + */ +function apbctGetScreenInfo() { + return JSON.stringify({ + fullWidth: document.documentElement.scrollWidth, + fullHeight: Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight, + ), + visibleWidth: document.documentElement.clientWidth, + visibleHeight: document.documentElement.clientHeight, + }); +} + +// eslint-disable-next-line require-jsdoc +function ctParseBlockMessage(response) { + let msg = ''; + if (typeof response.apbct !== 'undefined') { + response = response.apbct; + if (response.blocked) { + msg = response.comment; + } + } + if (typeof response.data !== 'undefined') { + response = response.data; + if (response.message !== undefined) { + msg = response.message; + } + } + + if (msg) { + document.dispatchEvent( + new CustomEvent( 'apbctAjaxBockAlert', { + bubbles: true, + detail: {message: msg}, + } ), + ); + + // Show the result by modal + cleantalkModal.loaded = msg; + cleantalkModal.open(); + + if (+response.stop_script === 1) { + window.stop(); + } + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetPixelUrlLocalstorage(ajaxPixelUrl) { + // set pixel to the storage + ctSetCookie('apbct_pixel_url', ajaxPixelUrl); +} + +// eslint-disable-next-line require-jsdoc +function ctNoCookieConstructHiddenField(type) { + let inputType = 'hidden'; + if (type === 'submit') { + inputType = 'submit'; + } + let field = ''; + + let noCookieData = getCleanTalkStorageDataArray(); + noCookieData = JSON.stringify(noCookieData); + noCookieData = '_ct_no_cookie_data_' + btoa(noCookieData); + field = document.createElement('input'); + field.setAttribute('name', 'ct_no_cookie_hidden_field'); + field.setAttribute('value', noCookieData); + field.setAttribute('type', inputType); + field.classList.add('apbct_special_field'); + field.classList.add('ct_no_cookie_hidden_field'); + return field; +} + +/** + * Retrieves the clentalk "cookie" data from starages. + * Contains {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}. + * @return {string} + */ +function getCleanTalkStorageDataArray() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + + let noCookieDataTypo = {typo: []}; + if (document.ctTypoData && document.ctTypoData.data) { + noCookieDataTypo = {typo: document.ctTypoData.data}; + } + + let noCookieDataFromUserActivity = {collecting_user_activity_data: []}; + + if (document.ctCollectingUserActivityData) { + let collectingUserActivityData = JSON.parse(JSON.stringify(document.ctCollectingUserActivityData)); + noCookieDataFromUserActivity = {collecting_user_activity_data: collectingUserActivityData}; + } + + return {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}; +} + +/** + * @return {boolean|*} + */ +function ctGetPageForms() { + let forms = document.forms; + if (forms) { + return forms; + } + return false; +} + +/** + * Get type of the field should be excluded. Return exclusion signs via object. + * @param {object} form Form dom object. + * @return {object} {'no_cookie': 1|0, 'visible_fields': 1|0} + */ +function ctGetHiddenFieldExclusionsType(form) { + // visible fields + let result = {'no_cookie': 0, 'visible_fields': 0}; + if ( + +ctPublic.data__visible_fields_required === 0 || + (form.method.toString().toLowerCase() === 'get' && + form.querySelectorAll('.nf-form-content').length === 0 && + form.id !== 'twt_cc_signup') || + form.classList.contains('slp_search_form') || // StoreLocatorPlus form + form.parentElement.classList.contains('mec-booking') || + form.action.toString().indexOf('activehosted.com') !== -1 || // Active Campaign + (form.id && form.id === 'caspioform') || // Caspio Form + (form.classList && form.classList.contains('tinkoffPayRow')) || // TinkoffPayForm + (form.classList && form.classList.contains('give-form')) || // GiveWP + (form.id && form.id === 'ult-forgot-password-form') || // ult forgot password + (form.id && form.id.toString().indexOf('calculatedfields') !== -1) || // CalculatedFieldsForm + (form.id && form.id.toString().indexOf('sac-form') !== -1) || // Simple Ajax Chat + (form.id && + form.id.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + (form.name && + form.name.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + form.action.toString() === 'https://epayment.epymtservice.com/epay.jhtml' || // Custom form + (form.name && form.name.toString().indexOf('tribe-bar-form') !== -1) || // The Events Calendar + (form.id && form.id === 'ihf-login-form') || // Optima Express login + (form.id && + form.id === 'subscriberForm' && + form.action.toString().indexOf('actionType=update') !== -1) || // Optima Express update + (form.id && form.id === 'ihf-main-search-form') || // Optima Express search + (form.id && form.id === 'frmCalc') || // nobletitle-calc + form.action.toString().indexOf('property-organizer-delete-saved-search-submit') !== -1 || + form.querySelector('a[name="login"]') !== null // digimember login form + ) { + result.visible_fields = 1; + } + + // ajax search pro exclusion + let ncFieldExclusionsSign = form.parentNode; + if ( + ncFieldExclusionsSign && ncFieldExclusionsSign.classList.contains('proinput') || + (form.name === 'options' && form.classList.contains('asp-fss-flex')) + ) { + result.no_cookie = 1; + } + + // woocommerce login form + if ( + form && form.classList.contains('woocommerce-form-login') + ) { + result.visible_fields = 1; + result.no_cookie = 1; + } + + return result; +} + +/** + * Check if the form should be skipped from hidden field attach. + * Return exclusion description if it is found, false otherwise. + * @param {object} form Form dom object. + * @param {string} hiddenFieldType Type of hidden field that needs to be checked. + * Possible values: 'no_cookie'|'visible_fields'. + * @return {boolean} + */ +function ctCheckHiddenFieldsExclusions(form, hiddenFieldType) { + const formAction = typeof(form.action) == 'string' ? form.action : ''; + // Ajax Search Lite + if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) { + return true; + } + // Super WooCommerce Product Filter + if (form.classList.contains('swpf-instant-filtering')) { + return true; + } + // PayU 3-rd party service forms + if (formAction.indexOf('secure.payu.com') !== -1 ) { + return true; + } + + if (formAction.indexOf('hsforms') !== -1 ) { + return true; + } + + if (typeof (hiddenFieldType) === 'string' && + ['visible_fields', 'no_cookie'].indexOf(hiddenFieldType) !== -1) { + const exclusions = ctGetHiddenFieldExclusionsType(form); + return exclusions[hiddenFieldType] === 1; + } + + return false; +} + +/** + * ctNoCookieAttachHiddenFieldsToForms + */ +function ctNoCookieAttachHiddenFieldsToForms() { + if (ctPublic.data__cookies_type !== 'none') { + return; + } + + let forms = ctGetPageForms(); + + if (forms) { + for ( let i = 0; i < forms.length; i++ ) { + if ( ctCheckHiddenFieldsExclusions(document.forms[i], 'no_cookie') ) { + continue; + } + + // ignore forms with get method @todo We need to think about this + if (document.forms[i].getAttribute('method') === null || + document.forms[i].getAttribute('method').toLowerCase() === 'post') { + // remove old sets + let fields = forms[i].querySelectorAll('.ct_no_cookie_hidden_field'); + for ( let j = 0; j < fields.length; j++ ) { + fields[j].outerHTML = ''; + } + // add new set + document.forms[i].append(ctNoCookieConstructHiddenField()); + } + } + } +} + +const defaultFetch = window.fetch; +const defaultSend = XMLHttpRequest.prototype.send; + +if (document.readyState !== 'loading') { + checkFormsExistForCatching(); +} else { + apbct_attach_event_handler(document, 'DOMContentLoaded', checkFormsExistForCatching); +} + +/** + * checkFormsExistForCatching + */ +function checkFormsExistForCatching() { + setTimeout(function() { + if (isFormThatNeedCatch()) { + window.fetch = function(...args) { + if (args && + args[0] && + typeof args[0].includes === 'function' && + args[0].includes('/wp-json/metform/') + ) { + let noCookieData = getNoCookieData(); + + if (args && args[1] && args[1].body) { + args[1].body.append('ct_no_cookie_hidden_field', noCookieData); + } + } + + return defaultFetch.apply(window, args); + }; + } + }, 1000); +} + +/** + * @return {boolean} + */ +function isFormThatNeedCatch() { + const formClasses = [ + 'metform-form-content', + ]; + let classExists = false; + + const forms = document.forms; + for (let form of forms) { + formClasses.forEach(function(classForm) { + if (form.classList.contains(classForm)) { + classExists = true; + } + }); + } + + return classExists; +} + +/** + * @param {HTMLElement} form + * @return {boolean} + */ +function isFormThatNeedCatchXhr(form) { + if (document.querySelector('div.elementor-widget[title=\'Login/Signup\']') != null) { + return false; + } + if (form && form.action && form.action.toString().indexOf('mailpoet_subscription_form') !== -1) { + return true; + } + + return false; +} + +/** + * @return {string} + */ +function getNoCookieData() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + let noCookieData = {...noCookieDataLocal, ...noCookieDataSession}; + noCookieData = JSON.stringify(noCookieData); + + return '_ct_no_cookie_data_' + btoa(noCookieData); +} + +/** + * Set three statements to the sessions storage: apbct_session_current_page, apbct_prev_referer. + * @return {void} + */ +function apbctWriteReferrersToSessionStorage() { + const sessionCurrentPage = apbctSessionStorage.get('apbct_session_current_page'); + + // set session apbct_referer + if (sessionCurrentPage!== false && document.location.href !== sessionCurrentPage) { + apbctSessionStorage.set('apbct_prev_referer', sessionCurrentPage, false); + } + + // set session current page to know referrer + apbctSessionStorage.set('apbct_session_current_page', document.location.href, false); +} + +/** + * WooCommerce add to cart by GET request params collecting + */ +function apbctCheckAddToCartByGet() { + // 1) Collect all links with add_to_cart_button class + document.querySelectorAll('a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)').forEach((el) => { + el.addEventListener('click', function(e) { + let href = el.getAttribute('href'); + // 2) Add to href attribute additional parameter ct_bot_detector_event_token gathered from apbctLocalStorage + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if ( eventToken ) { + if ( href.indexOf('?') === -1 ) { + href += '?'; + } else { + href += '&'; + } + href += 'ct_bot_detector_event_token=' + eventToken; + el.setAttribute('href', href); + } + }); + }); +} + +/* Cleantalk Modal object */ +let cleantalkModal = { + + // Flags + loaded: false, + loading: false, + opened: false, + opening: false, + ignoreURLConvert: false, + + // Methods + load: function( action ) { + if ( ! this.loaded ) { + this.loading = true; + let callback = function( result, data, params, obj ) { + cleantalkModal.loading = false; + cleantalkModal.loaded = result; + document.dispatchEvent( + new CustomEvent( 'cleantalkModalContentLoaded', { + bubbles: true, + } ), + ); + }; + // eslint-disable-next-line camelcase + if ( typeof apbct_admin_sendAJAX === 'function' ) { + apbct_admin_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } else { + apbct_public_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } + } + }, + + open: function() { + /* Cleantalk Modal CSS start */ + let renderCss = function() { + let cssStr = ''; + // eslint-disable-next-line guard-for-in + for ( const key in this.styles ) { + cssStr += key + ':' + this.styles[key] + ';'; + } + return cssStr; + }; + let overlayCss = { + styles: { + 'z-index': '9999999999', + 'position': 'fixed', + 'top': '0', + 'left': '0', + 'width': '100%', + 'height': '100%', + 'background': 'rgba(0,0,0,0.5)', + 'display': 'flex', + 'justify-content': 'center', + 'align-items': 'center', + }, + toString: renderCss, + }; + let innerCss = { + styles: { + 'position': 'relative', + 'padding': '30px', + 'background': '#FFF', + 'border': '1px solid rgba(0,0,0,0.75)', + 'border-radius': '4px', + 'box-shadow': '7px 7px 5px 0px rgba(50,50,50,0.75)', + }, + toString: renderCss, + }; + let closeCss = { + styles: { + 'position': 'absolute', + 'background': '#FFF', + 'width': '20px', + 'height': '20px', + 'border': '2px solid rgba(0,0,0,0.75)', + 'border-radius': '15px', + 'cursor': 'pointer', + 'top': '-8px', + 'right': '-8px', + 'box-sizing': 'content-box', + }, + toString: renderCss, + }; + let closeCssBefore = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(45deg)', + }, + toString: renderCss, + }; + let closeCssAfter = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(-45deg)', + }, + toString: renderCss, + }; + let bodyCss = { + styles: { + 'overflow': 'hidden', + }, + toString: renderCss, + }; + let cleantalkModalStyle = document.createElement( 'style' ); + cleantalkModalStyle.setAttribute( 'id', 'cleantalk-modal-styles' ); + cleantalkModalStyle.innerHTML = 'body.cleantalk-modal-opened{' + bodyCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-overlay{' + overlayCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close{' + closeCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:before{' + closeCssBefore + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:after{' + closeCssAfter + '}'; + document.body.append( cleantalkModalStyle ); + /* Cleantalk Modal CSS end */ + + let overlay = document.createElement( 'div' ); + overlay.setAttribute( 'id', 'cleantalk-modal-overlay' ); + document.body.append( overlay ); + + document.body.classList.add( 'cleantalk-modal-opened' ); + + let inner = document.createElement( 'div' ); + inner.setAttribute( 'id', 'cleantalk-modal-inner' ); + inner.setAttribute( 'style', innerCss ); + overlay.append( inner ); + + let close = document.createElement( 'div' ); + close.setAttribute( 'id', 'cleantalk-modal-close' ); + inner.append( close ); + + let content = document.createElement( 'div' ); + if ( this.loaded ) { + const urlRegex = /(https?:\/\/[^\s]+)/g; + const serviceContentRegex = /.*\/inc/g; + if (serviceContentRegex.test(this.loaded) || this.ignoreURLConvert) { + content.innerHTML = this.loaded; + } else { + content.innerHTML = this.loaded.replace(urlRegex, '$1'); + } + } else { + content.innerHTML = 'Loading...'; + // @ToDo Here is hardcoded parameter. Have to get this from a 'data-' attribute. + this.load( 'get_options_template' ); + } + content.setAttribute( 'id', 'cleantalk-modal-content' ); + inner.append( content ); + + this.opened = true; + }, + + close: function() { + document.body.classList.remove( 'cleantalk-modal-opened' ); + document.getElementById( 'cleantalk-modal-overlay' ).remove(); + document.getElementById( 'cleantalk-modal-styles' ).remove(); + document.dispatchEvent( + new CustomEvent( 'cleantalkModalClosed', { + bubbles: true, + } ), + ); + }, + +}; + +/* Cleantalk Modal helpers */ +document.addEventListener('click', function( e ) { + if ( e.target && (e.target.id === 'cleantalk-modal-overlay' || e.target.id === 'cleantalk-modal-close') ) { + cleantalkModal.close(); + } +}); +document.addEventListener('cleantalkModalContentLoaded', function( e ) { + if ( cleantalkModal.opened && cleantalkModal.loaded ) { + document.getElementById( 'cleantalk-modal-content' ).innerHTML = cleantalkModal.loaded; + } +}); + +document.addEventListener('DOMContentLoaded', function() { + let ctTrpLocalize = undefined; + let ctTrpIsAdminCommentsList = false; + + if ( typeof ctPublic !== 'undefined' || typeof ctTrpAdminLocalize !== 'undefined' ) { + if ( typeof ctPublic !== 'undefined' && ctPublic.theRealPerson ) { + ctTrpLocalize = ctPublic.theRealPerson; + } + if ( + typeof ctTrpLocalize === 'undefined' && + typeof ctTrpAdminLocalize !== 'undefined' && + ctTrpAdminLocalize.theRealPerson + ) { + ctTrpLocalize = ctTrpAdminLocalize.theRealPerson; + ctTrpIsAdminCommentsList = true; + } + } + + if ( ! ctTrpLocalize ) { + return; + } + + // Selectors. Try to handle the WIDE range of themes. + let themesCommentsSelector = '.apbct-trp *[class*="comment-author"]'; + if ( document.querySelector('.apbct-trp .comment-author .comment-author-link') ) { + // For Spacious theme + themesCommentsSelector = '.apbct-trp *[class*="comment-author-link"]'; + } + let woocommerceReviewsSelector = '.apbct-trp *[class*="review__author"]'; + let adminCommentsListSelector = '.apbct-trp td[class*="column-author"] > strong'; + const trpComments = document.querySelectorAll( + themesCommentsSelector + ',' + + woocommerceReviewsSelector + ',' + + adminCommentsListSelector); + + if ( trpComments.length === 0 ) { + return; + } + + trpComments.forEach(( element, index ) => { + // Exceptions for items that are included in the selection + if ( + typeof pagenow == 'undefined' && + element.parentElement.className.indexOf('group') < 0 && + element.tagName != 'DIV' + ) { + return; + } + + let trpLayout = document.createElement('div'); + trpLayout.setAttribute('class', 'apbct-real-user-badge'); + + let trpImage = document.createElement('img'); + trpImage.setAttribute('src', ctTrpLocalize.imgPersonUrl); + trpImage.setAttribute('class', 'apbct-real-user-popup-img'); + + let trpDescription = document.createElement('div'); + trpDescription.setAttribute('class', 'apbct-real-user-popup'); + + let trpDescriptionHeading = document.createElement('p'); + trpDescriptionHeading.setAttribute('class', 'apbct-real-user-popup-header'); + trpDescriptionHeading.append(ctTrpLocalize.phrases.trpHeading); + + let trpDescriptionContent = document.createElement('div'); + trpDescriptionContent.setAttribute('class', 'apbct-real-user-popup-content_row'); + + let trpDescriptionContentSpan = document.createElement('span'); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent1 + ' '); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent2); + + if ( ctTrpIsAdminCommentsList ) { + let learnMoreLink = document.createElement('a'); + learnMoreLink.setAttribute('href', ctTrpLocalize.trpContentLink); + learnMoreLink.setAttribute('target', '_blank'); + learnMoreLink.text = ctTrpLocalize.phrases.trpContentLearnMore; + trpDescriptionContentSpan.append(' '); // Need one space + trpDescriptionContentSpan.append(learnMoreLink); + } + + trpDescriptionContent.append(trpDescriptionContentSpan); + trpDescription.append(trpDescriptionHeading, trpDescriptionContent); + trpLayout.append(trpImage); + element.append(trpLayout); + element.append(trpDescription); + }); + + const badges = document.querySelectorAll('.apbct-real-user-badge'); + + badges.forEach((badge) => { + let hideTimeout = undefined; + + this.body.addEventListener('click', function(e) { + if ( + e.target.className.indexOf('apbct-real-user') == -1 && + e.target.parentElement.className.indexOf('apbct-real-user') == -1 + ) { + closeAllPopupTRP(); + } + }); + + badge.addEventListener('click', function() { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.toggle('visible'); + } + }); + + badge.addEventListener('mouseenter', function() { + closeAllPopupTRP(); + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.add('visible'); + } + }); + + badge.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + const popup = badge.nextElementSibling; + popup.addEventListener('mouseenter', function() { + clearTimeout(hideTimeout); + popup.classList.add('visible'); + }); + + popup.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + if (popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + // For mobile devices + badge.addEventListener('touchend', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + const selection = window.getSelection(); + // Check if no text is selected + if (popup && selection && popup.classList.contains('apbct-real-user-popup') && + selection.toString().length === 0 + ) { + popup.classList.remove('visible'); + } else { + clearTimeout(hideTimeout); + document.addEventListener('selectionchange', function onSelectionChange() { + const selection = window.getSelection(); + if (selection && selection.toString().length === 0) { + // Restart the hide timeout when selection is cleared + hideTimeout = setTimeout(() => { + const popup = badge.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 3000); + document.removeEventListener('selectionchange', onSelectionChange); + } + }); + } + }, 3000); + }); + }); +}); + +/** + * Closing all TRP popup + */ +function closeAllPopupTRP() { + let allDisplayPopup = document.querySelectorAll('.apbct-real-user-popup.visible'); + if (allDisplayPopup.length > 0) { + allDisplayPopup.forEach((element) => { + element.classList.remove('visible'); + }); + } +} + +/** + * Handle external forms + */ +function ctProtectExternal() { + for (let i = 0; i < document.forms.length; i++) { + if (document.forms[i].cleantalk_hidden_action === undefined && + document.forms[i].cleantalk_hidden_method === undefined) { + // current form + const currentForm = document.forms[i]; + + // skip excluded forms + if ( formIsExclusion(currentForm)) { + continue; + } + + // Ajax checking for the integrated forms - will be changed the whole form object to make protection + if ( isIntegratedForm(currentForm) ) { + apbctProcessExternalForm(currentForm, i, document); + + // Ajax checking for the integrated forms - will be changed only submit button to make protection + } else if ( + // MooForm 3rd party service + currentForm.dataset.mailingListId !== undefined || + (typeof(currentForm.action) == 'string' && + (currentForm.action.indexOf('webto.salesforce.com') !== -1)) || + (typeof(currentForm.action) == 'string' && + currentForm.querySelector('[href*="activecampaign"]')) || + ( + typeof(currentForm.action) == 'string' && + currentForm.action.indexOf('hsforms.com') !== -1 && + currentForm.getAttribute('data-hs-cf-bound') + ) + ) { + apbctProcessExternalFormByFakeButton(currentForm, i, document); + // Common flow - modify form's action + } else if ( + typeof(currentForm.action) == 'string' && + ( currentForm.action.indexOf('http://') !== -1 || + currentForm.action.indexOf('https://') !== -1 ) + ) { + let tmp = currentForm.action.split('//'); + tmp = tmp[1].split('/'); + const host = tmp[0].toLowerCase(); + + if (host !== location.hostname.toLowerCase()) { + const ctAction = document.createElement('input'); + ctAction.name = 'cleantalk_hidden_action'; + ctAction.value = currentForm.action; + ctAction.type = 'hidden'; + currentForm.appendChild(ctAction); + + const ctMethod = document.createElement('input'); + ctMethod.name = 'cleantalk_hidden_method'; + ctMethod.value = currentForm.method; + ctMethod.type = 'hidden'; + + currentForm.method = 'POST'; + + currentForm.appendChild(ctMethod); + + currentForm.action = document.location; + } + } + } + } + // Trying to process external form into an iframe + apbctProcessIframes(); + // if form is still not processed by fields listening, do it here + ctStartFieldsListening(); +} + +/** + * Exclusion forms + * @param {HTMLElement} currentForm + * @return {boolean} + */ +function formIsExclusion(currentForm) { + const exclusionsById = [ + 'give-form', // give form exclusion because of direct integration + 'frmCalc', // nobletitle-calc + 'ihf-contact-request-form', + 'wpforms', // integration with wpforms + ]; + + const exclusionsByRole = [ + 'search', // search forms + ]; + + const exclusionsByClass = [ + 'search-form', // search forms + 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic + 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic + 'nf-form-content', // integration with Ninja Forms for js events + 'elementor-form', // integration with elementor-form + 'wpforms', // integration with wpforms + 'et_pb_searchform', // integration with elementor-search-form + ]; + + const exclusionsByAction = [ + 'paypal.com/cgi-bin/webscr', // search forms + ]; + + let result = false; + + try { + // mewto forms exclusion + if (currentForm.parentElement && + currentForm.parentElement.classList.length > 0 && + currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) { + result = true; + } + + if (currentForm.getAttribute('action') !== null) { + exclusionsByAction.forEach(function(exclusionAction) { + if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) { + result = true; + } + }); + } + + exclusionsById.forEach(function(exclusionId) { + const formId = currentForm.getAttribute('id'); + if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) { + result = true; + } + }); + + exclusionsByClass.forEach(function(exclusionClass) { + let foundClass = ''; + if (currentForm.getAttribute('class')) { + foundClass = currentForm.getAttribute('class'); + } else { + foundClass = apbctGetFormClass(currentForm, exclusionClass); + } + const formClass = foundClass; + if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) { + if (currentForm.getAttribute('data-hs-cf-bound')) { + result = false; + } else { + result = true; + } + } + }); + + exclusionsByRole.forEach(function(exclusionRole) { + const formRole = currentForm.getAttribute('id'); + if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) { + result = true; + } + }); + } catch (e) { + console.table('APBCT ERROR: formIsExclusion() - ', e); + } + + return result; +} + +/** + * Gets the form class if it is not in + * @param {HTMLElement} currentForm + * @param {string} exclusionClass + * @return {string} + */ +function apbctGetFormClass(currentForm, exclusionClass) { + if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) { + return exclusionClass; + } +} + +/** + * Handle external forms in iframes + */ +function apbctProcessIframes() { + const frames = document.getElementsByTagName('iframe'); + + if ( frames.length > 0 ) { + for ( let j = 0; j < frames.length; j++ ) { + if ( frames[j].contentDocument == null ) { + continue; + } + + const iframeForms = frames[j].contentDocument.forms; + if ( iframeForms.length === 0 ) { + continue; + } + + for ( let y = 0; y < iframeForms.length; y++ ) { + const currentForm = iframeForms[y]; + if ( formIsExclusion(currentForm)) { + continue; + } + apbctProcessExternalForm(currentForm, y, frames[j].contentDocument); + } + } + } +} + +/** + * Process external forms + * @param {HTMLElement} currentForm + * @param {int} iterator + * @param {HTMLElement} documentObject + */ +function apbctProcessExternalForm(currentForm, iterator, documentObject) { + const cleantalkPlaceholder = document.createElement('i'); + cleantalkPlaceholder.className = 'cleantalk_placeholder'; + cleantalkPlaceholder.style = 'display: none'; + + currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm); + + // Deleting form to prevent submit event + const prev = currentForm.previousSibling; + const formHtml = currentForm.outerHTML; + const formOriginal = currentForm; + + // Remove the original form + currentForm.parentElement.removeChild(currentForm); + + // Insert a clone + const placeholder = document.createElement('div'); + placeholder.innerHTML = formHtml; + prev.after(placeholder.firstElementChild); + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + + const reUseCurrentForm = documentObject.forms[iterator]; + + reUseCurrentForm.appendChild(forceAction); + reUseCurrentForm.apbctPrev = prev; + reUseCurrentForm.apbctFormOriginal = formOriginal; + + // mailerlite integration - disable click on submit button + let mailerliteDetectedClass = false; + if (reUseCurrentForm.classList !== undefined) { + // list there all the mailerlite classes + const mailerliteClasses = ['newsletterform', 'ml-block-form']; + mailerliteClasses.forEach(function(mailerliteClass) { + if (reUseCurrentForm.classList.contains(mailerliteClass)) { + mailerliteDetectedClass = mailerliteClass; + } + }); + } + + let mailerliteSubmitButton = null; + if ( mailerliteDetectedClass ) { + mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type="submit"]'); + if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) { + mailerliteSubmitButton.addEventListener('click', function(event) { + event.preventDefault(); + sendAjaxCheckingFormData(reUseCurrentForm); + }); + } + return; + } + + documentObject.forms[iterator].onsubmit = function(event) { + event.preventDefault(); + sendAjaxCheckingFormData(event.currentTarget); + }; +} + +/** + * Process external forms via fake button replacing + * @param {HTMLElement} currentForm + * @param {int} iterator + * @param {HTMLElement} documentObject + */ +function apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) { + const submitButtonOriginal = currentForm.querySelector('[type="submit"]'); + const onsubmitOriginal = currentForm.querySelector('[type="submit"]').form.onsubmit; + + if ( ! submitButtonOriginal ) { + return; + } + + const parent = submitButtonOriginal.parentElement; + const submitButtonHtml = submitButtonOriginal.outerHTML; + + // Remove the original submit button + submitButtonOriginal.remove(); + + // Insert a clone of the submit button + const placeholder = document.createElement('div'); + placeholder.innerHTML = submitButtonHtml; + parent.appendChild(placeholder.firstElementChild); + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + + const reUseCurrentForm = documentObject.forms[iterator]; + + reUseCurrentForm.appendChild(forceAction); + reUseCurrentForm.apbctParent = parent; + reUseCurrentForm.submitButtonOriginal = submitButtonOriginal; + reUseCurrentForm.onsubmitOriginal = onsubmitOriginal; + + documentObject.forms[iterator].onsubmit = function(event) { + event.preventDefault(); + + // MooSend spinner activate + apbctMoosendSpinnerToggle(event.currentTarget); + + sendAjaxCheckingFormData(event.currentTarget); + }; +} + +/** + * Activate or deactivate spinner for Moosend form during request checking + * @param {HTMLElement} form + */ +function apbctMoosendSpinnerToggle(form) { + const buttonElement = form.querySelector('button[type="submit"]'); + if ( buttonElement ) { + const spinner = buttonElement.querySelector('i'); + const submitText = buttonElement.querySelector('span'); + if (spinner && submitText) { + if ( spinner.style.zIndex == 1 ) { + submitText.style.opacity = 1; + spinner.style.zIndex = -1; + spinner.style.opacity = 0; + } else { + submitText.style.opacity = 0; + spinner.style.zIndex = 1; + spinner.style.opacity = 1; + } + } + } +} + +/** + * Process external forms + * @param {HTMLElement} formSource + * @param {HTMLElement} formTarget + */ +function apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) { + const inputsSource = formSource.querySelectorAll('button, input, textarea, select'); + const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select'); + + if (formSource.outerHTML.indexOf('action="https://www.kulahub.net') !== -1 || + isFormHasDiviRedirect(formSource) || + formSource.outerHTML.indexOf('class="et_pb_contact_form') !== -1 || + formSource.outerHTML.indexOf('action="https://api.kit.com') !== -1 || + formSource.outerHTML.indexOf('activehosted.com') !== -1 || + formSource.outerHTML.indexOf('action="https://crm.zoho.com') !== -1 + ) { + inputsSource.forEach((elemSource) => { + inputsTarget.forEach((elemTarget) => { + if (elemSource.name === elemTarget.name) { + if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') { + elemTarget.checked = apbctVal(elemSource); + } else { + elemTarget.value = apbctVal(elemSource); + } + } + }); + }); + + return; + } + + inputsSource.forEach((elemSource) => { + inputsTarget.forEach((elemTarget) => { + if (elemSource.outerHTML === elemTarget.outerHTML) { + if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') { + elemTarget.checked = apbctVal(elemSource); + } else { + elemTarget.value = apbctVal(elemSource); + } + } + }); + }); +} +// clear protected iframes list +apbctLocalStorage.set('apbct_iframes_protected', []); +window.addEventListener('load', function() { + if ( ! +ctPublic.settings__forms__check_external ) { + return; + } + + setTimeout(function() { + ctProtectExternal(); + catchDynamicRenderedForm(); + catchNextendSocialLoginForm(); + ctProtectOutsideIframe(); + }, 2000); + + ctProtectKlaviyoForm(); +}); + +/** + * Protect klaviyo forms + */ +function ctProtectKlaviyoForm() { + if (!document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')) { + return; + } + + let i = setInterval(() => { + const klaviyoForms = document.querySelectorAll('form.klaviyo-form'); + if (klaviyoForms.length) { + clearInterval(i); + klaviyoForms.forEach((form, index) => { + apbctProcessExternalFormKlaviyo(form, index, document); + }); + } + }, 500); +} + +/** + * Protect klaviyo forms + * @param {HTMLElement} form + * @param {int} iterator + * @param {HTMLElement} documentObject + */ +function apbctProcessExternalFormKlaviyo(form, iterator, documentObject) { + const btn = form.querySelector('button[type="button"].needsclick'); + if (!btn) { + return; + } + btn.disabled = true; + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + form.appendChild(forceAction); + + let cover = document.createElement('div'); + cover.id = 'apbct-klaviyo-cover'; + cover.style.width = '100%'; + cover.style.height = '100%'; + cover.style.background = 'black'; + cover.style.opacity = 0; + cover.style.position = 'absolute'; + cover.style.top = 0; + cover.style.cursor = 'pointer'; + cover.onclick = function(e) { + sendAjaxCheckingFormData(form); + }; + btn.parentNode.style.position = 'relative'; + btn.parentNode.appendChild(cover); +} + +/** + * Protect forms placed in iframe with outside src + */ +function ctProtectOutsideIframe() { + let iframes = document.querySelectorAll('iframe'); + if (iframes.length > 0) { + iframes.forEach(function(iframe) { + if (iframe.src.indexOf('form.typeform.com') !== -1 || + iframe.src.indexOf('forms.zohopublic.com') !== -1 || + iframe.src.indexOf('link.surepathconnect.com') !== -1 || + iframe.src.indexOf('hello.dubsado.com') !== -1 || + iframe.classList.contains('hs-form-iframe') || + ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1) + ) { + // pass if is already protected + if (false !== apbctLocalStorage.get('apbct_iframes_protected') && + apbctLocalStorage.get('apbct_iframes_protected').length > 0 && + typeof iframe.id !== 'undefined' && + apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1 + ) { + return; + } + ctProtectOutsideIframeHandler(iframe); + } + }); + } +} + +let ctProtectOutsideIframeCheck; +/** + * Protect forms placed in iframe with outside src handler + * @param {HTMLElement} iframe + */ +function ctProtectOutsideIframeHandler(iframe) { + let cover = document.createElement('div'); + cover.style.width = '100%'; + cover.style.height = '100%'; + cover.style.background = 'black'; + cover.style.opacity = 0; + cover.style.position = 'absolute'; + cover.style.top = 0; + cover.onclick = function(e) { + if (ctProtectOutsideIframeCheck === undefined) { + let currentDiv = e.currentTarget; + currentDiv.style.opacity = 0.5; + let preloader = document.createElement('div'); + preloader.className = 'apbct-iframe-preloader'; + currentDiv.appendChild(preloader); + let botDetectorToken = ''; + if (document.querySelector('[name*="ct_bot_detector_event_token"]')) { + botDetectorToken = document.querySelector('[name*="ct_bot_detector_event_token"]').value; + } + + let data = { + 'action': 'cleantalk_outside_iframe_ajax_check', + 'ct_no_cookie_hidden_field': getNoCookieData(), + 'ct_bot_detector_event_token': botDetectorToken, + }; + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function(result) { + ctProtectOutsideIframeCheck = true; + if (result.apbct.blocked === false) { + document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) { + el.parentNode.remove(); + }); + } else { + document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => { + el.parentNode.style.color = 'white'; + el.parentNode.innerHTML += result.apbct.comment; + }); + document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => { + el.remove(); + }); + } + }, + }, + ); + } + }; + iframe.parentNode.style.position = 'relative'; + iframe.parentNode.appendChild(cover); + let iframes = apbctLocalStorage.get('apbct_iframes_protected'); + if (false === iframes) { + iframes = []; + } + if (typeof iframe.id !== 'undefined') { + iframes.push(iframe.id); + apbctLocalStorage.set('apbct_iframes_protected', iframes); + } +} + +/** + * Catch NSL form integration + */ +function catchNextendSocialLoginForm() { + let blockNSL = document.getElementById('nsl-custom-login-form-main'); + if (blockNSL) { + blockBtnNextendSocialLogin(blockNSL); + } +} + +/** + * Blocking NSL plugin buttons + * @param {HTMLElement} blockNSL + */ +function blockBtnNextendSocialLogin(blockNSL) { + let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a'); + let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin="nsl"] .nsl-button'); + parentBtnsNSL.forEach((el) => { + el.setAttribute('data-oauth-login-blocked', 'true'); + el.addEventListener('click', (event) => { + event.preventDefault(); + }); + }); + childBtnsNSL.forEach((el) => { + el.addEventListener('click', (event) => { + event.preventDefault(); + event.stopPropagation(); + ctCheckAjax(el); + }); + }); +} + +/** + * Unlocking the button and clicking on it after an ajax response + * @param {HTMLElement} childBtn + */ +function allowAjaxNextendSocialLogin(childBtn) { + childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false'); + childBtn.parentElement.click(); +} + +/** + * Locking the button and entering a message after an ajax response + * @param {HTMLElement} childBtn + * @param {string} msg + */ +function forbiddenAjaxNextendSocialLogin(childBtn, msg) { + let parentElement = childBtn.parentElement; + if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') { + parentElement.setAttribute('data-oauth-login-blocked', 'true'); + } + if (!document.querySelector('.ct-forbidden-msg')) { + let elemForMsg = document.createElement('div'); + elemForMsg.className = 'ct-forbidden-msg'; + elemForMsg.style.background = 'red'; + elemForMsg.style.color = 'white'; + elemForMsg.style.padding = '5px'; + elemForMsg.innerHTML = msg; + parentElement.insertAdjacentElement('beforebegin', elemForMsg); + } +} + +/** + * User verification using user data and ajax + * @param {HTMLElement} elem + */ +function ctCheckAjax(elem) { + let data = { + 'action': 'cleantalk_nsl_ajax_check', + 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value, + }; + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function(result) { + if (result.apbct.blocked === false) { + allowAjaxNextendSocialLogin(elem); + } else { + forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment); + } + }, + }, + ); +} + +/** + * Checking the form integration + * @param {HTMLElement} formObj + * @return {boolean} + */ +function isIntegratedForm(formObj) { + const formAction = typeof(formObj.action) == 'string' ? formObj.action : ''; + const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : ''; + const formClassName = typeof(formObj.className) == 'string' ? formObj.className : ''; + + if ( + ( + formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form + formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form + formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form + ) || + ( formObj.firstChild.classList !== undefined && + formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form + formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration + formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration + formAction.indexOf('paypal.com') !== -1 || + formAction.indexOf('infusionsoft.com') !== -1 || + formAction.indexOf('secure2.convio.net') !== -1 || + formAction.indexOf('hookb.in') !== -1 || + formAction.indexOf('external.url') !== -1 || + formAction.indexOf('tp.media') !== -1 || + formAction.indexOf('flodesk.com') !== -1 || + formAction.indexOf('sendfox.com') !== -1 || + formAction.indexOf('aweber.com') !== -1 || + formAction.indexOf('secure.payu.com') !== -1 || + formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 || + formId.indexOf('ihf-contact-request-form') !== -1 || + formAction.indexOf('crm.zoho.com') !== -1 || + formId.indexOf('delivra-external-form') !== -1 || + // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227 + // ( formObj.classList !== undefined && + // !formObj.classList.contains('woocommerce-checkout') && + // formObj.hasAttribute('data-hs-cf-bound') + // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form + formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration + formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration + isFormHasDiviRedirect(formObj) || // Divi contact form + formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form + formAction.indexOf('wufoo.com') !== -1 || // Wufoo form + formAction.indexOf('activehosted.com') !== -1 || // Activehosted form + formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica + ( + formAction.indexOf('whatsapp.com') !== -1 && + formClassName.indexOf('chaty') !== -1 + ) || // chaty plugin whatsapp form + ( + formObj.classList !== undefined && + formObj.classList.contains('sp-element-container') + ) || // Sendpulse form + apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms + ) { + return true; + } + + return false; +} + +/** + * This function detect if the form has DIVI redirect. If so, the form will work as external. + * @param {HTMLElement} formObj + * @return {boolean} + */ +function isFormHasDiviRedirect(formObj) { + let result = false; + const diviRedirectedSignSet = document.querySelector('div[id^="et_pb_contact_form"]'); + if ( + typeof formObj === 'object' && formObj !== null && + diviRedirectedSignSet !== null && + diviRedirectedSignSet.hasAttribute('data-redirect_url') && + diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' && + diviRedirectedSignSet.querySelector('form[class^="et_pb_contact_form"]') !== null + ) { + result = formObj === diviRedirectedSignSet.querySelector('form[class^="et_pb_contact_form"]'); + } + return result; +} + +/** + * Sending Ajax for checking form data + * @param {HTMLElement} form + * @param {HTMLElement} prev + * @param {HTMLElement} formOriginal + */ +function sendAjaxCheckingFormData(form) { + // Get visible fields and set cookie + const visibleFields = {}; + visibleFields[0] = apbct_collect_visible_fields(form); + apbct_visible_fields_set_cookie( visibleFields ); + + const data = { + 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'), + }; + let elems = form.elements; + elems = Array.prototype.slice.call(elems); + + elems.forEach( function( elem, y ) { + if ( elem.name === '' ) { + data['input_' + y] = elem.value; + } else { + data[elem.name] = elem.value; + } + }); + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function( result, data, params, obj ) { + // MooSend spinner deactivate + apbctMoosendSpinnerToggle(form); + // hubspot flag + const isHubSpotEmbedForm = ( + form.hasAttribute('action') && + form.getAttribute('action').indexOf('hsforms') !== -1 + ); + if ((result.apbct === undefined && result.data === undefined) || + (result.apbct !== undefined && ! +result.apbct.blocked) + ) { + // Clear service fields + for (const el of form.querySelectorAll('input[name="apbct_visible_fields"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[value="cleantalk_force_ajax_check"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[name="ct_no_cookie_hidden_field"]')) { + el.remove(); + } + + // Klaviyo integration + if (form.classList !== undefined && form.classList.contains('klaviyo-form')) { + const cover = document.getElementById('apbct-klaviyo-cover'); + if (cover) { + cover.remove(); + } + const btn = form.querySelector('button[type="button"].needsclick'); + if (btn) { + btn.disabled = false; + btn.click(); + } + return; + } + + // MooSend integration + if ( form.dataset.mailingListId !== undefined ) { + let submitButton = form.querySelector('[type="submit"]'); + submitButton.remove(); + const parent = form.apbctParent; + parent.appendChild(form.submitButtonOriginal); + submitButton = form.querySelector('[type="submit"]'); + submitButton.click(); + return; + } + + // Salesforce integration + if (form.hasAttribute('action') && + (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1) + ) { + let submitButton = form.querySelector('[type="submit"]'); + submitButton.remove(); + const parent = form.apbctParent; + parent.appendChild(form.submitButtonOriginal); + form.onsubmit = form.onsubmitOriginal; + submitButton = form.querySelector('[type="submit"]'); + submitButton.click(); + return; + } + + // Hubspot bounded integration + if (isHubSpotEmbedForm) { + let submitButton = form.querySelector('[type="submit"]'); + submitButton.remove(); + const parent = form.apbctParent; + parent.appendChild(form.submitButtonOriginal); + form.onsubmit = form.onsubmitOriginal; + submitButton = form.querySelector('[type="submit"]'); + submitButton.click(); + return; + } + + const formNew = form; + form.parentElement.removeChild(form); + const prev = form.apbctPrev; + const formOriginal = form.apbctFormOriginal; + let mauticIntegration = false; + + apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal); + + // mautic forms integration + if (formOriginal && + typeof formOriginal.id === 'string' && + formOriginal.id.indexOf('mautic') !== -1 + ) { + mauticIntegration = true; + } + + prev.after( formOriginal ); + + // Clear visible_fields input + for (const el of formOriginal.querySelectorAll('input[name="apbct_visible_fields"]')) { + el.remove(); + } + + for (const el of formOriginal.querySelectorAll('input[value="cleantalk_force_ajax_check"]')) { + el.remove(); + } + + // Common click event + let submButton = formOriginal.querySelectorAll('button[type=submit]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + if (mauticIntegration) { + setTimeout(function() { + ctProtectExternal(); + }, 1500); + } + return; + } + + submButton = formOriginal.querySelectorAll('input[type=submit]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + return; + } + + // ConvertKit direct integration + submButton = formOriginal.querySelectorAll('button[data-element="submit"]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + return; + } + submButton = formOriginal.querySelectorAll('button#ck_subscribe_button'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + return; + } + + // Paypal integration + submButton = formOriginal.querySelectorAll('input[type="image"][name="submit"]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + } + } + if ((result.apbct !== undefined && +result.apbct.blocked) || + (result.data !== undefined && result.data.message !== undefined) + ) { + ctParseBlockMessage(result); + // hubspot embed form needs to reload page to prevent forms mishandling + if (isHubSpotEmbedForm) { + setTimeout(function() { + document.location.reload(); + }, 3000); + } + } + }, + }); +} + +/** + * Handle dynamic rendered form + */ +function catchDynamicRenderedForm() { + const forms = document.getElementsByTagName('form'); + + catchDynamicRenderedFormHandler(forms); + + const frames = document.getElementsByTagName('iframe'); + if ( frames.length > 0 ) { + for ( let j = 0; j < frames.length; j++ ) { + if ( frames[j].contentDocument == null ) { + continue; + } + + const iframeForms = frames[j].contentDocument.forms; + + if ( iframeForms.length === 0 ) { + return; + } + + catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument); + } + } +} + +/** + * Handles dynamic rendered forms by attaching an onsubmit event handler to them. + * + * @param {HTMLCollection} forms - A collection of form elements to be processed. + * @param {Document} [documentObject=document] - The document object to use for querying elements. + */ +function catchDynamicRenderedFormHandler(forms, documentObject = document) { + const neededFormIds = []; + for (const form of forms) { + const formIdAttr = form.getAttribute('id'); + if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) { + neededFormIds.push(formIdAttr); + } + if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 && + (form.classList !== undefined && form.classList.contains('ihc-form-create-edit')) + ) { + neededFormIds.push(formIdAttr); + } + } + + for (const formId of neededFormIds) { + const form = documentObject.getElementById(formId); + form.apbct_external_onsubmit_prev = form.onsubmit; + form.onsubmit = sendAjaxCheckingDynamicFormData; + } +} + +/** + * Sending Ajax for checking form data on dynamic rendered form + * @param {HTMLElement} form + */ +function sendAjaxCheckingDynamicFormData(form) { + form.preventDefault(); + form.stopImmediatePropagation(); + const formEvent = form; + form = form.target; + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + form.appendChild(forceAction); + + // Get visible fields and set cookie + const visibleFields = {}; + visibleFields[0] = apbct_collect_visible_fields(form); + apbct_visible_fields_set_cookie(visibleFields); + form.append(ctNoCookieConstructHiddenField('hidden')); + + const data = {}; + let elems = form.elements; + elems = Array.prototype.slice.call(elems); + + elems.forEach( function( elem, y ) { + if ( elem.name === '' ) { + data['input_' + y] = elem.value; + } else { + data[elem.name] = elem.value; + } + }); + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function(result) { + if ( result.apbct === undefined || ! +result.apbct.blocked ) { + form.onsubmit = null; + + // Clear service fields + for (const el of form.querySelectorAll('input[name="apbct_visible_fields"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[value="cleantalk_force_ajax_check"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[name="ct_no_cookie_hidden_field"]')) { + el.remove(); + } + + // Call previous submit action + if (form.apbct_external_onsubmit_prev instanceof Function) { + let timerId = setTimeout(function() { + form.apbct_external_onsubmit_prev.call(form, formEvent); + }, 500); + clearTimeout(timerId); + } + + const submButton = form.querySelector('input[type="submit"]'); + if (submButton) { + submButton.click(); + return; + } + } + + if (result.apbct !== undefined && +result.apbct.blocked) { + ctParseBlockMessage(result); + } + }, + }); +} + +/** + * Implement jQuery val() function + * @param {HTMLElement} el + * @return {HTMLElements} + */ +function apbctVal(el) { + if (el.options && el.multiple) { + return el.options + .filter((option) => option.selected) + .map((option) => option.value); + } else if (el.type === 'checkbox' || el.type === 'radio') { + return el.checked ? el.checked : null; + } else { + return el.value; + } +} + +/** + * Checks if a form object is inside a div with a specified class name. + * + * @param {HTMLElement} formObj - The form element to check. + * @param {string} divClassName - The class name of the div to look for. + * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise. + */ +function apbctIsFormInDiv(formObj, divClassName) { + let parent = formObj.parentElement; + while (parent) { + if (parent.classList.contains(divClassName)) { + return true; + } + parent = parent.parentElement; + } + return false; +} diff --git a/js/src/apbct-public-bundle_full-protection.js b/js/src/apbct-public-bundle_full-protection.js index fb4315a8f..969a3e78d 100644 --- a/js/src/apbct-public-bundle_full-protection.js +++ b/js/src/apbct-public-bundle_full-protection.js @@ -1,444 +1,3 @@ -/** - * @return {HTMLElement} event - */ -function apbctSetEmailDecoderPopupAnimation() { - const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; - const animationWrapper = document.createElement('div'); - animationWrapper.classList = 'apbct-ee-animation-wrapper'; - for (let i = 0; i < animationElements.length; i++) { - const apbctEEAnimationDogOne = document.createElement('span'); - apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; - apbctEEAnimationDogOne.innerText = '@'; - animationWrapper.append(apbctEEAnimationDogOne); - } - return animationWrapper; -} - -/** - * @param {mixed} event - */ -function ctFillDecodedEmailHandler(event = false) { - let clickSource = false; - let ctWlBrandname = ''; - let encodedEmail = ''; - if (typeof ctPublic !== 'undefined') { - this.removeEventListener('click', ctFillDecodedEmailHandler); - // remember clickSource - clickSource = this; - // globally remember if emails is mixed with mailto - ctPublic.encodedEmailNodesIsMixed = false; - ctWlBrandname = ctPublic.wl_brandname; - encodedEmail = ctPublic.encodedEmailNodes; - } else if (typeof ctAdminCommon !== 'undefined') { - ctWlBrandname = ctAdminCommon.plugin_name; - encodedEmail = ctAdminCommon.encodedEmailNode; - } - - // get fade - document.body.classList.add('apbct-popup-fade'); - // popup show - let encoderPopup = document.getElementById('apbct_popup'); - if (!encoderPopup) { - // construct popup - let waitingPopup = document.createElement('div'); - waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); - waitingPopup.setAttribute('id', 'apbct_popup'); - - // construct text header - let popupHeaderWrapper = document.createElement('span'); - popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; - let popupHeader = document.createElement('p'); - popupHeader.innerText = ctWlBrandname; - popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); - popupHeaderWrapper.append(popupHeader); - - // construct text wrapper - let popupTextWrapper = document.createElement('div'); - popupTextWrapper.setAttribute('id', 'apbct_popup_text'); - popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); - popupTextWrapper.style.color = 'black'; - - // construct text first node - // todo make translatable - let popupTextWaiting = document.createElement('p'); - popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; - } - popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); - - // construct text second node - // todo make translatable - let popupTextDecoding = document.createElement('p'); - popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { - popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; - } else { - popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; - } - - // appending - popupTextWrapper.append(popupTextWaiting); - popupTextWrapper.append(popupTextDecoding); - waitingPopup.append(popupHeaderWrapper); - waitingPopup.append(popupTextWrapper); - waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); - document.body.append(waitingPopup); - } else { - encoderPopup.setAttribute('style', 'display: inherit'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; - } - } - - apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); -} - -/** - * @param {mixed} event - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { - if (event && clickSource) { - // collect data - const javascriptClientData = getJavascriptClientData(); - let data = { - event_javascript_data: javascriptClientData, - post_url: document.location.href, - referrer: document.referrer, - encodedEmails: '', - }; - let encodedEmailsCollection = {}; - for (let i = 0; i < encodedEmailNodes.length; i++) { - // disable click for mailto - if ( - typeof encodedEmailNodes[i].href !== 'undefined' && - encodedEmailNodes[i].href.indexOf('mailto:') === 0 - ) { - event.preventDefault(); - ctPublic.encodedEmailNodesIsMixed = true; - } - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - apbct(encodedEmailNodes[i]).append(apbctTooltip); - - // collect encoded email strings - encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; - } - - // JSONify encoded email strings - data.encodedEmails = JSON.stringify(encodedEmailsCollection); - - // Using REST API handler - if ( ctPublicFunctions.data__ajax_type === 'rest' ) { - apbct_public_sendREST( - 'apbct_decode_email', - { - data: data, - method: 'POST', - callback: function(result) { - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - - // Using AJAX request and handler - } else { - data.action = 'apbct_decode_email'; - apbct_public_sendAJAX( - data, - { - notJson: false, - callback: function(result) { - console.log('result'); - console.log(result); - - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - } - } else { - const encodedEmail = encodedEmailNodes.dataset.originalString; - let data = { - encodedEmails: JSON.stringify({0: encodedEmail}), - }; - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - encodedEmailNodes.appendChild(apbctTooltip); - - apbct_admin_sendAJAX( - { - 'action': 'apbct_decode_email', - 'encodedEmails': data.encodedEmails, - }, - { - 'callback': function(result) { - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); - }, - 'notJson': true, - }, - ); - } -} - -/** - * @param {mixed} result - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { - if (result.success && result.data[0].is_allowed === true) { - // start process of visual decoding - setTimeout(function() { - // popup remove - let popup = document.getElementById('apbct_popup'); - if (popup !== null) { - let email = ''; - if (clickSource) { - let currentResultData; - result.data.forEach((row) => { - if (row.encoded_email === clickSource.dataset.originalString) { - currentResultData = row; - } - }); - - email = currentResultData.decoded_email.split(/[&?]/)[0]; - } else { - email = result.data[0].decoded_email; - } - // handle first node - let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); - // get email selectable by click - let selectableEmail = document.createElement('b'); - selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); - selectableEmail.innerText = email; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { - selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; - } else { - selectableEmail.title = ctAdminCommon.text__ee_click_to_select; - } - // add email to the first node - if (firstNode) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { - firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } else { - firstNode.innerHTML = ctAdminCommon.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } - - firstNode.setAttribute('style', 'flex-direction: row;'); - } - // remove animation - let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); - if (wrapper) { - wrapper.remove(); - } - // remove second node - let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); - if (secondNode) { - secondNode.remove(); - } - // add button - let buttonWrapper = document.createElement('span'); - buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; - if (!document.querySelector('.apbct-email-encoder-got-it-button')) { - let button = document.createElement('button'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { - button.innerText = ctPublicFunctions.text__ee_got_it; - } else { - button.innerText = ctAdminCommon.text__ee_got_it; - } - button.classList = 'apbct-email-encoder-got-it-button'; - button.addEventListener('click', function() { - document.body.classList.remove('apbct-popup-fade'); - popup.setAttribute('style', 'display:none'); - fillDecodedNodes(encodedEmailNodes, result); - // click on mailto if so - if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { - clickSource.click(); - } - }); - buttonWrapper.append(button); - popup.append(buttonWrapper); - } - } - }, 3000); - } else { - if (clickSource) { - if (result.success) { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { - ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); - } - } else { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { - ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); - } - } - } else { - console.log('result', result); - } - } -} - -/** - * Reset click event for encoded email - */ -function resetEncodedNodes() { - if (typeof ctPublic.encodedEmailNodes !== 'undefined') { - ctPublic.encodedEmailNodes.forEach(function(element) { - element.addEventListener('click', ctFillDecodedEmailHandler); - }); - } -} - -/** - * Show Decode Comment - * @param {string} comment - */ -function ctShowDecodeComment(comment) { - if ( ! comment ) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { - comment = ctPublicFunctions.text__ee_cannot_decode; - } else { - comment = ctAdminCommon.text__ee_cannot_decode; - } - } - - let popup = document.getElementById('apbct_popup'); - let popupText = document.getElementById('apbct_popup_text'); - if (popup !== null) { - document.body.classList.remove('apbct-popup-fade'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { - popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; - } else { - popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; - } - setTimeout(function() { - popup.setAttribute('style', 'display:none'); - }, 3000); - } -} - -/** - * Run filling for every node with decoding result. - * @param {mixed} encodedNodes - * @param {mixed} decodingResult - */ -function fillDecodedNodes(encodedNodes, decodingResult) { - if (encodedNodes.length > 0) { - for (let i = 0; i < encodedNodes.length; i++) { - // chek what is what - let currentResultData; - decodingResult.data.forEach((row) => { - if (row.encoded_email === encodedNodes[i].dataset.originalString) { - currentResultData = row; - } - }); - // quit case on cloud block - if (currentResultData.is_allowed === false) { - return; - } - // handler for mailto - if ( - typeof encodedNodes[i].href !== 'undefined' && - ( - encodedNodes[i].href.indexOf('mailto:') === 0 || - encodedNodes[i].href.indexOf('tel:') === 0 - ) - ) { - let linkTypePrefix; - if (encodedNodes[i].href.indexOf('mailto:') === 0) { - linkTypePrefix = 'mailto:'; - } else if (encodedNodes[i].href.indexOf('tel:') === 0) { - linkTypePrefix = 'tel:'; - } else { - continue; - } - let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); - let baseElementContent = encodedNodes[i].innerHTML; - encodedNodes[i].innerHTML = baseElementContent.replace( - encodedEmail, - currentResultData.decoded_email, - ); - encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; - - encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { - let encodedEmailTextInsideMailto = ''; - decodingResult.data.forEach((row) => { - if (row.encoded_email === el.dataset.originalString) { - encodedEmailTextInsideMailto = row.decoded_email; - } - }); - el.innerHTML = encodedEmailTextInsideMailto; - }); - } else { - encodedNodes[i].classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); - }, 2000); - } - // remove listeners - encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); - } - } else { - let currentResultData = decodingResult.data[0]; - encodedNodes.classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes); - }, 2000); - encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); - } -} - -/** - * @param {mixed} response - * @param {mixed} targetElement - */ -function ctProcessDecodedDataResult(response, targetElement) { - targetElement.setAttribute('title', ''); - targetElement.removeAttribute('style'); - ctFillDecodedEmail(targetElement, response.decoded_email); -} - -/** - * @param {mixed} target - * @param {string} email - */ -function ctFillDecodedEmail(target, email) { - target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); -} - /** * Base class */ diff --git a/js/src/apbct-public-bundle_full-protection_comm-func.js b/js/src/apbct-public-bundle_full-protection_comm-func.js new file mode 100644 index 000000000..fb4315a8f --- /dev/null +++ b/js/src/apbct-public-bundle_full-protection_comm-func.js @@ -0,0 +1,5851 @@ +/** + * @return {HTMLElement} event + */ +function apbctSetEmailDecoderPopupAnimation() { + const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; + const animationWrapper = document.createElement('div'); + animationWrapper.classList = 'apbct-ee-animation-wrapper'; + for (let i = 0; i < animationElements.length; i++) { + const apbctEEAnimationDogOne = document.createElement('span'); + apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; + apbctEEAnimationDogOne.innerText = '@'; + animationWrapper.append(apbctEEAnimationDogOne); + } + return animationWrapper; +} + +/** + * @param {mixed} event + */ +function ctFillDecodedEmailHandler(event = false) { + let clickSource = false; + let ctWlBrandname = ''; + let encodedEmail = ''; + if (typeof ctPublic !== 'undefined') { + this.removeEventListener('click', ctFillDecodedEmailHandler); + // remember clickSource + clickSource = this; + // globally remember if emails is mixed with mailto + ctPublic.encodedEmailNodesIsMixed = false; + ctWlBrandname = ctPublic.wl_brandname; + encodedEmail = ctPublic.encodedEmailNodes; + } else if (typeof ctAdminCommon !== 'undefined') { + ctWlBrandname = ctAdminCommon.plugin_name; + encodedEmail = ctAdminCommon.encodedEmailNode; + } + + // get fade + document.body.classList.add('apbct-popup-fade'); + // popup show + let encoderPopup = document.getElementById('apbct_popup'); + if (!encoderPopup) { + // construct popup + let waitingPopup = document.createElement('div'); + waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); + waitingPopup.setAttribute('id', 'apbct_popup'); + + // construct text header + let popupHeaderWrapper = document.createElement('span'); + popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; + let popupHeader = document.createElement('p'); + popupHeader.innerText = ctWlBrandname; + popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); + popupHeaderWrapper.append(popupHeader); + + // construct text wrapper + let popupTextWrapper = document.createElement('div'); + popupTextWrapper.setAttribute('id', 'apbct_popup_text'); + popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); + popupTextWrapper.style.color = 'black'; + + // construct text first node + // todo make translatable + let popupTextWaiting = document.createElement('p'); + popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; + } + popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); + + // construct text second node + // todo make translatable + let popupTextDecoding = document.createElement('p'); + popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { + popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; + } else { + popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; + } + + // appending + popupTextWrapper.append(popupTextWaiting); + popupTextWrapper.append(popupTextDecoding); + waitingPopup.append(popupHeaderWrapper); + waitingPopup.append(popupTextWrapper); + waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); + document.body.append(waitingPopup); + } else { + encoderPopup.setAttribute('style', 'display: inherit'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; + } + } + + apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); +} + +/** + * @param {mixed} event + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { + if (event && clickSource) { + // collect data + const javascriptClientData = getJavascriptClientData(); + let data = { + event_javascript_data: javascriptClientData, + post_url: document.location.href, + referrer: document.referrer, + encodedEmails: '', + }; + let encodedEmailsCollection = {}; + for (let i = 0; i < encodedEmailNodes.length; i++) { + // disable click for mailto + if ( + typeof encodedEmailNodes[i].href !== 'undefined' && + encodedEmailNodes[i].href.indexOf('mailto:') === 0 + ) { + event.preventDefault(); + ctPublic.encodedEmailNodesIsMixed = true; + } + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + apbct(encodedEmailNodes[i]).append(apbctTooltip); + + // collect encoded email strings + encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; + } + + // JSONify encoded email strings + data.encodedEmails = JSON.stringify(encodedEmailsCollection); + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_decode_email', + { + data: data, + method: 'POST', + callback: function(result) { + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + + // Using AJAX request and handler + } else { + data.action = 'apbct_decode_email'; + apbct_public_sendAJAX( + data, + { + notJson: false, + callback: function(result) { + console.log('result'); + console.log(result); + + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + } + } else { + const encodedEmail = encodedEmailNodes.dataset.originalString; + let data = { + encodedEmails: JSON.stringify({0: encodedEmail}), + }; + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + encodedEmailNodes.appendChild(apbctTooltip); + + apbct_admin_sendAJAX( + { + 'action': 'apbct_decode_email', + 'encodedEmails': data.encodedEmails, + }, + { + 'callback': function(result) { + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); + }, + 'notJson': true, + }, + ); + } +} + +/** + * @param {mixed} result + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { + if (result.success && result.data[0].is_allowed === true) { + // start process of visual decoding + setTimeout(function() { + // popup remove + let popup = document.getElementById('apbct_popup'); + if (popup !== null) { + let email = ''; + if (clickSource) { + let currentResultData; + result.data.forEach((row) => { + if (row.encoded_email === clickSource.dataset.originalString) { + currentResultData = row; + } + }); + + email = currentResultData.decoded_email.split(/[&?]/)[0]; + } else { + email = result.data[0].decoded_email; + } + // handle first node + let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); + // get email selectable by click + let selectableEmail = document.createElement('b'); + selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); + selectableEmail.innerText = email; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { + selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; + } else { + selectableEmail.title = ctAdminCommon.text__ee_click_to_select; + } + // add email to the first node + if (firstNode) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { + firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } else { + firstNode.innerHTML = ctAdminCommon.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } + + firstNode.setAttribute('style', 'flex-direction: row;'); + } + // remove animation + let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); + if (wrapper) { + wrapper.remove(); + } + // remove second node + let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); + if (secondNode) { + secondNode.remove(); + } + // add button + let buttonWrapper = document.createElement('span'); + buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; + if (!document.querySelector('.apbct-email-encoder-got-it-button')) { + let button = document.createElement('button'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { + button.innerText = ctPublicFunctions.text__ee_got_it; + } else { + button.innerText = ctAdminCommon.text__ee_got_it; + } + button.classList = 'apbct-email-encoder-got-it-button'; + button.addEventListener('click', function() { + document.body.classList.remove('apbct-popup-fade'); + popup.setAttribute('style', 'display:none'); + fillDecodedNodes(encodedEmailNodes, result); + // click on mailto if so + if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { + clickSource.click(); + } + }); + buttonWrapper.append(button); + popup.append(buttonWrapper); + } + } + }, 3000); + } else { + if (clickSource) { + if (result.success) { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { + ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); + } + } else { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { + ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); + } + } + } else { + console.log('result', result); + } + } +} + +/** + * Reset click event for encoded email + */ +function resetEncodedNodes() { + if (typeof ctPublic.encodedEmailNodes !== 'undefined') { + ctPublic.encodedEmailNodes.forEach(function(element) { + element.addEventListener('click', ctFillDecodedEmailHandler); + }); + } +} + +/** + * Show Decode Comment + * @param {string} comment + */ +function ctShowDecodeComment(comment) { + if ( ! comment ) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { + comment = ctPublicFunctions.text__ee_cannot_decode; + } else { + comment = ctAdminCommon.text__ee_cannot_decode; + } + } + + let popup = document.getElementById('apbct_popup'); + let popupText = document.getElementById('apbct_popup_text'); + if (popup !== null) { + document.body.classList.remove('apbct-popup-fade'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { + popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; + } else { + popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; + } + setTimeout(function() { + popup.setAttribute('style', 'display:none'); + }, 3000); + } +} + +/** + * Run filling for every node with decoding result. + * @param {mixed} encodedNodes + * @param {mixed} decodingResult + */ +function fillDecodedNodes(encodedNodes, decodingResult) { + if (encodedNodes.length > 0) { + for (let i = 0; i < encodedNodes.length; i++) { + // chek what is what + let currentResultData; + decodingResult.data.forEach((row) => { + if (row.encoded_email === encodedNodes[i].dataset.originalString) { + currentResultData = row; + } + }); + // quit case on cloud block + if (currentResultData.is_allowed === false) { + return; + } + // handler for mailto + if ( + typeof encodedNodes[i].href !== 'undefined' && + ( + encodedNodes[i].href.indexOf('mailto:') === 0 || + encodedNodes[i].href.indexOf('tel:') === 0 + ) + ) { + let linkTypePrefix; + if (encodedNodes[i].href.indexOf('mailto:') === 0) { + linkTypePrefix = 'mailto:'; + } else if (encodedNodes[i].href.indexOf('tel:') === 0) { + linkTypePrefix = 'tel:'; + } else { + continue; + } + let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); + let baseElementContent = encodedNodes[i].innerHTML; + encodedNodes[i].innerHTML = baseElementContent.replace( + encodedEmail, + currentResultData.decoded_email, + ); + encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; + + encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { + let encodedEmailTextInsideMailto = ''; + decodingResult.data.forEach((row) => { + if (row.encoded_email === el.dataset.originalString) { + encodedEmailTextInsideMailto = row.decoded_email; + } + }); + el.innerHTML = encodedEmailTextInsideMailto; + }); + } else { + encodedNodes[i].classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); + }, 2000); + } + // remove listeners + encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); + } + } else { + let currentResultData = decodingResult.data[0]; + encodedNodes.classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes); + }, 2000); + encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); + } +} + +/** + * @param {mixed} response + * @param {mixed} targetElement + */ +function ctProcessDecodedDataResult(response, targetElement) { + targetElement.setAttribute('title', ''); + targetElement.removeAttribute('style'); + ctFillDecodedEmail(targetElement, response.decoded_email); +} + +/** + * @param {mixed} target + * @param {string} email + */ +function ctFillDecodedEmail(target, email) { + target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); +} + +/** + * Base class + */ +class ApbctCore { + ajax_parameters = {}; + restParameters = {}; + + selector = null; + elements = []; + + // Event properties + eventCallback; + eventSelector; + event; + + /** + * Default constructor + * @param {string} selector + */ + constructor(selector) { + this.select(selector); + } + + /** + * Get elements by CSS selector + * + * @param {string} selector + * @return {*} + */ + select(selector) { + if (selector instanceof HTMLCollection) { + this.selector = null; + this.elements = []; + this.elements = Array.prototype.slice.call(selector); + } else if ( typeof selector === 'object' ) { + this.selector = null; + this.elements = []; + this.elements[0] = selector; + } else if ( typeof selector === 'string' ) { + this.selector = selector; + this.elements = Array.prototype.slice.call(document.querySelectorAll(selector)); + // this.elements = document.querySelectorAll(selector)[0]; + } else { + this.deselect(); + } + + return this; + } + + /** + * @param {object|string} elemToAdd + */ + addElement(elemToAdd) { + if ( typeof elemToAdd === 'object' ) { + this.elements.push(elemToAdd); + } else if ( typeof elemToAdd === 'string' ) { + this.selector = elemToAdd; + this.elements = Array.prototype.slice.call(document.querySelectorAll(elemToAdd)); + } else { + this.deselect(); + } + } + + /** + * @param {object} elem + */ + push(elem) { + this.elements.push(elem); + } + + /** + * reduce + */ + reduce() { + this.elements = this.elements.slice(0, -1); + } + + /** + * deselect + */ + deselect() { + this.elements = []; + } + + /** + * Set or get CSS for/of currently selected element + * + * @param {object|string} style + * @param {boolean} getRaw + * + * @return {boolean|*} + */ + css(style, getRaw) { + getRaw = getRaw || false; + + // Set style + if (typeof style === 'object') { + const stringToCamelCase = (str) => + str.replace(/([-_][a-z])/g, (group) => + group + .toUpperCase() + .replace('-', '') + .replace('_', ''), + ); + + // Apply multiple styles + for (const styleName in style) { + if (Object.hasOwn(style, styleName)) { + const DomStyleName = stringToCamelCase(styleName); + + // Apply to multiple elements (currently selected) + for (let i=0; i= 0; i-- ) { + if ( ! this.isElem(this.elements[i], filter) ) { + this.elements.splice(Number(i), 1); + } + } + + return this; + } + + /** + * NODES + */ + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parent(filter) { + this.select(this.elements[0].parentElement); + + if ( typeof filter !== 'undefined' && ! this.is(filter) ) { + this.deselect(); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parents(filter) { + this.select(this.elements[0]); + + for ( ; this.elements[this.elements.length - 1].parentElement !== null; ) { + this.push(this.elements[this.elements.length - 1].parentElement); + } + + this.elements.splice(0, 1); // Deleting initial element from the set + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + children(filter) { + this.select(this.elements[0].children); + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + siblings(filter) { + let current = this.elements[0]; // Remember current to delete it later + + this.parent(); + this.children(filter); + this.elements.splice(this.elements.indexOf(current), 1); // Remove current element + + return this; + } + + /** ************ DOM MANIPULATIONS **************/ + remove() { + for (let elem of this.elements) { + elem.remove(); + } + } + + /** + * @param {string} content + */ + after(content) { + for (let elem of this.elements) { + elem.after(content); + } + } + + /** + * @param {string} content + */ + append(content) { + for (let elem of this.elements) { + elem.append(content); + } + } + + /** ************ ANIMATION **************/ + /** + * @param {number} time + */ + fadeIn(time) { + for (let elem of this.elements) { + elem.style.opacity = 0; + elem.style.display = 'block'; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity + (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity < 1) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } + }; + + tick(); + } + } + + /** + * @param {number} time + */ + fadeOut(time) { + for (let elem of this.elements) { + elem.style.opacity = 1; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity > 0) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } else { + elem.style.display = 'none'; + } + }; + + tick(); + } + } +} + +/** + * Hack + * + * Make a proxy to keep both properties and methods from: + * - the native object and + * - the new one from ApbctCore for selected element. + * + * For example: + * apbct('#id).innerHTML = 'some'; + * apbct('#id).css({'backgorund-color': 'black'}); + */ +// apbct = new Proxy( +// apbct, +// { +// get(target, prop) { +// if (target.elements.length) { +// return target.elements[0][prop]; +// } else { +// return null; +// } +// }, +// set(target, prop, value){ +// if (target.elements.length) { +// target.elements[0][prop] = value; +// return true; +// } else { +// return false; +// } +// }, +// apply(target, thisArg, argArray) { +// +// } +// } +// ); + +/** + * @param {mixed} msg + * @param {string} url + */ +function ctProcessError(msg, url) { + let log = {}; + if (msg && msg.message) { + log.err = { + 'msg': msg.message, + 'file': !!msg.fileName ? msg.fileName : false, + 'ln': !!msg.lineNumber ? msg.lineNumber : !!lineNo ? lineNo : false, + 'col': !!msg.columnNumber ? msg.columnNumber : !!columnNo ? columnNo : false, + 'stacktrace': !!msg.stack ? msg.stack : false, + 'cause': !!url ? JSON.stringify(url) : false, + 'errorObj': !!error ? error : false, + }; + } else { + log.err = { + 'msg': msg, + }; + + if (!!url) { + log.err.file = url; + } + } + + log.url = window.location.href; + log.userAgent = window.navigator.userAgent; + + let ctJsErrors = 'ct_js_errors'; + let errArray = localStorage.getItem(ctJsErrors); + if (errArray === null) errArray = '[]'; + errArray = JSON.parse(errArray); + for (let i = 0; i < errArray.length; i++) { + if (errArray[i].err.msg === log.err.msg) { + return; + } + } + + errArray.push(log); + localStorage.setItem(ctJsErrors, JSON.stringify(errArray)); +} + +if (Math.floor(Math.random() * 100) === 1) { + window.onerror = function(exception, url) { + let filterWords = ['apbct', 'ctPublic']; + let length = filterWords.length; + while (length--) { + if (exception.indexOf(filterWords[length]) !== -1) { + ctProcessError(exception, url); + } + } + + return false; + }; +} + +/** + * Select actual WP nonce depending on the ajax type and the fresh nonce provided. + * @return {string} url + */ +function selectActualNonce() { + let defaultNonce = ''; + // return fresh nonce immediately if persists + if ( + ctPublicFunctions.hasOwnProperty('_fresh_nonce') && + typeof ctPublicFunctions._fresh_nonce === 'string' && + ctPublicFunctions._fresh_nonce.length > 0 + ) { + return ctPublicFunctions._fresh_nonce; + } + // select from default rest/ajax nonces + if ( + ctPublicFunctions.data__ajax_type === 'admin_ajax' && + ctPublicFunctions.hasOwnProperty('_ajax_nonce') && + typeof ctPublicFunctions._ajax_nonce === 'string' && + ctPublicFunctions._ajax_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._ajax_nonce; + } + if ( + ctPublicFunctions.data__ajax_type === 'rest' && + ctPublicFunctions.hasOwnProperty('_rest_nonce') && + typeof ctPublicFunctions._rest_nonce === 'string' && + ctPublicFunctions._rest_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._rest_nonce; + } + + return defaultNonce; +} + +/** + * Enter point to ApbctCore class + * + * @param {array|object} params + * @return {*} + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +function apbct(params) { + return new ApbctCore() + .select(params); +} + +/** + * ApbctXhr + */ +class ApbctXhr { + xhr = new XMLHttpRequest(); + + // Base parameters + method = 'POST'; // HTTP-request type + url = ''; // URL to send the request + async = true; + user = null; // HTTP-authorization username + password = null; // HTTP-authorization password + data = {}; // Data to send + + // Optional params + button = null; // Button that should be disabled when request is performing + spinner = null; // Spinner that should appear when request is in process + progressbar = null; // Progress bar for the current request + context = this; // Context + callback = null; + onErrorCallback = null; + + responseType = 'json'; // Expected data type from server + headers = {}; + timeout = 15000; // Request timeout in milliseconds + + methods_to_convert_data_to_URL = [ + 'GET', + 'HEAD', + ]; + + body = null; + http_code = 0; + status_text = ''; + + // eslint-disable-next-line require-jsdoc + constructor(parameters) { + // Set class properties + for ( let key in parameters ) { + if ( typeof this[key] !== 'undefined' ) { + this[key] = parameters[key]; + } + } + + // Modifying DOM-elements + this.prepare(); + + // Modify URL with data for GET and HEAD requests + if ( Object.keys(this.data).length ) { + this.deleteDoubleJSONEncoding(this.data); + this.convertData(); + } + + if ( ! this.url ) { + console.log('%cXHR%c not URL provided', + 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;'); + return false; + } + + // Configure the request + this.xhr.open(this.method, this.url, this.async, this.user, this.password); + this.setHeaders(); + + this.xhr.responseType = this.responseType; + this.xhr.timeout = this.timeout; + + /* EVENTS */ + // Monitoring status + this.xhr.onreadystatechange = function() { + if (this.isWpNonceError()) { + this.getFreshNonceAndRerunXHR(parameters); + return; + } + this.onReadyStateChange(); + }.bind(this); + + // Run callback + this.xhr.onload = function() { + this.onLoad(); + }.bind(this); + + // On progress + this.xhr.onprogress = function(event) { + this.onProgress(event); + }.bind(this); + + // On error + this.xhr.onerror = function() { + this.onError(); + }.bind(this); + + this.xhr.ontimeout = function() { + this.onTimeout(); + }.bind(this); + + // Send the request + this.xhr.send(this.body); + } + + /** + * prepare + */ + prepare() { + // Disable button + if (this.button) { + this.button.setAttribute('disabled', 'disabled'); + this.button.style.cursor = 'not-allowed'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'inline'; + } + } + + /** + * complete + */ + complete() { + this.http_code = this.xhr.status; + this.status_text = this.xhr.statusText; + + // Disable button + if (this.button) { + this.button.removeAttribute('disabled'); + this.button.style.cursor = 'auto'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'none'; + } + + if ( this.progressbar ) { + this.progressbar.fadeOut('slow'); + } + } + + /** + * onReadyStateChange + */ + onReadyStateChange() { + if (this.on_ready_state_change !== null && typeof this.on_ready_state_change === 'function') { + this.on_ready_state_change(); + } + } + + /** + * @param {object} event + */ + onProgress(event) { + if (this.on_progress !== null && typeof this.on_progress === 'function') { + this.on_progress(); + } + } + + /** + * onError + */ + onError() { + console.log('error'); + + this.complete(); + this.error( + this.http_code, + this.status_text, + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * onTimeout + */ + onTimeout() { + this.complete(); + this.error( + 0, + 'timeout', + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback('Timeout'); + } + } + + /** + * @return {boolean} + */ + onLoad() { + this.complete(); + + if (this.responseType === 'json' ) { + if (this.xhr.response === null) { + this.error(this.http_code, this.status_text, 'No response'); + return false; + } else if ( typeof this.xhr.response.error !== 'undefined') { + this.error(this.http_code, this.status_text, this.xhr.response.error); + return false; + } + } + + if (this.callback !== null && typeof this.callback === 'function') { + this.callback.call(this.context, this.xhr.response, this.data); + } + } + + /** + * Check if 403 code of WP nonce error + * @return {bool} + */ + isWpNonceError() { + let restErrror = false; + let ajaxErrror = false; + // check rest error + if (this.xhr.readyState == 4) { + restErrror = ( + typeof this.xhr.response === 'object' && this.xhr.response !== null && + this.xhr.response.hasOwnProperty('data') && + this.xhr.response.data.hasOwnProperty('status') && + this.xhr.response.data.status === 403 + ); + ajaxErrror = this.xhr.response === '-1' && this.xhr.status === 403; + } + // todo check AJAX error + return restErrror || ajaxErrror; + } + + /** + * Get the fresh nonce and rerun the initial XHR with params + * @param {[]} initialRequestParams + */ + getFreshNonceAndRerunXHR(initialRequestParams) { + let noncePrev = ''; + + // Check if initialRequestParams['headers']['X-WP-Nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('headers') && + initialRequestParams.headers.hasOwnProperty('X-WP-Nonce') + ) { + noncePrev = initialRequestParams['headers']['X-WP-Nonce']; + } + + // Check if initialRequestParams['data']['_ajax_nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('data') && + initialRequestParams.data.hasOwnProperty('_ajax_nonce') + ) { + noncePrev = initialRequestParams['data']['_ajax_nonce']; + } + + // Nonce is not provided. Exit. + if ( noncePrev === '' ) { + return; + } + + // prepare params for refreshing nonce + let params = {}; + params.method = 'POST'; + params.data = { + 'spbc_remote_call_action': 'get_fresh_wpnonce', + 'plugin_name': 'antispam', + 'nonce_prev': noncePrev, + 'initial_request_params': initialRequestParams, + }; + params.notJson = true; + params.url = ctPublicFunctions.host_url; + // this callback will rerun the XHR with initial params + params.callback = function(...args) { + // the refresh result itself + let freshNonceResult = args[0]; + let newRequestParams = false; + // provided initial params + if (args[1] !== undefined && args[1].hasOwnProperty('initial_request_params')) { + newRequestParams = args[1].initial_request_params; + } + if (newRequestParams && freshNonceResult.hasOwnProperty('wpnonce')) { + ctPublicFunctions._fresh_nonce = freshNonceResult.wpnonce; + if (ctPublicFunctions.data__ajax_type === 'rest') { + new ApbctCore().rest(newRequestParams); + } else { + new ApbctCore().ajax(newRequestParams); + } + } + }; + // run the nonce refreshing call + new ApbctXhr(params); + } + + /** + * @param {number} httpCode + * @param {string} statusText + * @param {string} additionalMsg + */ + error(httpCode, statusText, additionalMsg) { + let errorString = ''; + + if ( statusText === 'timeout' ) { + errorString += 'Server response timeout'; + } else if ( httpCode === 200 ) { + if ( statusText === 'parsererror' ) { + errorString += 'Unexpected response from server. See console for details.'; + } else { + errorString += 'Unexpected error. Status: ' + statusText + '.'; + if ( typeof additionalMsg !== 'undefined' ) { + errorString += ' Additional error info: ' + additionalMsg; + } + } + } else if (httpCode === 500) { + errorString += 'Internal server error.'; + } else { + errorString += 'Unexpected response code:' + httpCode; + } + + this.errorOutput( errorString ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * @param {string} errorMsg + */ + errorOutput(errorMsg) { + console.log( '%c ctXHR error: %c' + errorMsg, 'color: red;', 'color: grey;' ); + } + + /** + * setHeaders + */ + setHeaders() { + // Set headers if passed + for ( let headerName in this.headers ) { + if ( typeof this.headers[headerName] !== 'undefined' ) { + this.xhr.setRequestHeader(headerName, this.headers[headerName]); + } + } + } + + /** + * @return {string|*} + */ + convertData() { + // GET, HEAD request-type + if ( ~this.methods_to_convert_data_to_URL.indexOf( this.method ) ) { + return this.convertDataToURL(); + + // POST request-type + } else { + return this.convertDataToBody(); + } + } + + /** + * @return {string} + */ + convertDataToURL() { + let paramsAppendix = new URLSearchParams(this.data).toString(); + let paramsPrefix = this.url.match(/^(https?:\/{2})?[a-z0-9.]+\?/) ? '&' : '?'; + this.url += paramsPrefix + paramsAppendix; + + return this.url; + } + + /** + * @return {null} + */ + convertDataToBody() { + this.body = new FormData(); + for (let dataKey in this.data) { + if (Object.hasOwn(this.data, dataKey)) { + this.body.append( + dataKey, + typeof this.data[dataKey] === 'object' ? + JSON.stringify(this.data[dataKey]) : + this.data[dataKey], + ); + } + } + + return this.body; + } + + /** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {object} object + * @return {*} + */ + deleteDoubleJSONEncoding(object) { + if ( typeof object === 'object') { + for (let objectKey in object) { + if (Object.hasOwn(object, objectKey)) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = this.deleteDoubleJSONEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + let parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + } + + return object; + } +} +// eslint-disable-next-line require-jsdoc +class ApbctAjax extends ApbctXhr { + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + args.data._ajax_nonce = selectActualNonce(); + super(args); + } +} +// eslint-disable-next-line require-jsdoc +class ApbctRest extends ApbctXhr { + static default_route = ctPublicFunctions._rest_url + 'cleantalk-antispam/v1/'; + route = ''; + + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + const nonce = selectActualNonce(); + args.url = ApbctRest.default_route + args.route; + args.headers = { + 'X-WP-Nonce': nonce, + }; + super(args); + } +} + +// add hasOwn +if (!Object.prototype.hasOwn) { + Object.defineProperty(Object.prototype, 'hasOwn', { // eslint-disable-line + value: function(property) { + return Object.prototype.hasOwnProperty.call(this, property); + }, + enumerable: false, + configurable: true, + writable: true, + }); +} + +/** + * Class collecting user activity data + * + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +class ApbctCollectingUserActivity { + elementBody = document.querySelector('body'); + collectionForms = document.forms; + /** + * Constructor + */ + constructor() { + this.setListeners(); + } + + /** + * Set listeners + */ + setListeners() { + this.elementBody.addEventListener('click', (event) => { + this.checkElementInForms(event, 'addClicks'); + }); + + this.elementBody.addEventListener('mouseup', (event) => { + const selectedType = document.getSelection().type.toString(); + if (selectedType == 'Range') { + this.addSelected(); + } + }); + + this.elementBody.addEventListener('mousemove', (event) => { + this.checkElementInForms(event, 'trackMouseMovement'); + }); + } + + /** + * Checking if there is an element in the form + * @param {object} event + * @param {string} addTarget + */ + checkElementInForms(event, addTarget) { + let resultCheck; + for (let i = 0; i < this.collectionForms.length; i++) { + if ( + event.target.outerHTML.length > 0 && + this.collectionForms[i].innerHTML.length > 0 + ) { + resultCheck = this.collectionForms[i].innerHTML.indexOf(event.target.outerHTML); + } else { + resultCheck = -1; + } + } + + switch (addTarget) { + case 'addClicks': + if (resultCheck < 0) { + this.addClicks(); + } + break; + case 'trackMouseMovement': + if (resultCheck > -1) { + this.trackMouseMovement(); + } + break; + default: + break; + } + } + + /** + * Add clicks + */ + addClicks() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.clicks) { + document.ctCollectingUserActivityData.clicks++; + } else { + document.ctCollectingUserActivityData.clicks = 1; + } + return; + } + + document.ctCollectingUserActivityData = {clicks: 1}; + } + + /** + * Add selected + */ + addSelected() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.selected) { + document.ctCollectingUserActivityData.selected++; + } else { + document.ctCollectingUserActivityData.selected = 1; + } + return; + } + + document.ctCollectingUserActivityData = {selected: 1}; + } + + /** + * Track mouse movement + */ + trackMouseMovement() { + if (!document.ctCollectingUserActivityData) { + document.ctCollectingUserActivityData = {}; + } + if (!document.ctCollectingUserActivityData.mouseMovementsInsideForm) { + document.ctCollectingUserActivityData.mouseMovementsInsideForm = false; + } + + document.ctCollectingUserActivityData.mouseMovementsInsideForm = true; + } +} + +/** + * @param {object|array|string} cookies + * @param {object|array|string} value + * @param {string|number} expires + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetCookie( cookies, value, expires ) { + let listOfCookieNamesToForceAlt = [ + 'ct_sfw_pass_key', + 'ct_sfw_passed', + 'wordpress_apbct_antibot', + 'apbct_anticrawler_passed', + 'apbct_bot_detector_exist', + 'apbct_antiflood_passed', + 'apbct_email_encoder_passed', + ]; + + let skipAlt = false; + + if ( typeof cookies === 'string') { + skipAlt = cookies === 'ct_pointer_data'; + if ( typeof value === 'string' || typeof value === 'number' ) { + cookies = [[cookies, value, expires]]; + } + } + + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + let forcedAltCookiesSet = []; + cookies.forEach( function(item) { + if (listOfCookieNamesToForceAlt.indexOf(item[0]) !== -1) { + forcedAltCookiesSet.push(item); + } else { + apbctLocalStorage.set(item[0], item[1]); + } + }); + + // if cookies from list found use alt cookies for this selection set + if ( forcedAltCookiesSet.length > 0 ) { + ctSetAlternativeCookie(forcedAltCookiesSet); + } + + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } else { + ctNoCookieAttachHiddenFieldsToForms(); + } + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } + cookies.forEach( function(item) { + const _expires = typeof item[2] !== 'undefined' ? 'expires=' + expires + '; ' : ''; + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = ctPublicFunctions.cookiePrefix + + item[0] + + '=' + + encodeURIComponent(item[1]) + + '; ' + + _expires + + 'path=/; samesite=lax' + + ctSecure; + }); + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' && !skipAlt ) { + ctSetAlternativeCookie(cookies); + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctDetectForcedAltCookiesForms() { + let ninjaFormsSign = document.querySelectorAll('#tmpl-nf-layout').length > 0; + let elementorUltimateAddonsRegister = document.querySelectorAll('.uael-registration-form-wrapper').length > 0; + let smartFormsSign = document.querySelectorAll('script[id*="smart-forms"]').length > 0; + let jetpackCommentsForm = document.querySelectorAll('iframe[name="jetpack_remote_comment"]').length > 0; + let cwginstockForm = document.querySelectorAll('.cwginstock-subscribe-form').length > 0; + let userRegistrationProForm = document.querySelectorAll('div[id^="user-registration-form"]').length > 0; + let etPbDiviSubscriptionForm = document.querySelectorAll('div[class^="et_pb_newsletter_form"]').length > 0; + let fluentBookingApp = document.querySelectorAll('div[class^="fluent_booking_app"]').length > 0; + let bloomPopup = document.querySelectorAll('div[class^="et_bloom_form_container"]').length > 0; + let pafeFormsFormElementor = document.querySelectorAll('div[class*="pafe-form"]').length > 0; + let otterForm = document.querySelectorAll('div [class*="otter-form"]').length > 0; + let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').length > 0; + ctPublic.force_alt_cookies = smartFormsSign || + ninjaFormsSign || + jetpackCommentsForm || + elementorUltimateAddonsRegister || + cwginstockForm || + userRegistrationProForm || + etPbDiviSubscriptionForm || + fluentBookingApp || + pafeFormsFormElementor || + bloomPopup || + otterForm || + smartQuizBuilder; + + setTimeout(function() { + if (!ctPublic.force_alt_cookies) { + let bookingPress = document.querySelectorAll('main[id^="bookingpress_booking_form"]').length > 0; + ctPublic.force_alt_cookies = bookingPress; + } + }, 1000); +} + +// eslint-disable-next-line require-jsdoc +function ctSetAlternativeCookie(cookies, params) { + if (typeof (getJavascriptClientData) === 'function' ) { + // reprocess already gained cookies data + if (Array.isArray(cookies)) { + cookies = getJavascriptClientData(cookies); + } + } else { + console.log('APBCT ERROR: getJavascriptClientData() is not loaded'); + } + + try { + cookies = JSON.parse(cookies); + } catch (e) { + console.log('APBCT ERROR: JSON parse error:' + e); + return; + } + + const callback = params && params.callback || null; + const onErrorCallback = params && params.onErrorCallback || null; + + if ( params && params.forceAltCookies ) { + cookies.apbct_force_alt_cookies = true; + } + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + // fix for url encoded cookie apbct_pixel_url on REST route + if (typeof cookies.apbct_pixel_url === 'string' && + cookies.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); + } + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_alt_session__save__AJAX', + cookies: cookies, + }, + { + notJson: 1, + callback: callback, + onErrorCallback: onErrorCallback, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * Get cookie by name + * @param name + * @return {string|undefined} + */ +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctGetCookie(name) { + let matches = document.cookie.match(new RegExp( + '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)', + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctDeleteCookie(cookieName) { + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + return; + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = cookieName + '=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax' + ctSecure; + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' ) { + // @ToDo implement this logic + } +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendAJAX(data, params, obj) { + // Default params + let _params = []; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['callback_context'] = params.callback_context || null; + _params['callback_params'] = params.callback_params || null; + _params['async'] = params.async || true; + _params['notJson'] = params.notJson || null; + _params['responseType']= params.notJson ? 'text' : 'json'; + _params['timeout'] = params.timeout || 15000; + _params['obj'] = obj || null; + _params['button'] = params.button || null; + _params['spinner'] = params.spinner || null; + _params['progressbar'] = params.progressbar || null; + _params['silent'] = params.silent || null; + _params['no_nonce'] = params.no_nonce || null; + _params['data'] = data; + _params['url'] = ctPublicFunctions._ajax_url; + const nonce = selectActualNonce(); + + if (typeof (data) === 'string') { + if ( ! _params['no_nonce'] ) { + _params['data'] = _params['data'] + '&_ajax_nonce=' + nonce; + } + _params['data'] = _params['data'] + '&no_cache=' + Math.random(); + } else { + if ( ! _params['no_nonce'] ) { + _params['data']._ajax_nonce = nonce; + } + _params['data'].no_cache = Math.random(); + } + + new ApbctCore().ajax(_params); +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendREST( route, params ) { + let _params = []; + _params['route'] = route; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['data'] = params.data || []; + _params['method'] = params.method || 'POST'; + + new ApbctCore().rest(_params); +} + +/** + * Generate unique ID + * @return {string} + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function apbctGenerateUniqueID() { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10); +} + +let apbctLocalStorage = { + get: function(key, property) { + if ( typeof property === 'undefined' ) { + property = 'value'; + } + const storageValue = localStorage.getItem(key); + if ( storageValue !== null ) { + try { + const json = JSON.parse(storageValue); + if ( json.hasOwnProperty(property) ) { + try { + // if property can be parsed as JSON - do it + return JSON.parse( json[property] ); + } catch (e) { + // if not - return string of value + return json[property].toString(); + } + } else { + return json; + } + } catch (e) { + return storageValue; + } + } + return false; + }, + set: function(key, value, isJson = true) { + if (isJson) { + let objToSave = {'value': JSON.stringify(value), 'timestamp': Math.floor(new Date().getTime() / 1000)}; + localStorage.setItem(key, JSON.stringify(objToSave)); + } else { + localStorage.setItem(key, value); + } + }, + isAlive: function(key, maxLifetime) { + if ( typeof maxLifetime === 'undefined' ) { + maxLifetime = 86400; + } + const keyTimestamp = this.get(key, 'timestamp'); + return keyTimestamp + maxLifetime > Math.floor(new Date().getTime() / 1000); + }, + isSet: function(key) { + return localStorage.getItem(key) !== null; + }, + delete: function(key) { + localStorage.removeItem(key); + }, + getCleanTalkData: function() { + let data = {}; + for (let i=0; i this.checkBotCallback(result), + }); + } else if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + data.action = 'apbct_force_protection_check_bot'; + apbct_public_sendAJAX(data, {callback: (result) => this.checkBotCallback(result)}); + } + } + + /** + * Check bot callback + * @param {Object} result + * @return {void} + */ + checkBotCallback(result) { + // if error occurred + if (result.data && result.data.status && result.data.status !== 200) { + console.log('ApbctForceProtection connection error occurred'); + this.decodeForms(); + return; + } + + if (typeof result === 'string') { + try { + result = JSON.parse(result); + } catch (e) { + console.log('ApbctForceProtection decodeForms error', e); + this.decodeForms(); + return; + } + } + + if (typeof result === 'object' && result.allow && result.allow === 1) { + this.decodeForms(); + document.dispatchEvent(new Event('apbctForceProtectionAllowed')); + } else { + this.showMessageForBot(result.message); + } + } + + /** + * Decode forms + * @return {void} + */ + decodeForms() { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + + try { + if (form && typeof(form) == 'string') { + wrapper.outerHTML = atob(form); + } + } catch (error) { + console.log(error); + } + }); + } + + /** + * Show message for bot + * @param {string} message + * @return {void} + */ + showMessageForBot(message) { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + if (form) { + wrapper.outerHTML = '
' + message + '
'; + } + }); + } +} + +/** + * Force protection + */ +function apbctForceProtect() { + if (ctPublic.settings__forms__force_protection && typeof ApbctForceProtection !== 'undefined') { + new ApbctForceProtection(); + } +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbctForceProtect(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbctForceProtect); + } +} + +/** + * Class for gathering data about user typing. + * + * ============================== + * isAutoFill - only person can use auto fill + * isUseBuffer - use buffer for fill current field + * ============================== + * lastKeyTimestamp - timestamp of last key press in current field + * speedDelta - change for each key press in current field, + * as difference between current and previous key press timestamps, + * robots in general have constant speed of typing. + * If speedDelta is constant for each key press in current field, + * so, speedDelta will be roughly to 0, then it is robot. + * ============================== + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +class CTTypoData { + fieldData = { + isAutoFill: false, + isUseBuffer: false, + speedDelta: 0, + firstKeyTimestamp: 0, + lastKeyTimestamp: 0, + lastDelta: 0, + countOfKey: 0, + }; + + fields = document.querySelectorAll('textarea[name=comment]'); + + data = []; + + /** + * Gather fields. + */ + gatheringFields() { + let fieldSet = Array.prototype.slice.call(this.fields); + fieldSet.forEach((field, i) => { + this.data.push(Object.assign({}, this.fieldData)); + }); + } + + /** + * Set listeners. + */ + setListeners() { + this.fields.forEach((field, i) => { + field.addEventListener('paste', () => { + this.data[i].isUseBuffer = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('onautocomplete', () => { + this.data[i].isAutoFill = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('input', () => { + this.data[i].countOfKey++; + let time = + new Date(); + let currentDelta = 0; + + if (this.data[i].countOfKey === 1) { + this.data[i].lastKeyTimestamp = time; + this.data[i].firstKeyTimestamp = time; + return; + } + + currentDelta = time - this.data[i].lastKeyTimestamp; + if (this.data[i].countOfKey === 2) { + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + return; + } + + if (this.data[i].countOfKey > 2) { + this.data[i].speedDelta += Math.abs(this.data[i].lastDelta - currentDelta); + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + } + }); + }); + } +} + +// eslint-disable-next-line camelcase +const ctDate = new Date(); +const ctTimeMs = new Date().getTime(); +let ctMouseEventTimerFlag = true; // Reading interval flag +let ctMouseData = []; +let ctMouseDataCounter = 0; +let ctCheckedEmails = {}; +let ctCheckedEmailsExist = {}; +let ctMouseReadInterval; +let ctMouseWriteDataInterval; +let tokenCheckerIntervalId; +let botDetectorLogLastUpdate = 0; +let botDetectorLogEventTypesCollected = []; + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_attach_event_handler(elem, event, callback) { + if (typeof window.addEventListener === 'function') elem.addEventListener(event, callback); + else elem.attachEvent(event, callback); +} +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_remove_event_handler(elem, event, callback) { + if (typeof window.removeEventListener === 'function') elem.removeEventListener(event, callback); + else elem.detachEvent(event, callback); +} + +// Writing first key press timestamp +const ctFunctionFirstKey = function output(event) { + let KeyTimestamp = Math.floor(new Date().getTime() / 1000); + ctSetCookie('ct_fkp_timestamp', KeyTimestamp); + ctKeyStopStopListening(); +}; + +/** + * Run cron jobs + */ +// forms handler cron +cronFormsHandler(2000); + +// bot_detector frontend_data log alt session saving cron +if ( + ctPublicFunctions.hasOwnProperty('data__bot_detector_enabled') && + ctPublicFunctions.data__bot_detector_enabled == 1 && + ctPublicFunctions.hasOwnProperty('data__frontend_data_log_enabled') && + ctPublicFunctions.data__frontend_data_log_enabled == 1 +) { + sendBotDetectorLogToAltSessions(1000); +} +/** + * Cron jobs end. + */ + +// mouse read +if (ctPublic.data__key_is_ok) { + // Reading interval + ctMouseReadInterval = setInterval(function() { + ctMouseEventTimerFlag = true; + }, 150); + + // Writting interval + ctMouseWriteDataInterval = setInterval(function() { + ctSetCookie('ct_pointer_data', JSON.stringify(ctMouseData)); + }, 1200); +} + +// Logging mouse position each 150 ms +const ctFunctionMouseMove = function output(event) { + ctSetMouseMoved(); + if (ctMouseEventTimerFlag === true) { + ctMouseData.push([ + Math.round(event.clientY), + Math.round(event.clientX), + Math.round(new Date().getTime() - ctTimeMs), + ]); + + ctMouseDataCounter++; + ctMouseEventTimerFlag = false; + if (ctMouseDataCounter >= 50) { + ctMouseStopData(); + } + } +}; + +/** + * Do handle periodical actions. + * @param {int} cronStartTimeout Time to go before cron start. + */ +function cronFormsHandler(cronStartTimeout = 2000) { + setTimeout(function() { + setInterval(function() { + restartFieldsListening(); + restartBotDetectorEventTokenAttach(); + }, 2000); + }, cronStartTimeout); +} + +/** + * Send BotDetector logs data to alternative sessions. + * If log_last_update has changed and log contains new event types, the log will be sent to the alternative sessions. + * @param {int} cronStartTimeout delay before cron start + * @param {int} interval check fires on interval + */ +function sendBotDetectorLogToAltSessions(cronStartTimeout = 3000, interval = 1000) { + setTimeout(function() { + setInterval(function() { + const currentLog = apbctLocalStorage.get('ct_bot_detector_frontend_data_log'); + if (needsSaveLogToAltSessions(currentLog)) { + botDetectorLogLastUpdate = currentLog.log_last_update; + // the log will be taken from javascriptclientdata + ctSetAlternativeCookie([], {forceAltCookies: true}); + } + }, interval); + }, cronStartTimeout); +} + +/** + * Check if the log needs to be saved to the alt sessions. If the log has new event types, it will be saved. + * @param {object} currentLog + * @return {boolean} + */ +function needsSaveLogToAltSessions(currentLog) { + if ( + currentLog && currentLog.hasOwnProperty('log_last_update') && + botDetectorLogLastUpdate !== currentLog.log_last_update + ) { + try { + for (let i = 0; i < currentLog.records.length; i++) { + const currentType = currentLog.records[i].frontend_data.js_event; + // check if this event type was already collected + if (currentType !== undefined && botDetectorLogEventTypesCollected.includes(currentType)) { + continue; + } + // add new event type to collection, this type will be sent to the alt sessions further + botDetectorLogEventTypesCollected.push(currentType); + return true; + } + } catch (e) { + console.log('APBCT: bot detector log collection error: ' . e.toString()); + } + } + return false; +} + +/** + * Restart event_token attachment if some forms load after document ready. + */ +function restartBotDetectorEventTokenAttach() { + // List there any new conditions, right now it works only for LatePoint forms. + // Probably, we can remove this condition at all, because setEventTokenField() + // checks all the forms without the field + const doAttach = ( + document.getElementsByClassName('latepoint-form').length > 0 || + document.getElementsByClassName('mec-booking-form-container').length > 0 || + document.getElementById('login-form-popup') !== null + ); + + try { + if ( doAttach ) { + // get token from LS + const token = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof setEventTokenField === 'function' && token !== undefined && token.length === 64) { + setEventTokenField(token); + } + // probably there we could use a new botDetectorInit if token is not found + } + } catch (e) { + console.log(e.toString()); + } +} + +/** + * Stop mouse observing function + */ +function ctMouseStopData() { + apbct_remove_event_handler(document, 'mousemove', ctFunctionMouseMove); + clearInterval(ctMouseReadInterval); + clearInterval(ctMouseWriteDataInterval); +} + +/** + * Stop key listening function + */ +function ctKeyStopStopListening() { + apbct_remove_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_remove_event_handler(document, 'keydown', ctFunctionFirstKey); +} + +/** + * @param {mixed} e + */ +function checkEmail(e) { + let currentEmail = e.target.value; + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail && !(currentEmail in ctCheckedEmails)) { + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'check_email_before_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_before_post', + email: currentEmail, + }, + { + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + } + } +} + +/** + * @param {mixed} e + */ +function checkEmailExist(e) { + let currentEmail = e.target.value; + let result; + + if (!currentEmail || !currentEmail.length) { + let envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.remove(); + } + let hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.remove(); + } + return; + } + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail in ctCheckedEmailsExist) { + result = ctCheckedEmailsExist[currentEmail]; + getResultCheckEmailExist(e, result, currentEmail); + + return; + } + + viewCheckEmailExist(e, 'load'); + + // Using REST API handler + ctPublicFunctions.data__ajax_type = 'rest'; + if (ctPublicFunctions.data__ajax_type === 'rest') { + apbct_public_sendREST( + 'check_email_exist_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + + return; + } + + if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_exist_post', + email: currentEmail, + }, + { + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + } +} + +/** + * @param {mixed} e + * @param {mixed} result + * @param {string} currentEmail + */ +function getResultCheckEmailExist(e, result, currentEmail) { + if (!result || !result.result) { + return; + } + + result = result.result; + + ctCheckedEmailsExist[currentEmail] = { + 'result': result, + 'timestamp': Date.now() / 1000 |0, + }; + + if (result.result == 'EXISTS') { + viewCheckEmailExist(e, 'good_email', result.text_result); + } else { + viewCheckEmailExist(e, 'bad_email', result.text_result); + } + + ctSetCookie('ct_checked_emails_exist', JSON.stringify(ctCheckedEmailsExist)); +} + +/** + * @param {mixed} e + * @param {string} state + * @param {string} textResult + */ +function viewCheckEmailExist(e, state, textResult) { + let parentElement = e.target.parentElement; + let inputEmail = parentElement.querySelector('[name*="email"]'); + + if (!inputEmail) { + return; + } + + let envelope; + let hint; + + // envelope + if (document.getElementById('apbct-check_email_exist-block')) { + envelope = document.getElementById('apbct-check_email_exist-block'); + } else { + envelope = document.createElement('div'); + envelope.setAttribute('class', 'apbct-check_email_exist-block'); + envelope.setAttribute('id', 'apbct-check_email_exist-block'); + window.addEventListener('scroll', function() { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + }); + parentElement.after(envelope); + } + + // hint + if (document.getElementById('apbct-check_email_exist-popup_description')) { + hint = document.getElementById('apbct-check_email_exist-popup_description'); + } else { + hint = document.createElement('div'); + hint.setAttribute('class', 'apbct-check_email_exist-popup_description'); + hint.setAttribute('id', 'apbct-check_email_exist-popup_description'); + window.addEventListener('scroll', function() { + hint.style.top = envelope.getBoundingClientRect().top + 'px'; + }); + + envelope.after(hint); + } + + ctEmailExistSetElementsPositions(); + + window.addEventListener('resize', function(event) { + ctEmailExistSetElementsPositions(); + }); + + switch (state) { + case 'load': + envelope.classList.remove('apbct-check_email_exist-good_email', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-load'); + break; + + case 'good_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-good_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#1C7129'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + case 'bad_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-good_email'); + envelope.classList.add('apbct-check_email_exist-bad_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#E01111'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + default: + break; + } +} + +/** + * Shift the envelope to the input field on resizing the window + * @param {object} envelope + * @param {object} inputEmail + */ +function ctEmailExistSetElementsPositions() { + const envelopeWidth = 35; + const inputEmail = document.querySelector('comment-form input[name*="email"], input#email'); + if (!inputEmail) { + return; + } + const envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + envelope.style.left = inputEmail.getBoundingClientRect().right - envelopeWidth - 10 + 'px'; + envelope.style.height = inputEmail.offsetHeight + 'px'; + envelope.style.width = envelopeWidth + 'px'; + } + + const hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.style.width = inputEmail.offsetWidth + 'px'; + hint.style.left = inputEmail.getBoundingClientRect().left + 'px'; + } +} + +/** + * @return {bool} + */ +function ctIsDrawPixel() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + return +ctPublic.pixel__enabled || + (ctPublic.data__cookies_type === 'none' && document.querySelectorAll('img#apbct_pixel').length === 0) || + (ctPublic.data__cookies_type === 'alternative' && document.querySelectorAll('img#apbct_pixel').length === 0); +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImg(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + ctSetCookie('apbct_pixel_url', pixelUrl); + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', pixelUrl); + apbct('body').append(insertedImg); + } + } +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImgFromLocalstorage(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', decodeURIComponent(pixelUrl)); + apbct('body').append(insertedImg); + } + } +} + +/** + * ctGetPixelUrl + * @return {bool} + */ +function ctGetPixelUrl() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + // Check if pixel is already in localstorage and is not outdated + let localStoragePixelUrl = apbctLocalStorage.get('apbct_pixel_url'); + if ( localStoragePixelUrl !== false ) { + if ( ! apbctLocalStorage.isAlive('apbct_pixel_url', 3600 * 3) ) { + apbctLocalStorage.delete('apbct_pixel_url'); + } else { + // if so - load pixel from localstorage and draw it skipping AJAX + ctSetPixelImgFromLocalstorage(localStoragePixelUrl); + return; + } + } + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_get_pixel_url', + { + method: 'POST', + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + }, + ); + // Using AJAX request and handler + } else { + apbct_public_sendAJAX( + { + action: 'apbct_get_pixel_url', + }, + { + notJson: true, + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * ctSetHasScrolled + */ +function ctSetHasScrolled() { + if ( ! apbctLocalStorage.isSet('ct_has_scrolled') || ! apbctLocalStorage.get('ct_has_scrolled') ) { + ctSetCookie('ct_has_scrolled', 'true'); + apbctLocalStorage.set('ct_has_scrolled', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_scrolled') === undefined + ) { + ctSetCookie('ct_has_scrolled', 'true'); + } +} + +/** + * ctSetMouseMoved + */ +function ctSetMouseMoved() { + if ( ! apbctLocalStorage.isSet('ct_mouse_moved') || ! apbctLocalStorage.get('ct_mouse_moved') ) { + ctSetCookie('ct_mouse_moved', 'true'); + apbctLocalStorage.set('ct_mouse_moved', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_mouse_moved') === undefined + ) { + ctSetCookie('ct_mouse_moved', 'true'); + } +} + +/** + * Restart listen fields to set ct_has_input_focused or ct_has_key_up + */ +function restartFieldsListening() { + if (!apbctLocalStorage.isSet('ct_has_input_focused') && !apbctLocalStorage.isSet('ct_has_key_up')) { + ctStartFieldsListening(); + } +} + +/** + * init listeners for keyup and focus events + */ +function ctStartFieldsListening() { + if ( + (apbctLocalStorage.isSet('ct_has_key_up') || apbctLocalStorage.get('ct_has_key_up')) && + (apbctLocalStorage.isSet('ct_has_input_focused') || apbctLocalStorage.get('ct_has_input_focused')) && + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') !== undefined && + ctGetCookie('ct_has_key_up') !== undefined + ) + ) { + // already set + return; + } + + let forms = ctGetPageForms(); + ctPublic.handled_fields = []; + + if (forms.length > 0) { + for (let i = 0; i < forms.length; i++) { + // handle only inputs and textareas + const handledFormFields = forms[i].querySelectorAll('input,textarea'); + for (let i = 0; i < handledFormFields.length; i++) { + if (handledFormFields[i].type !== 'hidden') { + // collect handled fields to remove handler in the future + ctPublic.handled_fields.push(handledFormFields[i]); + // do attach handlers + apbct_attach_event_handler(handledFormFields[i], 'focus', ctFunctionHasInputFocused); + apbct_attach_event_handler(handledFormFields[i], 'keyup', ctFunctionHasKeyUp); + } + } + } + } +} + +/** + * stop listening keyup and focus + * @param {string} eventName + * @param {string} functionName + */ +function ctStopFieldsListening(eventName, functionName) { + if (typeof ctPublic.handled_fields !== 'undefined' && ctPublic.handled_fields.length > 0) { + for (let i = 0; i < ctPublic.handled_fields.length; i++) { + apbct_remove_event_handler(ctPublic.handled_fields[i], eventName, functionName); + } + } +} + +let ctFunctionHasInputFocused = function output(event) { + ctSetHasInputFocused(); + ctStopFieldsListening('focus', ctFunctionHasInputFocused); +}; + +let ctFunctionHasKeyUp = function output(event) { + ctSetHasKeyUp(); + ctStopFieldsListening('keyup', ctFunctionHasKeyUp); +}; + +/** + * set ct_has_input_focused ct_has_key_up cookies on session period + */ +function ctSetHasInputFocused() { + if ( ! apbctLocalStorage.isSet('ct_has_input_focused') || ! apbctLocalStorage.get('ct_has_input_focused') ) { + apbctLocalStorage.set('ct_has_input_focused', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_input_focused', 'true'); + } +} + +/** + * ctSetHasKeyUp + */ +function ctSetHasKeyUp() { + if ( ! apbctLocalStorage.isSet('ct_has_key_up') || ! apbctLocalStorage.get('ct_has_key_up') ) { + apbctLocalStorage.set('ct_has_key_up', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_key_up') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_key_up', 'true'); + } +} + +if (ctPublic.data__key_is_ok) { + apbct_attach_event_handler(document, 'mousemove', ctFunctionMouseMove); + apbct_attach_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'keydown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'scroll', ctSetHasScrolled); +} + +/** + * Prepare block to intercept AJAX response + */ +function apbctPrepareBlockForAjaxForms() { + // eslint-disable-next-line require-jsdoc + function ctPrepareBlockMessage(xhr) { + if (xhr.responseText && + xhr.responseText.indexOf('"apbct') !== -1 && + xhr.responseText.indexOf('DOCTYPE') === -1 + ) { + try { + ctParseBlockMessage(JSON.parse(xhr.responseText)); + } catch (e) { + console.log(e.toString()); + } + } + } + + if (typeof jQuery !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + if (typeof jQuery(document).ajaxComplete() !== 'function') { + jQuery(document).on('ajaxComplete', function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } else { + jQuery(document).ajaxComplete( function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } + } else { + // if Jquery is not avaliable try to use xhr + if (typeof XMLHttpRequest !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + document.addEventListener('readystatechange', function(event) { + if (event.target.readyState === 4) { + ctPrepareBlockMessage(event.target); + } + }); + } + } +} + +/** + * For forced alt cookies. + * If token is not added to the LS on apbc_ready, check every second if so and send token to the alt sessions. + */ +function startForcedAltEventTokenChecker() { + tokenCheckerIntervalId = setInterval( function() { + if (apbctLocalStorage.get('event_token_forced_set') === '1') { + clearInterval(tokenCheckerIntervalId); + return; + } + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if (eventToken) { + ctSetAlternativeCookie([['ct_bot_detector_event_token', eventToken]], {forceAltCookies: true}); + apbctLocalStorage.set('event_token_forced_set', '1'); + clearInterval(tokenCheckerIntervalId); + } else { + } + }, 1000); +} + + +/** + * Ready function + */ +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_ready() { + document.addEventListener('gform_page_loaded', function() { + if ( + typeof ctPublic.force_alt_cookies === 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + if (typeof setEventTokenField === 'function' && typeof botDetectorLocalStorage === 'function') { + setEventTokenField(botDetectorLocalStorage.get('bot_detector_event_token')); + } + } + }); + if ( ! ctPublic.wc_ajax_add_to_cart ) { + apbctCheckAddToCartByGet(); + } + + apbctPrepareBlockForAjaxForms(); + + // set session ID + if (!apbctSessionStorage.isSet('apbct_session_id')) { + const sessionID = apbctGenerateUniqueID(); + apbctSessionStorage.set('apbct_session_id', sessionID, false); + apbctLocalStorage.set('apbct_page_hits', 1); + if (document.referrer) { + let urlReferer = new URL(document.referrer); + if (urlReferer.host !== location.host) { + apbctSessionStorage.set('apbct_site_referer', document.referrer, false); + } + } + } else { + apbctLocalStorage.set('apbct_page_hits', Number(apbctLocalStorage.get('apbct_page_hits')) + 1); + } + + apbctWriteReferrersToSessionStorage(); + + const cookiesType = apbctLocalStorage.get('ct_cookies_type'); + if ( ! cookiesType || cookiesType !== ctPublic.data__cookies_type ) { + apbctLocalStorage.set('ct_cookies_type', ctPublic.data__cookies_type); + apbctLocalStorage.delete('ct_mouse_moved'); + apbctLocalStorage.delete('ct_has_scrolled'); + } + + if (ctPublic.data__cookies_type !== 'alternative') { + ctStartFieldsListening(); + // 2nd try to add listeners for delayed appears forms + setTimeout(ctStartFieldsListening, 1000); + } + + window.addEventListener('animationstart', apbctOnAnimationStart, true); + window.addEventListener('input', apbctOnInput, true); + document.ctTypoData = new CTTypoData(); + document.ctTypoData.gatheringFields(); + document.ctTypoData.setListeners(); + + // Collect scrolling info + const initCookies = [ + ['ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)], + ['ct_fkp_timestamp', '0'], + ['ct_pointer_data', '0'], + // eslint-disable-next-line camelcase + ['ct_timezone', ctDate.getTimezoneOffset()/60*(-1)], + ['ct_screen_info', apbctGetScreenInfo()], + ['apbct_headless', navigator.webdriver], + ]; + + apbctLocalStorage.set('ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)); + apbctLocalStorage.set('ct_fkp_timestamp', '0'); + apbctLocalStorage.set('ct_pointer_data', '0'); + // eslint-disable-next-line camelcase + apbctLocalStorage.set('ct_timezone', ctDate.getTimezoneOffset()/60*(-1) ); + apbctLocalStorage.set('ct_screen_info', apbctGetScreenInfo()); + apbctLocalStorage.set('apbct_headless', navigator.webdriver); + + if ( ctPublic.data__cookies_type !== 'native' ) { + initCookies.push(['apbct_visible_fields', '0']); + } else { + // Delete all visible fields cookies on load the page + let cookiesArray = document.cookie.split(';'); + if ( cookiesArray.length !== 0 ) { + for ( let i = 0; i < cookiesArray.length; i++ ) { + let currentCookie = cookiesArray[i].trim(); + let cookieName = currentCookie.split('=')[0]; + if ( cookieName.indexOf('apbct_visible_fields_') === 0 ) { + ctDeleteCookie(cookieName); + } + } + } + } + + if ( + +ctPublic.pixel__setting && + !(+ctPublic.pixel__setting == 3 && ctPublic.settings__data__bot_detector_enabled == 1) + ) { + if ( ctIsDrawPixel() ) { + ctGetPixelUrl(); + } else { + initCookies.push(['apbct_pixel_url', ctPublic.pixel__url]); + } + } + + if ( +ctPublic.data__email_check_before_post) { + initCookies.push(['ct_checked_emails', '0']); + apbct('input[type = \'email\'], #email').on('blur', checkEmail); + } + + if ( +ctPublic.data__email_check_exist_post) { + initCookies.push(['ct_checked_emails_exist', '0']); + apbct('comment-form input[name = \'email\'], input#email').on('blur', checkEmailExist); + } + + if (apbctLocalStorage.isSet('ct_checkjs')) { + initCookies.push(['ct_checkjs', apbctLocalStorage.get('ct_checkjs')]); + } else { + initCookies.push(['ct_checkjs', 0]); + } + + // detect integrated forms that need to be handled via alternative cookies + ctDetectForcedAltCookiesForms(); + + // send bot detector event token to alt cookies on problem forms + let tokenForForceAlt = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof ctPublic.force_alt_cookies !== 'undefined' && + ctPublic.force_alt_cookies && + ctPublic.settings__data__bot_detector_enabled + ) { + apbctLocalStorage.set('event_token_forced_set', '0'); + if (tokenForForceAlt) { + initCookies.push(['ct_bot_detector_event_token', tokenForForceAlt]); + apbctLocalStorage.set('event_token_forced_set', '1'); + } else { + startForcedAltEventTokenChecker(); + } + } + + ctSetCookie(initCookies); + + setTimeout(function() { + if ( + typeof ctPublic.force_alt_cookies == 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + } + + if ( + typeof ctPublic.data__cookies_type !== 'undefined' && + ctPublic.data__cookies_type === 'none' + ) { + ctAjaxSetupAddCleanTalkDataBeforeSendAjax(); + ctAddWCMiddlewares(); + } + + for (let i = 0; i < document.forms.length; i++) { + let form = document.forms[i]; + + // Exclusion for forms + if (ctCheckHiddenFieldsExclusions(document.forms[i], 'visible_fields')) { + continue; + } + if (form.querySelector('input[name="wspsc_add_cart_submit"]') || + form.querySelector('input[name="option"][value="com_vikrentcar"]') || + form.querySelector('input[name="option"][value="com_vikbooking"]') + ) { + continue; + } + + // The Form has hidden field like apbct_visible_fields + if ( + document.forms[i].elements.apbct_visible_fields !== undefined && + document.forms[i].elements.apbct_visible_fields.length > 0 + ) { + continue; + } + + if (form.querySelector('input[name="apbct_visible_fields"]')) { + let visibleFields = form.querySelector('input[name="apbct_visible_fields"]'); + form.removeChild(visibleFields); + } + + let hiddenInput = document.createElement( 'input' ); + hiddenInput.setAttribute( 'type', 'hidden' ); + hiddenInput.setAttribute( 'id', 'apbct_visible_fields_' + i ); + hiddenInput.setAttribute( 'name', 'apbct_visible_fields'); + let visibleFieldsToInput = {}; + visibleFieldsToInput[0] = apbct_collect_visible_fields(form); + hiddenInput.value = btoa(JSON.stringify(visibleFieldsToInput)); + form.append( hiddenInput ); + + form.onsubmit_prev = form.onsubmit; + + form.ctFormIndex = i; + form.onsubmit = function(event) { + if ( ctPublic.data__cookies_type !== 'native' && typeof event.target.ctFormIndex !== 'undefined' ) { + apbct_visible_fields_set_cookie( apbct_collect_visible_fields(this), event.target.ctFormIndex ); + } + + if (ctPublic.data__cookies_type === 'none' && isFormThatNeedCatchXhr(event.target)) { + window.XMLHttpRequest.prototype.send = function(data) { + let noCookieData = getNoCookieData(); + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + defaultSend.call(this, noCookieData + data); + setTimeout(() => { + window.XMLHttpRequest.prototype.send = defaultSend; + }, 0); + }; + } + + // Call previous submit action + if (event.target.onsubmit_prev instanceof Function && !ctOnsubmitPrevCallExclude(event.target)) { + if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) { + event.preventDefault(); + } + setTimeout(function() { + event.target.onsubmit_prev.call(event.target, event); + }, 0); + } + }; + } + }, 1000); + + // Listen clicks on encoded emails + let encodedEmailNodes = document.querySelectorAll('[data-original-string]'); + ctPublic.encodedEmailNodes = encodedEmailNodes; + if (encodedEmailNodes.length) { + for (let i = 0; i < encodedEmailNodes.length; ++i) { + encodedEmailNodes[i].addEventListener('click', ctFillDecodedEmailHandler); + } + } + + // WordPress Search form processing + for (const _form of document.forms) { + if ( + typeof ctPublic !== 'undefined' && + + ctPublic.settings__forms__search_test === 1 && + ( + _form.getAttribute('id') === 'searchform' || + (_form.getAttribute('class') !== null && _form.getAttribute('class').indexOf('search-form') !== -1) || + (_form.getAttribute('role') !== null && _form.getAttribute('role').indexOf('search') !== -1) + ) + ) { + // fibosearch integration + if (_form.querySelector('input.dgwt-wcas-search-input')) { + continue; + } + + if ( + _form.getAttribute('id') === 'hero-search-form' || + _form.getAttribute('class') === 'hb-booking-search-form' + ) { + continue; + } + + // this handles search forms onsubmit process + _form.apbctSearchPrevOnsubmit = _form.onsubmit; + _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form); + } + } + + // Check any XMLHttpRequest connections + apbctCatchXmlHttpRequest(); + + // Initializing the collection of user activity + new ApbctCollectingUserActivity(); + + // Set important paramaters via ajax if problematic cache solutions found + // todo These AJAX calls removed untill we find a better solution, reason is a lot of requests to the server. + // apbctAjaxSetImportantParametersOnCacheExist(ctPublic.advancedCacheExists || ctPublic.varnishCacheExists); + + // Checking that the bot detector has loaded and received the event token for Anti-Crawler + if (ctPublic.settings__sfw__anti_crawler) { + checkBotDetectorExist(); + } +} + +/** + * Checking that the bot detector has loaded and received the event token + */ +function checkBotDetectorExist() { + if (ctPublic.settings__data__bot_detector_enabled) { + const botDetectorIntervalSearch = setInterval(() => { + let botDetectorEventToken = localStorage.bot_detector_event_token ? true : false; + + if (botDetectorEventToken) { + ctSetCookie('apbct_bot_detector_exist', '1', '3600'); + clearInterval(botDetectorIntervalSearch); + } + }, 500); + } +} + +/** + * Insert no_cookies_data to rest request + */ +function ctAddWCMiddlewares() { + const ctPinDataToRequest = (options, next) => { + if (typeof options !== 'object' || options === null || + !options.hasOwnProperty('data') || !options.hasOwnProperty('path') + ) { + return next(options); + } + + // add to cart + if (options.data.hasOwnProperty('requests') && + options.data.requests.length > 0 && + options.data.requests[0].hasOwnProperty('path') && + options.data.requests[0].path === '/wc/store/v1/cart/add-item' + ) { + options.data.requests[0].data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.requests[0].data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + // checkout + if (options.path === '/wc/store/v1/checkout') { + options.data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + return next(options); + }; + + if (window.hasOwnProperty('wp') && + window.wp.hasOwnProperty('apiFetch') && + typeof window.wp.apiFetch.use === 'function' + ) { + window.wp.apiFetch.use(ctPinDataToRequest); + } +} + +/** + * Insert event_token and no_cookies_data to some ajax request + */ +function apbctCatchXmlHttpRequest() { + // 1) Check the page if it needed to catch XHR + if ( document.querySelector('div.wfu_container') !== null ) { + const originalSend = XMLHttpRequest.prototype.send; + XMLHttpRequest.prototype.send = function(body) { + // 2) Check the caught request fi it needed to modify + if ( + body && + typeof body === 'string' && + ( + body.indexOf('action=wfu_ajax_action_ask_server') !== -1 + ) + ) { + let addidionalCleantalkData = ''; + let eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if ( + eventToken !== null && + eventToken !== false && + eventToken.hasOwnProperty('value') && + eventToken.value !== '' + ) { + eventToken = eventToken.value; + addidionalCleantalkData += '&' + 'data%5Bct_bot_detector_event_token%5D=' + eventToken; + } + + let noCookieData = getNoCookieData(); + addidionalCleantalkData += '&' + 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData; + + body += addidionalCleantalkData; + + return originalSend.apply(this, [body]); + } + return originalSend.apply(this, [body]); + }; + } +} + +/** + * Run AJAX to set important_parameters on the site backend if problematic cache solutions are defined. + * @param {boolean} cacheExist + */ +function apbctAjaxSetImportantParametersOnCacheExist(cacheExist) { // eslint-disable-line no-unused-vars + // Set important parameters via ajax + if ( cacheExist ) { + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST('apbct_set_important_parameters', {}); + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX({action: 'apbct_set_important_parameters'}, {}); + } + } +} + +/** + * Prepare jQuery.ajaxSetup to add nocookie data to the jQuery ajax request. + * Notes: + * - Do it just once, the ajaxSetup.beforeSend will be overwritten for any calls. + * - Signs of forms need to be caught will be checked during ajaxSetup.settings.data process on send. + * - Any sign of the form HTML of the caller is insignificant in this process. + * @return {void} + */ +function ctAjaxSetupAddCleanTalkDataBeforeSendAjax() { + // jquery ajax call intercept + // this is the only place where we can found hard dependency on jQuery, if the form use it - the script + // will work independing if jQuery is loaded by CleanTalk or not + let eventToken = false; + if ( typeof jQuery !== 'undefined' && typeof jQuery.ajaxSetup === 'function') { + jQuery.ajaxSetup({ + beforeSend: function(xhr, settings) { + let sourceSign = false; + // settings data is string (important!) + if ( typeof settings.data === 'string' ) { + if (settings.data.indexOf('twt_cc_signup') !== -1) { + sourceSign = 'twt_cc_signup'; + } + + if (settings.data.indexOf('action=mailpoet') !== -1) { + sourceSign = 'action=mailpoet'; + } + + if ( + settings.data.indexOf('action=user_registration') !== -1 && + settings.data.indexOf('ur_frontend_form_nonce') !== -1 + ) { + sourceSign = 'action=user_registration'; + } + + if (settings.data.indexOf('action=happyforms_message') !== -1) { + sourceSign = 'action=happyforms_message'; + } + + if (settings.data.indexOf('action=new_activity_comment') !== -1) { + sourceSign = 'action=new_activity_comment'; + } + } + if ( typeof settings.url === 'string' ) { + if (settings.url.indexOf('wc-ajax=add_to_cart') !== -1) { + sourceSign = 'wc-ajax=add_to_cart'; + if (localStorage.getItem('bot_detector_event_token') !== null) { + eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if (eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') { + eventToken = eventToken.value; + } + } + } + } + + if (sourceSign) { + let noCookieData = getNoCookieData(); + if (typeof eventToken === 'string') { + eventToken = 'data%5Bct_bot_detector_event_token%5D=' + eventToken + '&'; + } else { + eventToken = ''; + } + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + + settings.data = noCookieData + eventToken + settings.data; + } + }, + }); + } +} + +// eslint-disable-next-line require-jsdoc +function ctOnsubmitPrevCallExclude(form) { + if (form.classList.contains('hb-booking-search-form')) { + return true; + } + + return false; +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbct_ready(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbct_ready); + } + + apbctLocalStorage.set('ct_checkjs', ctPublic.ct_checkjs_key, true ); +} + +/** + * @param {SubmitEvent} e + * @param {object} targetForm + */ +function ctSearchFormOnSubmitHandler(e, targetForm) { + try { + // get honeypot field and it's value + const honeyPotField = targetForm.querySelector('[name*="apbct_email_id__"]'); + let hpValue = null; + if ( + honeyPotField !== null && + honeyPotField.value !== null + ) { + hpValue = honeyPotField.value; + } + + // get cookie data from storages + let cleantalkStorageDataArray = getCleanTalkStorageDataArray(); + + // get event token from storage + let eventTokenLocalStorage = apbctLocalStorage.get('bot_detector_event_token'); + + // if noCookie data or honeypot data is set, proceed handling + if ( cleantalkStorageDataArray !== null || honeyPotField !== null || eventTokenLocalStorage !== null ) { + e.preventDefault(); + const callBack = () => { + if (honeyPotField !== null) { + honeyPotField.parentNode.removeChild(honeyPotField); + } + if (typeof targetForm.apbctSearchPrevOnsubmit === 'function') { + targetForm.apbctSearchPrevOnsubmit(); + } else { + HTMLFormElement.prototype.submit.call(targetForm); + } + }; + + let cookiesArray = cleantalkStorageDataArray; + + // if honeypot data provided add the fields to the parsed data + if ( hpValue !== null ) { + cookiesArray.apbct_search_form__honeypot_value = hpValue; + } + + // set event token + cookiesArray.ct_bot_detector_event_token = eventTokenLocalStorage; + + // if the pixel needs to be decoded + if ( + typeof cookiesArray.apbct_pixel_url === 'string' && + cookiesArray.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookiesArray.apbct_pixel_url = decodeURIComponent(cookiesArray.apbct_pixel_url); + } + + // data to JSON + const parsedCookies = JSON.stringify(cookiesArray); + + // if any data provided, proceed data to xhr + if ( typeof parsedCookies !== 'undefined' && parsedCookies.length !== 0 ) { + ctSetAlternativeCookie( + parsedCookies, + {callback: callBack, onErrorCallback: callBack, forceAltCookies: true}, + ); + } else { + callBack(); + } + } + } catch (error) { + console.warn('APBCT search form onsubmit handler error. ' + error); + } +} + +/** + * @param {mixed} commonCookies + * @return {string} + */ +function getJavascriptClientData(commonCookies = []) { // eslint-disable-line no-unused-vars + let resultDataJson = {}; + + resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails'); + resultDataJson.ct_checked_emails_exist = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails_exist'); + resultDataJson.ct_checkjs = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checkjs'); + resultDataJson.ct_fkp_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_fkp_timestamp'); + resultDataJson.ct_pointer_data = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_pointer_data'); + resultDataJson.ct_ps_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_ps_timestamp'); + resultDataJson.ct_screen_info = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_screen_info'); + resultDataJson.ct_timezone = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_timezone'); + + // collecting data from localstorage + const ctMouseMovedLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const apbctPageHits = apbctLocalStorage.get('apbct_page_hits'); + const apbctPrevReferer = apbctSessionStorage.get('apbct_prev_referer'); + const apbctSiteReferer = apbctSessionStorage.get('apbct_site_referer'); + const ctJsErrorsLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_js_errors'); + const ctPixelUrl = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadless = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + const ctBotDetectorFrontendDataLog = apbctLocalStorage.get( + ctPublicFunctions.cookiePrefix + 'ct_bot_detector_frontend_data_log', + ); + + // collecting data from cookies + const ctMouseMovedCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const ctCookiesPixelUrl = ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadlessNative = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + + + resultDataJson.ct_mouse_moved = ctMouseMovedLocalStorage !== undefined ? + ctMouseMovedLocalStorage : ctMouseMovedCookie; + resultDataJson.ct_has_scrolled = ctHasScrolledLocalStorage !== undefined ? + ctHasScrolledLocalStorage : ctHasScrolledCookie; + resultDataJson.ct_cookies_type = ctCookiesTypeLocalStorage !== undefined ? + ctCookiesTypeLocalStorage : ctCookiesTypeCookie; + resultDataJson.apbct_pixel_url = ctPixelUrl !== undefined ? + ctPixelUrl : ctCookiesPixelUrl; + resultDataJson.apbct_headless = apbctHeadless !== undefined ? + apbctHeadless : apbctHeadlessNative; + resultDataJson.ct_bot_detector_frontend_data_log = ctBotDetectorFrontendDataLog !== undefined ? + ctBotDetectorFrontendDataLog : ''; + if (resultDataJson.apbct_pixel_url && typeof(resultDataJson.apbct_pixel_url) == 'string') { + if (resultDataJson.apbct_pixel_url.indexOf('%3A%2F')) { + resultDataJson.apbct_pixel_url = decodeURIComponent(resultDataJson.apbct_pixel_url); + } + } + + resultDataJson.apbct_page_hits = apbctPageHits; + resultDataJson.apbct_prev_referer = apbctPrevReferer; + resultDataJson.apbct_site_referer = apbctSiteReferer; + resultDataJson.apbct_ct_js_errors = ctJsErrorsLocalStorage; + + if (!resultDataJson.apbct_pixel_url) { + resultDataJson.apbct_pixel_url = ctPublic.pixel__url; + } + + if ( typeof (commonCookies) === 'object') { + for (let i = 0; i < commonCookies.length; ++i) { + if ( typeof (commonCookies[i][1]) === 'object' ) { + // this is for handle SFW cookies + resultDataJson[commonCookies[i][1][0]] = commonCookies[i][1][1]; + } else { + resultDataJson[commonCookies[i][0]] = commonCookies[i][1]; + } + } + } else { + console.log('APBCT JS ERROR: Collecting data type mismatch'); + } + + // Parse JSON properties to prevent double JSON encoding + resultDataJson = removeDoubleJsonEncoding(resultDataJson); + + + return JSON.stringify(resultDataJson); +} + +/** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {mixed} object + * @return {*} + */ +function removeDoubleJsonEncoding(object) { + if ( typeof object === 'object') { + // eslint-disable-next-line guard-for-in + for (let objectKey in object) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = removeDoubleJsonEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + const parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + + return object; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_collect_visible_fields( form ) { + // Get only fields + let inputs = []; + let inputsVisible = ''; + let inputsVisibleCount = 0; + let inputsInvisible = ''; + let inputsInvisibleCount = 0; + let inputsWithDuplicateNames = []; + + for (let key in form.elements) { + if (!isNaN(+key)) { + inputs[key] = form.elements[key]; + } + } + + // Filter fields + inputs = inputs.filter(function(elem) { + // Filter already added fields + if ( inputsWithDuplicateNames.indexOf( elem.getAttribute('name') ) !== -1 ) { + return false; + } + // Filter inputs with same names for type == radio + if ( -1 !== ['radio', 'checkbox'].indexOf( elem.getAttribute('type') )) { + inputsWithDuplicateNames.push( elem.getAttribute('name') ); + return false; + } + return true; + }); + + // Visible fields + inputs.forEach(function(elem, i, elements) { + // Unnecessary fields + if ( + elem.getAttribute('type') === 'submit' || // type == submit + elem.getAttribute('name') === null || + elem.getAttribute('name') === 'ct_checkjs' + ) { + return; + } + // Invisible fields + if ( + getComputedStyle(elem).display === 'none' || // hidden + getComputedStyle(elem).visibility === 'hidden' || // hidden + getComputedStyle(elem).opacity === '0' || // hidden + elem.getAttribute('type') === 'hidden' // type == hidden + ) { + if ( elem.classList.contains('wp-editor-area') ) { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } else { + inputsInvisible += ' ' + elem.getAttribute('name'); + inputsInvisibleCount++; + } + // eslint-disable-next-line brace-style + } + // Visible fields + else { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } + }); + + inputsInvisible = inputsInvisible.trim(); + inputsVisible = inputsVisible.trim(); + + return { + visible_fields: inputsVisible, + visible_fields_count: inputsVisibleCount, + invisible_fields: inputsInvisible, + invisible_fields_count: inputsInvisibleCount, + }; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_visible_fields_set_cookie( visibleFieldsCollection, formId ) { + let collection = typeof visibleFieldsCollection === 'object' && visibleFieldsCollection !== null ? + visibleFieldsCollection : {}; + + if ( ctPublic.data__cookies_type === 'native' ) { + // eslint-disable-next-line guard-for-in + for ( let i in collection ) { + if ( i > 10 ) { + // Do not generate more than 10 cookies + return; + } + let collectionIndex = formId !== undefined ? formId : i; + ctSetCookie('apbct_visible_fields_' + collectionIndex, JSON.stringify( collection[i] ) ); + } + } else { + ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) ); + } +} + +// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars +function apbct_js_keys__set_input_value(result, data, params, obj) { + if ( document.querySelectorAll('[name^=ct_checkjs]').length > 0 ) { + let elements = document.querySelectorAll('[name^=ct_checkjs]'); + for ( let i = 0; i < elements.length; i++ ) { + elements[i].value = result.js_key; + } + } +} + +/** + * @return {string} + */ +function apbctGetScreenInfo() { + return JSON.stringify({ + fullWidth: document.documentElement.scrollWidth, + fullHeight: Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight, + ), + visibleWidth: document.documentElement.clientWidth, + visibleHeight: document.documentElement.clientHeight, + }); +} + +// eslint-disable-next-line require-jsdoc +function ctParseBlockMessage(response) { + let msg = ''; + if (typeof response.apbct !== 'undefined') { + response = response.apbct; + if (response.blocked) { + msg = response.comment; + } + } + if (typeof response.data !== 'undefined') { + response = response.data; + if (response.message !== undefined) { + msg = response.message; + } + } + + if (msg) { + document.dispatchEvent( + new CustomEvent( 'apbctAjaxBockAlert', { + bubbles: true, + detail: {message: msg}, + } ), + ); + + // Show the result by modal + cleantalkModal.loaded = msg; + cleantalkModal.open(); + + if (+response.stop_script === 1) { + window.stop(); + } + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetPixelUrlLocalstorage(ajaxPixelUrl) { + // set pixel to the storage + ctSetCookie('apbct_pixel_url', ajaxPixelUrl); +} + +// eslint-disable-next-line require-jsdoc +function ctNoCookieConstructHiddenField(type) { + let inputType = 'hidden'; + if (type === 'submit') { + inputType = 'submit'; + } + let field = ''; + + let noCookieData = getCleanTalkStorageDataArray(); + noCookieData = JSON.stringify(noCookieData); + noCookieData = '_ct_no_cookie_data_' + btoa(noCookieData); + field = document.createElement('input'); + field.setAttribute('name', 'ct_no_cookie_hidden_field'); + field.setAttribute('value', noCookieData); + field.setAttribute('type', inputType); + field.classList.add('apbct_special_field'); + field.classList.add('ct_no_cookie_hidden_field'); + return field; +} + +/** + * Retrieves the clentalk "cookie" data from starages. + * Contains {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}. + * @return {string} + */ +function getCleanTalkStorageDataArray() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + + let noCookieDataTypo = {typo: []}; + if (document.ctTypoData && document.ctTypoData.data) { + noCookieDataTypo = {typo: document.ctTypoData.data}; + } + + let noCookieDataFromUserActivity = {collecting_user_activity_data: []}; + + if (document.ctCollectingUserActivityData) { + let collectingUserActivityData = JSON.parse(JSON.stringify(document.ctCollectingUserActivityData)); + noCookieDataFromUserActivity = {collecting_user_activity_data: collectingUserActivityData}; + } + + return {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}; +} + +/** + * @return {boolean|*} + */ +function ctGetPageForms() { + let forms = document.forms; + if (forms) { + return forms; + } + return false; +} + +/** + * Get type of the field should be excluded. Return exclusion signs via object. + * @param {object} form Form dom object. + * @return {object} {'no_cookie': 1|0, 'visible_fields': 1|0} + */ +function ctGetHiddenFieldExclusionsType(form) { + // visible fields + let result = {'no_cookie': 0, 'visible_fields': 0}; + if ( + +ctPublic.data__visible_fields_required === 0 || + (form.method.toString().toLowerCase() === 'get' && + form.querySelectorAll('.nf-form-content').length === 0 && + form.id !== 'twt_cc_signup') || + form.classList.contains('slp_search_form') || // StoreLocatorPlus form + form.parentElement.classList.contains('mec-booking') || + form.action.toString().indexOf('activehosted.com') !== -1 || // Active Campaign + (form.id && form.id === 'caspioform') || // Caspio Form + (form.classList && form.classList.contains('tinkoffPayRow')) || // TinkoffPayForm + (form.classList && form.classList.contains('give-form')) || // GiveWP + (form.id && form.id === 'ult-forgot-password-form') || // ult forgot password + (form.id && form.id.toString().indexOf('calculatedfields') !== -1) || // CalculatedFieldsForm + (form.id && form.id.toString().indexOf('sac-form') !== -1) || // Simple Ajax Chat + (form.id && + form.id.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + (form.name && + form.name.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + form.action.toString() === 'https://epayment.epymtservice.com/epay.jhtml' || // Custom form + (form.name && form.name.toString().indexOf('tribe-bar-form') !== -1) || // The Events Calendar + (form.id && form.id === 'ihf-login-form') || // Optima Express login + (form.id && + form.id === 'subscriberForm' && + form.action.toString().indexOf('actionType=update') !== -1) || // Optima Express update + (form.id && form.id === 'ihf-main-search-form') || // Optima Express search + (form.id && form.id === 'frmCalc') || // nobletitle-calc + form.action.toString().indexOf('property-organizer-delete-saved-search-submit') !== -1 || + form.querySelector('a[name="login"]') !== null // digimember login form + ) { + result.visible_fields = 1; + } + + // ajax search pro exclusion + let ncFieldExclusionsSign = form.parentNode; + if ( + ncFieldExclusionsSign && ncFieldExclusionsSign.classList.contains('proinput') || + (form.name === 'options' && form.classList.contains('asp-fss-flex')) + ) { + result.no_cookie = 1; + } + + // woocommerce login form + if ( + form && form.classList.contains('woocommerce-form-login') + ) { + result.visible_fields = 1; + result.no_cookie = 1; + } + + return result; +} + +/** + * Check if the form should be skipped from hidden field attach. + * Return exclusion description if it is found, false otherwise. + * @param {object} form Form dom object. + * @param {string} hiddenFieldType Type of hidden field that needs to be checked. + * Possible values: 'no_cookie'|'visible_fields'. + * @return {boolean} + */ +function ctCheckHiddenFieldsExclusions(form, hiddenFieldType) { + const formAction = typeof(form.action) == 'string' ? form.action : ''; + // Ajax Search Lite + if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) { + return true; + } + // Super WooCommerce Product Filter + if (form.classList.contains('swpf-instant-filtering')) { + return true; + } + // PayU 3-rd party service forms + if (formAction.indexOf('secure.payu.com') !== -1 ) { + return true; + } + + if (formAction.indexOf('hsforms') !== -1 ) { + return true; + } + + if (typeof (hiddenFieldType) === 'string' && + ['visible_fields', 'no_cookie'].indexOf(hiddenFieldType) !== -1) { + const exclusions = ctGetHiddenFieldExclusionsType(form); + return exclusions[hiddenFieldType] === 1; + } + + return false; +} + +/** + * ctNoCookieAttachHiddenFieldsToForms + */ +function ctNoCookieAttachHiddenFieldsToForms() { + if (ctPublic.data__cookies_type !== 'none') { + return; + } + + let forms = ctGetPageForms(); + + if (forms) { + for ( let i = 0; i < forms.length; i++ ) { + if ( ctCheckHiddenFieldsExclusions(document.forms[i], 'no_cookie') ) { + continue; + } + + // ignore forms with get method @todo We need to think about this + if (document.forms[i].getAttribute('method') === null || + document.forms[i].getAttribute('method').toLowerCase() === 'post') { + // remove old sets + let fields = forms[i].querySelectorAll('.ct_no_cookie_hidden_field'); + for ( let j = 0; j < fields.length; j++ ) { + fields[j].outerHTML = ''; + } + // add new set + document.forms[i].append(ctNoCookieConstructHiddenField()); + } + } + } +} + +const defaultFetch = window.fetch; +const defaultSend = XMLHttpRequest.prototype.send; + +if (document.readyState !== 'loading') { + checkFormsExistForCatching(); +} else { + apbct_attach_event_handler(document, 'DOMContentLoaded', checkFormsExistForCatching); +} + +/** + * checkFormsExistForCatching + */ +function checkFormsExistForCatching() { + setTimeout(function() { + if (isFormThatNeedCatch()) { + window.fetch = function(...args) { + if (args && + args[0] && + typeof args[0].includes === 'function' && + args[0].includes('/wp-json/metform/') + ) { + let noCookieData = getNoCookieData(); + + if (args && args[1] && args[1].body) { + args[1].body.append('ct_no_cookie_hidden_field', noCookieData); + } + } + + return defaultFetch.apply(window, args); + }; + } + }, 1000); +} + +/** + * @return {boolean} + */ +function isFormThatNeedCatch() { + const formClasses = [ + 'metform-form-content', + ]; + let classExists = false; + + const forms = document.forms; + for (let form of forms) { + formClasses.forEach(function(classForm) { + if (form.classList.contains(classForm)) { + classExists = true; + } + }); + } + + return classExists; +} + +/** + * @param {HTMLElement} form + * @return {boolean} + */ +function isFormThatNeedCatchXhr(form) { + if (document.querySelector('div.elementor-widget[title=\'Login/Signup\']') != null) { + return false; + } + if (form && form.action && form.action.toString().indexOf('mailpoet_subscription_form') !== -1) { + return true; + } + + return false; +} + +/** + * @return {string} + */ +function getNoCookieData() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + let noCookieData = {...noCookieDataLocal, ...noCookieDataSession}; + noCookieData = JSON.stringify(noCookieData); + + return '_ct_no_cookie_data_' + btoa(noCookieData); +} + +/** + * Set three statements to the sessions storage: apbct_session_current_page, apbct_prev_referer. + * @return {void} + */ +function apbctWriteReferrersToSessionStorage() { + const sessionCurrentPage = apbctSessionStorage.get('apbct_session_current_page'); + + // set session apbct_referer + if (sessionCurrentPage!== false && document.location.href !== sessionCurrentPage) { + apbctSessionStorage.set('apbct_prev_referer', sessionCurrentPage, false); + } + + // set session current page to know referrer + apbctSessionStorage.set('apbct_session_current_page', document.location.href, false); +} + +/** + * WooCommerce add to cart by GET request params collecting + */ +function apbctCheckAddToCartByGet() { + // 1) Collect all links with add_to_cart_button class + document.querySelectorAll('a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)').forEach((el) => { + el.addEventListener('click', function(e) { + let href = el.getAttribute('href'); + // 2) Add to href attribute additional parameter ct_bot_detector_event_token gathered from apbctLocalStorage + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if ( eventToken ) { + if ( href.indexOf('?') === -1 ) { + href += '?'; + } else { + href += '&'; + } + href += 'ct_bot_detector_event_token=' + eventToken; + el.setAttribute('href', href); + } + }); + }); +} + +/* Cleantalk Modal object */ +let cleantalkModal = { + + // Flags + loaded: false, + loading: false, + opened: false, + opening: false, + ignoreURLConvert: false, + + // Methods + load: function( action ) { + if ( ! this.loaded ) { + this.loading = true; + let callback = function( result, data, params, obj ) { + cleantalkModal.loading = false; + cleantalkModal.loaded = result; + document.dispatchEvent( + new CustomEvent( 'cleantalkModalContentLoaded', { + bubbles: true, + } ), + ); + }; + // eslint-disable-next-line camelcase + if ( typeof apbct_admin_sendAJAX === 'function' ) { + apbct_admin_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } else { + apbct_public_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } + } + }, + + open: function() { + /* Cleantalk Modal CSS start */ + let renderCss = function() { + let cssStr = ''; + // eslint-disable-next-line guard-for-in + for ( const key in this.styles ) { + cssStr += key + ':' + this.styles[key] + ';'; + } + return cssStr; + }; + let overlayCss = { + styles: { + 'z-index': '9999999999', + 'position': 'fixed', + 'top': '0', + 'left': '0', + 'width': '100%', + 'height': '100%', + 'background': 'rgba(0,0,0,0.5)', + 'display': 'flex', + 'justify-content': 'center', + 'align-items': 'center', + }, + toString: renderCss, + }; + let innerCss = { + styles: { + 'position': 'relative', + 'padding': '30px', + 'background': '#FFF', + 'border': '1px solid rgba(0,0,0,0.75)', + 'border-radius': '4px', + 'box-shadow': '7px 7px 5px 0px rgba(50,50,50,0.75)', + }, + toString: renderCss, + }; + let closeCss = { + styles: { + 'position': 'absolute', + 'background': '#FFF', + 'width': '20px', + 'height': '20px', + 'border': '2px solid rgba(0,0,0,0.75)', + 'border-radius': '15px', + 'cursor': 'pointer', + 'top': '-8px', + 'right': '-8px', + 'box-sizing': 'content-box', + }, + toString: renderCss, + }; + let closeCssBefore = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(45deg)', + }, + toString: renderCss, + }; + let closeCssAfter = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(-45deg)', + }, + toString: renderCss, + }; + let bodyCss = { + styles: { + 'overflow': 'hidden', + }, + toString: renderCss, + }; + let cleantalkModalStyle = document.createElement( 'style' ); + cleantalkModalStyle.setAttribute( 'id', 'cleantalk-modal-styles' ); + cleantalkModalStyle.innerHTML = 'body.cleantalk-modal-opened{' + bodyCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-overlay{' + overlayCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close{' + closeCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:before{' + closeCssBefore + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:after{' + closeCssAfter + '}'; + document.body.append( cleantalkModalStyle ); + /* Cleantalk Modal CSS end */ + + let overlay = document.createElement( 'div' ); + overlay.setAttribute( 'id', 'cleantalk-modal-overlay' ); + document.body.append( overlay ); + + document.body.classList.add( 'cleantalk-modal-opened' ); + + let inner = document.createElement( 'div' ); + inner.setAttribute( 'id', 'cleantalk-modal-inner' ); + inner.setAttribute( 'style', innerCss ); + overlay.append( inner ); + + let close = document.createElement( 'div' ); + close.setAttribute( 'id', 'cleantalk-modal-close' ); + inner.append( close ); + + let content = document.createElement( 'div' ); + if ( this.loaded ) { + const urlRegex = /(https?:\/\/[^\s]+)/g; + const serviceContentRegex = /.*\/inc/g; + if (serviceContentRegex.test(this.loaded) || this.ignoreURLConvert) { + content.innerHTML = this.loaded; + } else { + content.innerHTML = this.loaded.replace(urlRegex, '$1'); + } + } else { + content.innerHTML = 'Loading...'; + // @ToDo Here is hardcoded parameter. Have to get this from a 'data-' attribute. + this.load( 'get_options_template' ); + } + content.setAttribute( 'id', 'cleantalk-modal-content' ); + inner.append( content ); + + this.opened = true; + }, + + close: function() { + document.body.classList.remove( 'cleantalk-modal-opened' ); + document.getElementById( 'cleantalk-modal-overlay' ).remove(); + document.getElementById( 'cleantalk-modal-styles' ).remove(); + document.dispatchEvent( + new CustomEvent( 'cleantalkModalClosed', { + bubbles: true, + } ), + ); + }, + +}; + +/* Cleantalk Modal helpers */ +document.addEventListener('click', function( e ) { + if ( e.target && (e.target.id === 'cleantalk-modal-overlay' || e.target.id === 'cleantalk-modal-close') ) { + cleantalkModal.close(); + } +}); +document.addEventListener('cleantalkModalContentLoaded', function( e ) { + if ( cleantalkModal.opened && cleantalkModal.loaded ) { + document.getElementById( 'cleantalk-modal-content' ).innerHTML = cleantalkModal.loaded; + } +}); + +document.addEventListener('DOMContentLoaded', function() { + let ctTrpLocalize = undefined; + let ctTrpIsAdminCommentsList = false; + + if ( typeof ctPublic !== 'undefined' || typeof ctTrpAdminLocalize !== 'undefined' ) { + if ( typeof ctPublic !== 'undefined' && ctPublic.theRealPerson ) { + ctTrpLocalize = ctPublic.theRealPerson; + } + if ( + typeof ctTrpLocalize === 'undefined' && + typeof ctTrpAdminLocalize !== 'undefined' && + ctTrpAdminLocalize.theRealPerson + ) { + ctTrpLocalize = ctTrpAdminLocalize.theRealPerson; + ctTrpIsAdminCommentsList = true; + } + } + + if ( ! ctTrpLocalize ) { + return; + } + + // Selectors. Try to handle the WIDE range of themes. + let themesCommentsSelector = '.apbct-trp *[class*="comment-author"]'; + if ( document.querySelector('.apbct-trp .comment-author .comment-author-link') ) { + // For Spacious theme + themesCommentsSelector = '.apbct-trp *[class*="comment-author-link"]'; + } + let woocommerceReviewsSelector = '.apbct-trp *[class*="review__author"]'; + let adminCommentsListSelector = '.apbct-trp td[class*="column-author"] > strong'; + const trpComments = document.querySelectorAll( + themesCommentsSelector + ',' + + woocommerceReviewsSelector + ',' + + adminCommentsListSelector); + + if ( trpComments.length === 0 ) { + return; + } + + trpComments.forEach(( element, index ) => { + // Exceptions for items that are included in the selection + if ( + typeof pagenow == 'undefined' && + element.parentElement.className.indexOf('group') < 0 && + element.tagName != 'DIV' + ) { + return; + } + + let trpLayout = document.createElement('div'); + trpLayout.setAttribute('class', 'apbct-real-user-badge'); + + let trpImage = document.createElement('img'); + trpImage.setAttribute('src', ctTrpLocalize.imgPersonUrl); + trpImage.setAttribute('class', 'apbct-real-user-popup-img'); + + let trpDescription = document.createElement('div'); + trpDescription.setAttribute('class', 'apbct-real-user-popup'); + + let trpDescriptionHeading = document.createElement('p'); + trpDescriptionHeading.setAttribute('class', 'apbct-real-user-popup-header'); + trpDescriptionHeading.append(ctTrpLocalize.phrases.trpHeading); + + let trpDescriptionContent = document.createElement('div'); + trpDescriptionContent.setAttribute('class', 'apbct-real-user-popup-content_row'); + + let trpDescriptionContentSpan = document.createElement('span'); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent1 + ' '); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent2); + + if ( ctTrpIsAdminCommentsList ) { + let learnMoreLink = document.createElement('a'); + learnMoreLink.setAttribute('href', ctTrpLocalize.trpContentLink); + learnMoreLink.setAttribute('target', '_blank'); + learnMoreLink.text = ctTrpLocalize.phrases.trpContentLearnMore; + trpDescriptionContentSpan.append(' '); // Need one space + trpDescriptionContentSpan.append(learnMoreLink); + } + + trpDescriptionContent.append(trpDescriptionContentSpan); + trpDescription.append(trpDescriptionHeading, trpDescriptionContent); + trpLayout.append(trpImage); + element.append(trpLayout); + element.append(trpDescription); + }); + + const badges = document.querySelectorAll('.apbct-real-user-badge'); + + badges.forEach((badge) => { + let hideTimeout = undefined; + + this.body.addEventListener('click', function(e) { + if ( + e.target.className.indexOf('apbct-real-user') == -1 && + e.target.parentElement.className.indexOf('apbct-real-user') == -1 + ) { + closeAllPopupTRP(); + } + }); + + badge.addEventListener('click', function() { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.toggle('visible'); + } + }); + + badge.addEventListener('mouseenter', function() { + closeAllPopupTRP(); + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.add('visible'); + } + }); + + badge.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + const popup = badge.nextElementSibling; + popup.addEventListener('mouseenter', function() { + clearTimeout(hideTimeout); + popup.classList.add('visible'); + }); + + popup.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + if (popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + // For mobile devices + badge.addEventListener('touchend', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + const selection = window.getSelection(); + // Check if no text is selected + if (popup && selection && popup.classList.contains('apbct-real-user-popup') && + selection.toString().length === 0 + ) { + popup.classList.remove('visible'); + } else { + clearTimeout(hideTimeout); + document.addEventListener('selectionchange', function onSelectionChange() { + const selection = window.getSelection(); + if (selection && selection.toString().length === 0) { + // Restart the hide timeout when selection is cleared + hideTimeout = setTimeout(() => { + const popup = badge.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 3000); + document.removeEventListener('selectionchange', onSelectionChange); + } + }); + } + }, 3000); + }); + }); +}); + +/** + * Closing all TRP popup + */ +function closeAllPopupTRP() { + let allDisplayPopup = document.querySelectorAll('.apbct-real-user-popup.visible'); + if (allDisplayPopup.length > 0) { + allDisplayPopup.forEach((element) => { + element.classList.remove('visible'); + }); + } +} + +/** + * Handle external forms + */ +function ctProtectExternal() { + for (let i = 0; i < document.forms.length; i++) { + if (document.forms[i].cleantalk_hidden_action === undefined && + document.forms[i].cleantalk_hidden_method === undefined) { + // current form + const currentForm = document.forms[i]; + + // skip excluded forms + if ( formIsExclusion(currentForm)) { + continue; + } + + // Ajax checking for the integrated forms - will be changed the whole form object to make protection + if ( isIntegratedForm(currentForm) ) { + apbctProcessExternalForm(currentForm, i, document); + + // Ajax checking for the integrated forms - will be changed only submit button to make protection + } else if ( + // MooForm 3rd party service + currentForm.dataset.mailingListId !== undefined || + (typeof(currentForm.action) == 'string' && + (currentForm.action.indexOf('webto.salesforce.com') !== -1)) || + (typeof(currentForm.action) == 'string' && + currentForm.querySelector('[href*="activecampaign"]')) || + ( + typeof(currentForm.action) == 'string' && + currentForm.action.indexOf('hsforms.com') !== -1 && + currentForm.getAttribute('data-hs-cf-bound') + ) + ) { + apbctProcessExternalFormByFakeButton(currentForm, i, document); + // Common flow - modify form's action + } else if ( + typeof(currentForm.action) == 'string' && + ( currentForm.action.indexOf('http://') !== -1 || + currentForm.action.indexOf('https://') !== -1 ) + ) { + let tmp = currentForm.action.split('//'); + tmp = tmp[1].split('/'); + const host = tmp[0].toLowerCase(); + + if (host !== location.hostname.toLowerCase()) { + const ctAction = document.createElement('input'); + ctAction.name = 'cleantalk_hidden_action'; + ctAction.value = currentForm.action; + ctAction.type = 'hidden'; + currentForm.appendChild(ctAction); + + const ctMethod = document.createElement('input'); + ctMethod.name = 'cleantalk_hidden_method'; + ctMethod.value = currentForm.method; + ctMethod.type = 'hidden'; + + currentForm.method = 'POST'; + + currentForm.appendChild(ctMethod); + + currentForm.action = document.location; + } + } + } + } + // Trying to process external form into an iframe + apbctProcessIframes(); + // if form is still not processed by fields listening, do it here + ctStartFieldsListening(); +} + +/** + * Exclusion forms + * @param {HTMLElement} currentForm + * @return {boolean} + */ +function formIsExclusion(currentForm) { + const exclusionsById = [ + 'give-form', // give form exclusion because of direct integration + 'frmCalc', // nobletitle-calc + 'ihf-contact-request-form', + 'wpforms', // integration with wpforms + ]; + + const exclusionsByRole = [ + 'search', // search forms + ]; + + const exclusionsByClass = [ + 'search-form', // search forms + 'hs-form', // integrated hubspot plugin through dynamicRenderedForms logic + 'ihc-form-create-edit', // integrated Ultimate Membership Pro plugin through dynamicRenderedForms logic + 'nf-form-content', // integration with Ninja Forms for js events + 'elementor-form', // integration with elementor-form + 'wpforms', // integration with wpforms + 'et_pb_searchform', // integration with elementor-search-form + ]; + + const exclusionsByAction = [ + 'paypal.com/cgi-bin/webscr', // search forms + ]; + + let result = false; + + try { + // mewto forms exclusion + if (currentForm.parentElement && + currentForm.parentElement.classList.length > 0 && + currentForm.parentElement.classList[0].indexOf('mewtwo') !== -1) { + result = true; + } + + if (currentForm.getAttribute('action') !== null) { + exclusionsByAction.forEach(function(exclusionAction) { + if (currentForm.getAttribute('action').indexOf(exclusionAction) !== -1) { + result = true; + } + }); + } + + exclusionsById.forEach(function(exclusionId) { + const formId = currentForm.getAttribute('id'); + if ( formId !== null && typeof (formId) !== 'undefined' && formId.indexOf(exclusionId) !== -1 ) { + result = true; + } + }); + + exclusionsByClass.forEach(function(exclusionClass) { + let foundClass = ''; + if (currentForm.getAttribute('class')) { + foundClass = currentForm.getAttribute('class'); + } else { + foundClass = apbctGetFormClass(currentForm, exclusionClass); + } + const formClass = foundClass; + if ( formClass !== null && typeof formClass !== 'undefined' && formClass.indexOf(exclusionClass) !== -1 ) { + if (currentForm.getAttribute('data-hs-cf-bound')) { + result = false; + } else { + result = true; + } + } + }); + + exclusionsByRole.forEach(function(exclusionRole) { + const formRole = currentForm.getAttribute('id'); + if ( formRole !== null && typeof formRole !== 'undefined'&& formRole.indexOf(exclusionRole) !== -1 ) { + result = true; + } + }); + } catch (e) { + console.table('APBCT ERROR: formIsExclusion() - ', e); + } + + return result; +} + +/** + * Gets the form class if it is not in + * @param {HTMLElement} currentForm + * @param {string} exclusionClass + * @return {string} + */ +function apbctGetFormClass(currentForm, exclusionClass) { + if (typeof(currentForm) == 'object' && currentForm.querySelector('.' + exclusionClass)) { + return exclusionClass; + } +} + +/** + * Handle external forms in iframes + */ +function apbctProcessIframes() { + const frames = document.getElementsByTagName('iframe'); + + if ( frames.length > 0 ) { + for ( let j = 0; j < frames.length; j++ ) { + if ( frames[j].contentDocument == null ) { + continue; + } + + const iframeForms = frames[j].contentDocument.forms; + if ( iframeForms.length === 0 ) { + continue; + } + + for ( let y = 0; y < iframeForms.length; y++ ) { + const currentForm = iframeForms[y]; + if ( formIsExclusion(currentForm)) { + continue; + } + apbctProcessExternalForm(currentForm, y, frames[j].contentDocument); + } + } + } +} + +/** + * Process external forms + * @param {HTMLElement} currentForm + * @param {int} iterator + * @param {HTMLElement} documentObject + */ +function apbctProcessExternalForm(currentForm, iterator, documentObject) { + const cleantalkPlaceholder = document.createElement('i'); + cleantalkPlaceholder.className = 'cleantalk_placeholder'; + cleantalkPlaceholder.style = 'display: none'; + + currentForm.parentElement.insertBefore(cleantalkPlaceholder, currentForm); + + // Deleting form to prevent submit event + const prev = currentForm.previousSibling; + const formHtml = currentForm.outerHTML; + const formOriginal = currentForm; + + // Remove the original form + currentForm.parentElement.removeChild(currentForm); + + // Insert a clone + const placeholder = document.createElement('div'); + placeholder.innerHTML = formHtml; + prev.after(placeholder.firstElementChild); + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + + const reUseCurrentForm = documentObject.forms[iterator]; + + reUseCurrentForm.appendChild(forceAction); + reUseCurrentForm.apbctPrev = prev; + reUseCurrentForm.apbctFormOriginal = formOriginal; + + // mailerlite integration - disable click on submit button + let mailerliteDetectedClass = false; + if (reUseCurrentForm.classList !== undefined) { + // list there all the mailerlite classes + const mailerliteClasses = ['newsletterform', 'ml-block-form']; + mailerliteClasses.forEach(function(mailerliteClass) { + if (reUseCurrentForm.classList.contains(mailerliteClass)) { + mailerliteDetectedClass = mailerliteClass; + } + }); + } + + let mailerliteSubmitButton = null; + if ( mailerliteDetectedClass ) { + mailerliteSubmitButton = reUseCurrentForm.querySelector('button[type="submit"]'); + if ( mailerliteSubmitButton !== null && mailerliteSubmitButton !== undefined ) { + mailerliteSubmitButton.addEventListener('click', function(event) { + event.preventDefault(); + sendAjaxCheckingFormData(reUseCurrentForm); + }); + } + return; + } + + documentObject.forms[iterator].onsubmit = function(event) { + event.preventDefault(); + sendAjaxCheckingFormData(event.currentTarget); + }; +} + +/** + * Process external forms via fake button replacing + * @param {HTMLElement} currentForm + * @param {int} iterator + * @param {HTMLElement} documentObject + */ +function apbctProcessExternalFormByFakeButton(currentForm, iterator, documentObject) { + const submitButtonOriginal = currentForm.querySelector('[type="submit"]'); + const onsubmitOriginal = currentForm.querySelector('[type="submit"]').form.onsubmit; + + if ( ! submitButtonOriginal ) { + return; + } + + const parent = submitButtonOriginal.parentElement; + const submitButtonHtml = submitButtonOriginal.outerHTML; + + // Remove the original submit button + submitButtonOriginal.remove(); + + // Insert a clone of the submit button + const placeholder = document.createElement('div'); + placeholder.innerHTML = submitButtonHtml; + parent.appendChild(placeholder.firstElementChild); + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + + const reUseCurrentForm = documentObject.forms[iterator]; + + reUseCurrentForm.appendChild(forceAction); + reUseCurrentForm.apbctParent = parent; + reUseCurrentForm.submitButtonOriginal = submitButtonOriginal; + reUseCurrentForm.onsubmitOriginal = onsubmitOriginal; + + documentObject.forms[iterator].onsubmit = function(event) { + event.preventDefault(); + + // MooSend spinner activate + apbctMoosendSpinnerToggle(event.currentTarget); + + sendAjaxCheckingFormData(event.currentTarget); + }; +} + +/** + * Activate or deactivate spinner for Moosend form during request checking + * @param {HTMLElement} form + */ +function apbctMoosendSpinnerToggle(form) { + const buttonElement = form.querySelector('button[type="submit"]'); + if ( buttonElement ) { + const spinner = buttonElement.querySelector('i'); + const submitText = buttonElement.querySelector('span'); + if (spinner && submitText) { + if ( spinner.style.zIndex == 1 ) { + submitText.style.opacity = 1; + spinner.style.zIndex = -1; + spinner.style.opacity = 0; + } else { + submitText.style.opacity = 0; + spinner.style.zIndex = 1; + spinner.style.opacity = 1; + } + } + } +} + +/** + * Process external forms + * @param {HTMLElement} formSource + * @param {HTMLElement} formTarget + */ +function apbctReplaceInputsValuesFromOtherForm(formSource, formTarget) { + const inputsSource = formSource.querySelectorAll('button, input, textarea, select'); + const inputsTarget = formTarget.querySelectorAll('button, input, textarea, select'); + + if (formSource.outerHTML.indexOf('action="https://www.kulahub.net') !== -1 || + isFormHasDiviRedirect(formSource) || + formSource.outerHTML.indexOf('class="et_pb_contact_form') !== -1 || + formSource.outerHTML.indexOf('action="https://api.kit.com') !== -1 || + formSource.outerHTML.indexOf('activehosted.com') !== -1 || + formSource.outerHTML.indexOf('action="https://crm.zoho.com') !== -1 + ) { + inputsSource.forEach((elemSource) => { + inputsTarget.forEach((elemTarget) => { + if (elemSource.name === elemTarget.name) { + if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') { + elemTarget.checked = apbctVal(elemSource); + } else { + elemTarget.value = apbctVal(elemSource); + } + } + }); + }); + + return; + } + + inputsSource.forEach((elemSource) => { + inputsTarget.forEach((elemTarget) => { + if (elemSource.outerHTML === elemTarget.outerHTML) { + if (elemTarget.type === 'checkbox' || elemTarget.type === 'radio') { + elemTarget.checked = apbctVal(elemSource); + } else { + elemTarget.value = apbctVal(elemSource); + } + } + }); + }); +} +// clear protected iframes list +apbctLocalStorage.set('apbct_iframes_protected', []); +window.addEventListener('load', function() { + if ( ! +ctPublic.settings__forms__check_external ) { + return; + } + + setTimeout(function() { + ctProtectExternal(); + catchDynamicRenderedForm(); + catchNextendSocialLoginForm(); + ctProtectOutsideIframe(); + }, 2000); + + ctProtectKlaviyoForm(); +}); + +/** + * Protect klaviyo forms + */ +function ctProtectKlaviyoForm() { + if (!document.querySelector('link[rel="dns-prefetch"][href="//static.klaviyo.com"]')) { + return; + } + + let i = setInterval(() => { + const klaviyoForms = document.querySelectorAll('form.klaviyo-form'); + if (klaviyoForms.length) { + clearInterval(i); + klaviyoForms.forEach((form, index) => { + apbctProcessExternalFormKlaviyo(form, index, document); + }); + } + }, 500); +} + +/** + * Protect klaviyo forms + * @param {HTMLElement} form + * @param {int} iterator + * @param {HTMLElement} documentObject + */ +function apbctProcessExternalFormKlaviyo(form, iterator, documentObject) { + const btn = form.querySelector('button[type="button"].needsclick'); + if (!btn) { + return; + } + btn.disabled = true; + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + form.appendChild(forceAction); + + let cover = document.createElement('div'); + cover.id = 'apbct-klaviyo-cover'; + cover.style.width = '100%'; + cover.style.height = '100%'; + cover.style.background = 'black'; + cover.style.opacity = 0; + cover.style.position = 'absolute'; + cover.style.top = 0; + cover.style.cursor = 'pointer'; + cover.onclick = function(e) { + sendAjaxCheckingFormData(form); + }; + btn.parentNode.style.position = 'relative'; + btn.parentNode.appendChild(cover); +} + +/** + * Protect forms placed in iframe with outside src + */ +function ctProtectOutsideIframe() { + let iframes = document.querySelectorAll('iframe'); + if (iframes.length > 0) { + iframes.forEach(function(iframe) { + if (iframe.src.indexOf('form.typeform.com') !== -1 || + iframe.src.indexOf('forms.zohopublic.com') !== -1 || + iframe.src.indexOf('link.surepathconnect.com') !== -1 || + iframe.src.indexOf('hello.dubsado.com') !== -1 || + iframe.classList.contains('hs-form-iframe') || + ( iframe.src.indexOf('facebook.com') !== -1 && iframe.src.indexOf('plugins/comments.php') !== -1) + ) { + // pass if is already protected + if (false !== apbctLocalStorage.get('apbct_iframes_protected') && + apbctLocalStorage.get('apbct_iframes_protected').length > 0 && + typeof iframe.id !== 'undefined' && + apbctLocalStorage.get('apbct_iframes_protected').indexOf[iframe.id] !== -1 + ) { + return; + } + ctProtectOutsideIframeHandler(iframe); + } + }); + } +} + +let ctProtectOutsideIframeCheck; +/** + * Protect forms placed in iframe with outside src handler + * @param {HTMLElement} iframe + */ +function ctProtectOutsideIframeHandler(iframe) { + let cover = document.createElement('div'); + cover.style.width = '100%'; + cover.style.height = '100%'; + cover.style.background = 'black'; + cover.style.opacity = 0; + cover.style.position = 'absolute'; + cover.style.top = 0; + cover.onclick = function(e) { + if (ctProtectOutsideIframeCheck === undefined) { + let currentDiv = e.currentTarget; + currentDiv.style.opacity = 0.5; + let preloader = document.createElement('div'); + preloader.className = 'apbct-iframe-preloader'; + currentDiv.appendChild(preloader); + let botDetectorToken = ''; + if (document.querySelector('[name*="ct_bot_detector_event_token"]')) { + botDetectorToken = document.querySelector('[name*="ct_bot_detector_event_token"]').value; + } + + let data = { + 'action': 'cleantalk_outside_iframe_ajax_check', + 'ct_no_cookie_hidden_field': getNoCookieData(), + 'ct_bot_detector_event_token': botDetectorToken, + }; + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function(result) { + ctProtectOutsideIframeCheck = true; + if (result.apbct.blocked === false) { + document.querySelectorAll('div.apbct-iframe-preloader').forEach(function(el) { + el.parentNode.remove(); + }); + } else { + document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => { + el.parentNode.style.color = 'white'; + el.parentNode.innerHTML += result.apbct.comment; + }); + document.querySelectorAll('div.apbct-iframe-preloader').forEach((el) => { + el.remove(); + }); + } + }, + }, + ); + } + }; + iframe.parentNode.style.position = 'relative'; + iframe.parentNode.appendChild(cover); + let iframes = apbctLocalStorage.get('apbct_iframes_protected'); + if (false === iframes) { + iframes = []; + } + if (typeof iframe.id !== 'undefined') { + iframes.push(iframe.id); + apbctLocalStorage.set('apbct_iframes_protected', iframes); + } +} + +/** + * Catch NSL form integration + */ +function catchNextendSocialLoginForm() { + let blockNSL = document.getElementById('nsl-custom-login-form-main'); + if (blockNSL) { + blockBtnNextendSocialLogin(blockNSL); + } +} + +/** + * Blocking NSL plugin buttons + * @param {HTMLElement} blockNSL + */ +function blockBtnNextendSocialLogin(blockNSL) { + let parentBtnsNSL = blockNSL.querySelectorAll('.nsl-container-buttons a'); + let childBtnsNSL = blockNSL.querySelectorAll('a[data-plugin="nsl"] .nsl-button'); + parentBtnsNSL.forEach((el) => { + el.setAttribute('data-oauth-login-blocked', 'true'); + el.addEventListener('click', (event) => { + event.preventDefault(); + }); + }); + childBtnsNSL.forEach((el) => { + el.addEventListener('click', (event) => { + event.preventDefault(); + event.stopPropagation(); + ctCheckAjax(el); + }); + }); +} + +/** + * Unlocking the button and clicking on it after an ajax response + * @param {HTMLElement} childBtn + */ +function allowAjaxNextendSocialLogin(childBtn) { + childBtn.parentElement.setAttribute('data-oauth-login-blocked', 'false'); + childBtn.parentElement.click(); +} + +/** + * Locking the button and entering a message after an ajax response + * @param {HTMLElement} childBtn + * @param {string} msg + */ +function forbiddenAjaxNextendSocialLogin(childBtn, msg) { + let parentElement = childBtn.parentElement; + if (parentElement.getAttribute('data-oauth-login-blocked') == 'false') { + parentElement.setAttribute('data-oauth-login-blocked', 'true'); + } + if (!document.querySelector('.ct-forbidden-msg')) { + let elemForMsg = document.createElement('div'); + elemForMsg.className = 'ct-forbidden-msg'; + elemForMsg.style.background = 'red'; + elemForMsg.style.color = 'white'; + elemForMsg.style.padding = '5px'; + elemForMsg.innerHTML = msg; + parentElement.insertAdjacentElement('beforebegin', elemForMsg); + } +} + +/** + * User verification using user data and ajax + * @param {HTMLElement} elem + */ +function ctCheckAjax(elem) { + let data = { + 'action': 'cleantalk_nsl_ajax_check', + 'ct_no_cookie_hidden_field': document.getElementsByName('ct_no_cookie_hidden_field')[0].value, + }; + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function(result) { + if (result.apbct.blocked === false) { + allowAjaxNextendSocialLogin(elem); + } else { + forbiddenAjaxNextendSocialLogin(elem, result.apbct.comment); + } + }, + }, + ); +} + +/** + * Checking the form integration + * @param {HTMLElement} formObj + * @return {boolean} + */ +function isIntegratedForm(formObj) { + const formAction = typeof(formObj.action) == 'string' ? formObj.action : ''; + const formId = formObj.getAttribute('id') !== null ? formObj.getAttribute('id') : ''; + const formClassName = typeof(formObj.className) == 'string' ? formObj.className : ''; + + if ( + ( + formAction.indexOf('app.convertkit.com') !== -1 || // ConvertKit form + formAction.indexOf('app.kit.com') !== -1 || // ConvertKit new form + formAction.indexOf('api.kit.com') !== -1 // ConvertKit new form + ) || + ( formObj.firstChild.classList !== undefined && + formObj.firstChild.classList.contains('cb-form-group') ) || // Convertbox form + formAction.indexOf('mailerlite.com') !== -1 || // Mailerlite integration + formAction.indexOf('colcolmail.co.uk') !== -1 || // colcolmail.co.uk integration + formAction.indexOf('paypal.com') !== -1 || + formAction.indexOf('infusionsoft.com') !== -1 || + formAction.indexOf('secure2.convio.net') !== -1 || + formAction.indexOf('hookb.in') !== -1 || + formAction.indexOf('external.url') !== -1 || + formAction.indexOf('tp.media') !== -1 || + formAction.indexOf('flodesk.com') !== -1 || + formAction.indexOf('sendfox.com') !== -1 || + formAction.indexOf('aweber.com') !== -1 || + formAction.indexOf('secure.payu.com') !== -1 || + formAction.indexOf('mautic') !== -1 || formId.indexOf('mauticform_') !== -1 || + formId.indexOf('ihf-contact-request-form') !== -1 || + formAction.indexOf('crm.zoho.com') !== -1 || + formId.indexOf('delivra-external-form') !== -1 || + // todo Return to Hubspot for elementor in the future, disabled of reason https://doboard.com/1/task/9227 + // ( formObj.classList !== undefined && + // !formObj.classList.contains('woocommerce-checkout') && + // formObj.hasAttribute('data-hs-cf-bound') + // ) || // Hubspot integration in Elementor form// Hubspot integration in Elementor form + formAction.indexOf('eloqua.com') !== -1 || // Eloqua integration + formAction.indexOf('kulahub.net') !== -1 || // Kulahub integration + isFormHasDiviRedirect(formObj) || // Divi contact form + formAction.indexOf('eocampaign1.com') !== -1 || // EmailOctopus Campaign form + formAction.indexOf('wufoo.com') !== -1 || // Wufoo form + formAction.indexOf('activehosted.com') !== -1 || // Activehosted form + formAction.indexOf('publisher.copernica.com') !== -1 || // publisher.copernica + ( + formAction.indexOf('whatsapp.com') !== -1 && + formClassName.indexOf('chaty') !== -1 + ) || // chaty plugin whatsapp form + ( + formObj.classList !== undefined && + formObj.classList.contains('sp-element-container') + ) || // Sendpulse form + apbctIsFormInDiv(formObj, 'b24-form') // Bitrix24 CRM external forms + ) { + return true; + } + + return false; +} + +/** + * This function detect if the form has DIVI redirect. If so, the form will work as external. + * @param {HTMLElement} formObj + * @return {boolean} + */ +function isFormHasDiviRedirect(formObj) { + let result = false; + const diviRedirectedSignSet = document.querySelector('div[id^="et_pb_contact_form"]'); + if ( + typeof formObj === 'object' && formObj !== null && + diviRedirectedSignSet !== null && + diviRedirectedSignSet.hasAttribute('data-redirect_url') && + diviRedirectedSignSet.getAttribute('data-redirect_url') !== '' && + diviRedirectedSignSet.querySelector('form[class^="et_pb_contact_form"]') !== null + ) { + result = formObj === diviRedirectedSignSet.querySelector('form[class^="et_pb_contact_form"]'); + } + return result; +} + +/** + * Sending Ajax for checking form data + * @param {HTMLElement} form + * @param {HTMLElement} prev + * @param {HTMLElement} formOriginal + */ +function sendAjaxCheckingFormData(form) { + // Get visible fields and set cookie + const visibleFields = {}; + visibleFields[0] = apbct_collect_visible_fields(form); + apbct_visible_fields_set_cookie( visibleFields ); + + const data = { + 'ct_bot_detector_event_token': apbctLocalStorage.get('bot_detector_event_token'), + }; + let elems = form.elements; + elems = Array.prototype.slice.call(elems); + + elems.forEach( function( elem, y ) { + if ( elem.name === '' ) { + data['input_' + y] = elem.value; + } else { + data[elem.name] = elem.value; + } + }); + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function( result, data, params, obj ) { + // MooSend spinner deactivate + apbctMoosendSpinnerToggle(form); + // hubspot flag + const isHubSpotEmbedForm = ( + form.hasAttribute('action') && + form.getAttribute('action').indexOf('hsforms') !== -1 + ); + if ((result.apbct === undefined && result.data === undefined) || + (result.apbct !== undefined && ! +result.apbct.blocked) + ) { + // Clear service fields + for (const el of form.querySelectorAll('input[name="apbct_visible_fields"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[value="cleantalk_force_ajax_check"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[name="ct_no_cookie_hidden_field"]')) { + el.remove(); + } + + // Klaviyo integration + if (form.classList !== undefined && form.classList.contains('klaviyo-form')) { + const cover = document.getElementById('apbct-klaviyo-cover'); + if (cover) { + cover.remove(); + } + const btn = form.querySelector('button[type="button"].needsclick'); + if (btn) { + btn.disabled = false; + btn.click(); + } + return; + } + + // MooSend integration + if ( form.dataset.mailingListId !== undefined ) { + let submitButton = form.querySelector('[type="submit"]'); + submitButton.remove(); + const parent = form.apbctParent; + parent.appendChild(form.submitButtonOriginal); + submitButton = form.querySelector('[type="submit"]'); + submitButton.click(); + return; + } + + // Salesforce integration + if (form.hasAttribute('action') && + (form.getAttribute('action').indexOf('webto.salesforce.com') !== -1) + ) { + let submitButton = form.querySelector('[type="submit"]'); + submitButton.remove(); + const parent = form.apbctParent; + parent.appendChild(form.submitButtonOriginal); + form.onsubmit = form.onsubmitOriginal; + submitButton = form.querySelector('[type="submit"]'); + submitButton.click(); + return; + } + + // Hubspot bounded integration + if (isHubSpotEmbedForm) { + let submitButton = form.querySelector('[type="submit"]'); + submitButton.remove(); + const parent = form.apbctParent; + parent.appendChild(form.submitButtonOriginal); + form.onsubmit = form.onsubmitOriginal; + submitButton = form.querySelector('[type="submit"]'); + submitButton.click(); + return; + } + + const formNew = form; + form.parentElement.removeChild(form); + const prev = form.apbctPrev; + const formOriginal = form.apbctFormOriginal; + let mauticIntegration = false; + + apbctReplaceInputsValuesFromOtherForm(formNew, formOriginal); + + // mautic forms integration + if (formOriginal && + typeof formOriginal.id === 'string' && + formOriginal.id.indexOf('mautic') !== -1 + ) { + mauticIntegration = true; + } + + prev.after( formOriginal ); + + // Clear visible_fields input + for (const el of formOriginal.querySelectorAll('input[name="apbct_visible_fields"]')) { + el.remove(); + } + + for (const el of formOriginal.querySelectorAll('input[value="cleantalk_force_ajax_check"]')) { + el.remove(); + } + + // Common click event + let submButton = formOriginal.querySelectorAll('button[type=submit]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + if (mauticIntegration) { + setTimeout(function() { + ctProtectExternal(); + }, 1500); + } + return; + } + + submButton = formOriginal.querySelectorAll('input[type=submit]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + return; + } + + // ConvertKit direct integration + submButton = formOriginal.querySelectorAll('button[data-element="submit"]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + return; + } + submButton = formOriginal.querySelectorAll('button#ck_subscribe_button'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + return; + } + + // Paypal integration + submButton = formOriginal.querySelectorAll('input[type="image"][name="submit"]'); + if ( submButton.length !== 0 ) { + submButton[0].click(); + } + } + if ((result.apbct !== undefined && +result.apbct.blocked) || + (result.data !== undefined && result.data.message !== undefined) + ) { + ctParseBlockMessage(result); + // hubspot embed form needs to reload page to prevent forms mishandling + if (isHubSpotEmbedForm) { + setTimeout(function() { + document.location.reload(); + }, 3000); + } + } + }, + }); +} + +/** + * Handle dynamic rendered form + */ +function catchDynamicRenderedForm() { + const forms = document.getElementsByTagName('form'); + + catchDynamicRenderedFormHandler(forms); + + const frames = document.getElementsByTagName('iframe'); + if ( frames.length > 0 ) { + for ( let j = 0; j < frames.length; j++ ) { + if ( frames[j].contentDocument == null ) { + continue; + } + + const iframeForms = frames[j].contentDocument.forms; + + if ( iframeForms.length === 0 ) { + return; + } + + catchDynamicRenderedFormHandler(iframeForms, frames[j].contentDocument); + } + } +} + +/** + * Handles dynamic rendered forms by attaching an onsubmit event handler to them. + * + * @param {HTMLCollection} forms - A collection of form elements to be processed. + * @param {Document} [documentObject=document] - The document object to use for querying elements. + */ +function catchDynamicRenderedFormHandler(forms, documentObject = document) { + const neededFormIds = []; + for (const form of forms) { + const formIdAttr = form.getAttribute('id'); + if (formIdAttr && formIdAttr.indexOf('hsForm') !== -1) { + neededFormIds.push(formIdAttr); + } + if (formIdAttr && formIdAttr.indexOf('createuser') !== -1 && + (form.classList !== undefined && form.classList.contains('ihc-form-create-edit')) + ) { + neededFormIds.push(formIdAttr); + } + } + + for (const formId of neededFormIds) { + const form = documentObject.getElementById(formId); + form.apbct_external_onsubmit_prev = form.onsubmit; + form.onsubmit = sendAjaxCheckingDynamicFormData; + } +} + +/** + * Sending Ajax for checking form data on dynamic rendered form + * @param {HTMLElement} form + */ +function sendAjaxCheckingDynamicFormData(form) { + form.preventDefault(); + form.stopImmediatePropagation(); + const formEvent = form; + form = form.target; + + const forceAction = document.createElement('input'); + forceAction.name = 'action'; + forceAction.value = 'cleantalk_force_ajax_check'; + forceAction.type = 'hidden'; + form.appendChild(forceAction); + + // Get visible fields and set cookie + const visibleFields = {}; + visibleFields[0] = apbct_collect_visible_fields(form); + apbct_visible_fields_set_cookie(visibleFields); + form.append(ctNoCookieConstructHiddenField('hidden')); + + const data = {}; + let elems = form.elements; + elems = Array.prototype.slice.call(elems); + + elems.forEach( function( elem, y ) { + if ( elem.name === '' ) { + data['input_' + y] = elem.value; + } else { + data[elem.name] = elem.value; + } + }); + + apbct_public_sendAJAX( + data, + { + async: false, + callback: function(result) { + if ( result.apbct === undefined || ! +result.apbct.blocked ) { + form.onsubmit = null; + + // Clear service fields + for (const el of form.querySelectorAll('input[name="apbct_visible_fields"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[value="cleantalk_force_ajax_check"]')) { + el.remove(); + } + for (const el of form.querySelectorAll('input[name="ct_no_cookie_hidden_field"]')) { + el.remove(); + } + + // Call previous submit action + if (form.apbct_external_onsubmit_prev instanceof Function) { + let timerId = setTimeout(function() { + form.apbct_external_onsubmit_prev.call(form, formEvent); + }, 500); + clearTimeout(timerId); + } + + const submButton = form.querySelector('input[type="submit"]'); + if (submButton) { + submButton.click(); + return; + } + } + + if (result.apbct !== undefined && +result.apbct.blocked) { + ctParseBlockMessage(result); + } + }, + }); +} + +/** + * Implement jQuery val() function + * @param {HTMLElement} el + * @return {HTMLElements} + */ +function apbctVal(el) { + if (el.options && el.multiple) { + return el.options + .filter((option) => option.selected) + .map((option) => option.value); + } else if (el.type === 'checkbox' || el.type === 'radio') { + return el.checked ? el.checked : null; + } else { + return el.value; + } +} + +/** + * Checks if a form object is inside a div with a specified class name. + * + * @param {HTMLElement} formObj - The form element to check. + * @param {string} divClassName - The class name of the div to look for. + * @return {boolean} - Returns true if the form is inside a div with the specified class name, false otherwise. + */ +function apbctIsFormInDiv(formObj, divClassName) { + let parent = formObj.parentElement; + while (parent) { + if (parent.classList.contains(divClassName)) { + return true; + } + parent = parent.parentElement; + } + return false; +} + +/** + * Check form as internal. + * @param {int} currForm Current form. + */ +function ctCheckInternal(currForm) { + // Gathering data + const ctData = {}; + const elems = currForm.elements; + let key; + + for (key in elems) { + if (elems[key].type !== 'submit' && + elems[key].value !== undefined && + elems[key].value !== '') { + ctData[elems[key].name] = currForm.elements[key].value; + } + } + ctData.action = 'ct_check_internal'; + + // AJAX Request + apbct_public_sendAJAX( + ctData, + { + url: ctPublicFunctions._ajax_url, + callback: function(data) { + if (data.success === true) { + currForm.origSubmit(); + } else { + alert(data.data); + return false; + } + }, + }, + ); +} + +document.addEventListener('DOMContentLoaded', function() { + if ( ! +ctPublic.settings__forms__check_internal ) { + return; + } + + setTimeout(() => { + ctProtectInternalForms(); + }, 500); + + document.addEventListener('apbctForceProtectionAllowed', function() { + ctProtectInternalForms(); + }); +}); + +/** + * Protect internal forms + * @return {void} + */ +function ctProtectInternalForms() { + let ctCurrAction = ''; + let ctCurrForm = ''; + + for ( let i = 0; i < document.forms.length; i++ ) { + if ( typeof(document.forms[i].action) == 'string' ) { + ctCurrForm = document.forms[i]; + ctCurrAction = ctCurrForm.action; + if ( + ctCurrAction.indexOf('https?://') !== null && // The protocol is obligatory + ctCurrAction.match(ctPublic.blog_home + '.*?\.php') !== null && // Main check + ! ctCheckInternalIsExcludedForm(ctCurrAction) // Exclude WordPress native scripts from processing + ) { + const formClone = ctCurrForm.cloneNode(true); + ctCurrForm.parentNode.replaceChild(formClone, ctCurrForm); + + formClone.origSubmit = ctCurrForm.submit; + formClone.submit = null; + + formClone.addEventListener('submit', function(event) { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + ctCheckInternal(event.target); + return false; + }); + } + } + } +} + +/** + * Check by action to exclude the form checking + * @param {string} action + * @return {boolean} + */ +function ctCheckInternalIsExcludedForm(action) { + // An array contains forms action need to be excluded. + const ctInternalScriptExclusions = [ + 'wp-login.php', // WordPress login page + 'wp-comments-post.php', // WordPress Comments Form + ]; + + return ctInternalScriptExclusions.some((item) => { + return action.match(new RegExp(ctPublic.blog_home + '.*' + item)) !== null; + }); +} diff --git a/js/src/apbct-public-bundle_int-protection.js b/js/src/apbct-public-bundle_int-protection.js index 877bbb10b..c1155c7d1 100644 --- a/js/src/apbct-public-bundle_int-protection.js +++ b/js/src/apbct-public-bundle_int-protection.js @@ -1,444 +1,3 @@ -/** - * @return {HTMLElement} event - */ -function apbctSetEmailDecoderPopupAnimation() { - const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; - const animationWrapper = document.createElement('div'); - animationWrapper.classList = 'apbct-ee-animation-wrapper'; - for (let i = 0; i < animationElements.length; i++) { - const apbctEEAnimationDogOne = document.createElement('span'); - apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; - apbctEEAnimationDogOne.innerText = '@'; - animationWrapper.append(apbctEEAnimationDogOne); - } - return animationWrapper; -} - -/** - * @param {mixed} event - */ -function ctFillDecodedEmailHandler(event = false) { - let clickSource = false; - let ctWlBrandname = ''; - let encodedEmail = ''; - if (typeof ctPublic !== 'undefined') { - this.removeEventListener('click', ctFillDecodedEmailHandler); - // remember clickSource - clickSource = this; - // globally remember if emails is mixed with mailto - ctPublic.encodedEmailNodesIsMixed = false; - ctWlBrandname = ctPublic.wl_brandname; - encodedEmail = ctPublic.encodedEmailNodes; - } else if (typeof ctAdminCommon !== 'undefined') { - ctWlBrandname = ctAdminCommon.plugin_name; - encodedEmail = ctAdminCommon.encodedEmailNode; - } - - // get fade - document.body.classList.add('apbct-popup-fade'); - // popup show - let encoderPopup = document.getElementById('apbct_popup'); - if (!encoderPopup) { - // construct popup - let waitingPopup = document.createElement('div'); - waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); - waitingPopup.setAttribute('id', 'apbct_popup'); - - // construct text header - let popupHeaderWrapper = document.createElement('span'); - popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; - let popupHeader = document.createElement('p'); - popupHeader.innerText = ctWlBrandname; - popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); - popupHeaderWrapper.append(popupHeader); - - // construct text wrapper - let popupTextWrapper = document.createElement('div'); - popupTextWrapper.setAttribute('id', 'apbct_popup_text'); - popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); - popupTextWrapper.style.color = 'black'; - - // construct text first node - // todo make translatable - let popupTextWaiting = document.createElement('p'); - popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; - } - popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); - - // construct text second node - // todo make translatable - let popupTextDecoding = document.createElement('p'); - popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { - popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; - } else { - popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; - } - - // appending - popupTextWrapper.append(popupTextWaiting); - popupTextWrapper.append(popupTextDecoding); - waitingPopup.append(popupHeaderWrapper); - waitingPopup.append(popupTextWrapper); - waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); - document.body.append(waitingPopup); - } else { - encoderPopup.setAttribute('style', 'display: inherit'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { - document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; - } else { - document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; - } - } - - apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); -} - -/** - * @param {mixed} event - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { - if (event && clickSource) { - // collect data - const javascriptClientData = getJavascriptClientData(); - let data = { - event_javascript_data: javascriptClientData, - post_url: document.location.href, - referrer: document.referrer, - encodedEmails: '', - }; - let encodedEmailsCollection = {}; - for (let i = 0; i < encodedEmailNodes.length; i++) { - // disable click for mailto - if ( - typeof encodedEmailNodes[i].href !== 'undefined' && - encodedEmailNodes[i].href.indexOf('mailto:') === 0 - ) { - event.preventDefault(); - ctPublic.encodedEmailNodesIsMixed = true; - } - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - apbct(encodedEmailNodes[i]).append(apbctTooltip); - - // collect encoded email strings - encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; - } - - // JSONify encoded email strings - data.encodedEmails = JSON.stringify(encodedEmailsCollection); - - // Using REST API handler - if ( ctPublicFunctions.data__ajax_type === 'rest' ) { - apbct_public_sendREST( - 'apbct_decode_email', - { - data: data, - method: 'POST', - callback: function(result) { - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - - // Using AJAX request and handler - } else { - data.action = 'apbct_decode_email'; - apbct_public_sendAJAX( - data, - { - notJson: false, - callback: function(result) { - console.log('result'); - console.log(result); - - // set alternative cookie to skip next pages encoding - ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); - }, - onErrorCallback: function(res) { - resetEncodedNodes(); - ctShowDecodeComment(res); - }, - }, - ); - } - } else { - const encodedEmail = encodedEmailNodes.dataset.originalString; - let data = { - encodedEmails: JSON.stringify({0: encodedEmail}), - }; - - // Adding a tooltip - let apbctTooltip = document.createElement('div'); - apbctTooltip.setAttribute('class', 'apbct-tooltip'); - encodedEmailNodes.appendChild(apbctTooltip); - - apbct_admin_sendAJAX( - { - 'action': 'apbct_decode_email', - 'encodedEmails': data.encodedEmails, - }, - { - 'callback': function(result) { - apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); - }, - 'notJson': true, - }, - ); - } -} - -/** - * @param {mixed} result - * @param {mixed} encodedEmailNodes - * @param {mixed} clickSource - */ -function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { - if (result.success && result.data[0].is_allowed === true) { - // start process of visual decoding - setTimeout(function() { - // popup remove - let popup = document.getElementById('apbct_popup'); - if (popup !== null) { - let email = ''; - if (clickSource) { - let currentResultData; - result.data.forEach((row) => { - if (row.encoded_email === clickSource.dataset.originalString) { - currentResultData = row; - } - }); - - email = currentResultData.decoded_email.split(/[&?]/)[0]; - } else { - email = result.data[0].decoded_email; - } - // handle first node - let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); - // get email selectable by click - let selectableEmail = document.createElement('b'); - selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); - selectableEmail.innerText = email; - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { - selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; - } else { - selectableEmail.title = ctAdminCommon.text__ee_click_to_select; - } - // add email to the first node - if (firstNode) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { - firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } else { - firstNode.innerHTML = ctAdminCommon.text__ee_original_email + - ' ' + selectableEmail.outerHTML; - } - - firstNode.setAttribute('style', 'flex-direction: row;'); - } - // remove animation - let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); - if (wrapper) { - wrapper.remove(); - } - // remove second node - let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); - if (secondNode) { - secondNode.remove(); - } - // add button - let buttonWrapper = document.createElement('span'); - buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; - if (!document.querySelector('.apbct-email-encoder-got-it-button')) { - let button = document.createElement('button'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { - button.innerText = ctPublicFunctions.text__ee_got_it; - } else { - button.innerText = ctAdminCommon.text__ee_got_it; - } - button.classList = 'apbct-email-encoder-got-it-button'; - button.addEventListener('click', function() { - document.body.classList.remove('apbct-popup-fade'); - popup.setAttribute('style', 'display:none'); - fillDecodedNodes(encodedEmailNodes, result); - // click on mailto if so - if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { - clickSource.click(); - } - }); - buttonWrapper.append(button); - popup.append(buttonWrapper); - } - } - }, 3000); - } else { - if (clickSource) { - if (result.success) { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { - ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); - } - } else { - resetEncodedNodes(); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { - ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); - } else { - ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); - } - } - } else { - console.log('result', result); - } - } -} - -/** - * Reset click event for encoded email - */ -function resetEncodedNodes() { - if (typeof ctPublic.encodedEmailNodes !== 'undefined') { - ctPublic.encodedEmailNodes.forEach(function(element) { - element.addEventListener('click', ctFillDecodedEmailHandler); - }); - } -} - -/** - * Show Decode Comment - * @param {string} comment - */ -function ctShowDecodeComment(comment) { - if ( ! comment ) { - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { - comment = ctPublicFunctions.text__ee_cannot_decode; - } else { - comment = ctAdminCommon.text__ee_cannot_decode; - } - } - - let popup = document.getElementById('apbct_popup'); - let popupText = document.getElementById('apbct_popup_text'); - if (popup !== null) { - document.body.classList.remove('apbct-popup-fade'); - if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { - popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; - } else { - popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; - } - setTimeout(function() { - popup.setAttribute('style', 'display:none'); - }, 3000); - } -} - -/** - * Run filling for every node with decoding result. - * @param {mixed} encodedNodes - * @param {mixed} decodingResult - */ -function fillDecodedNodes(encodedNodes, decodingResult) { - if (encodedNodes.length > 0) { - for (let i = 0; i < encodedNodes.length; i++) { - // chek what is what - let currentResultData; - decodingResult.data.forEach((row) => { - if (row.encoded_email === encodedNodes[i].dataset.originalString) { - currentResultData = row; - } - }); - // quit case on cloud block - if (currentResultData.is_allowed === false) { - return; - } - // handler for mailto - if ( - typeof encodedNodes[i].href !== 'undefined' && - ( - encodedNodes[i].href.indexOf('mailto:') === 0 || - encodedNodes[i].href.indexOf('tel:') === 0 - ) - ) { - let linkTypePrefix; - if (encodedNodes[i].href.indexOf('mailto:') === 0) { - linkTypePrefix = 'mailto:'; - } else if (encodedNodes[i].href.indexOf('tel:') === 0) { - linkTypePrefix = 'tel:'; - } else { - continue; - } - let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); - let baseElementContent = encodedNodes[i].innerHTML; - encodedNodes[i].innerHTML = baseElementContent.replace( - encodedEmail, - currentResultData.decoded_email, - ); - encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; - - encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { - let encodedEmailTextInsideMailto = ''; - decodingResult.data.forEach((row) => { - if (row.encoded_email === el.dataset.originalString) { - encodedEmailTextInsideMailto = row.decoded_email; - } - }); - el.innerHTML = encodedEmailTextInsideMailto; - }); - } else { - encodedNodes[i].classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); - }, 2000); - } - // remove listeners - encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); - } - } else { - let currentResultData = decodingResult.data[0]; - encodedNodes.classList.add('no-blur'); - // fill the nodes - setTimeout(() => { - ctProcessDecodedDataResult(currentResultData, encodedNodes); - }, 2000); - encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); - } -} - -/** - * @param {mixed} response - * @param {mixed} targetElement - */ -function ctProcessDecodedDataResult(response, targetElement) { - targetElement.setAttribute('title', ''); - targetElement.removeAttribute('style'); - ctFillDecodedEmail(targetElement, response.decoded_email); -} - -/** - * @param {mixed} target - * @param {string} email - */ -function ctFillDecodedEmail(target, email) { - target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); -} - /** * Base class */ diff --git a/js/src/apbct-public-bundle_int-protection_comm-func.js b/js/src/apbct-public-bundle_int-protection_comm-func.js new file mode 100644 index 000000000..877bbb10b --- /dev/null +++ b/js/src/apbct-public-bundle_int-protection_comm-func.js @@ -0,0 +1,4795 @@ +/** + * @return {HTMLElement} event + */ +function apbctSetEmailDecoderPopupAnimation() { + const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; + const animationWrapper = document.createElement('div'); + animationWrapper.classList = 'apbct-ee-animation-wrapper'; + for (let i = 0; i < animationElements.length; i++) { + const apbctEEAnimationDogOne = document.createElement('span'); + apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; + apbctEEAnimationDogOne.innerText = '@'; + animationWrapper.append(apbctEEAnimationDogOne); + } + return animationWrapper; +} + +/** + * @param {mixed} event + */ +function ctFillDecodedEmailHandler(event = false) { + let clickSource = false; + let ctWlBrandname = ''; + let encodedEmail = ''; + if (typeof ctPublic !== 'undefined') { + this.removeEventListener('click', ctFillDecodedEmailHandler); + // remember clickSource + clickSource = this; + // globally remember if emails is mixed with mailto + ctPublic.encodedEmailNodesIsMixed = false; + ctWlBrandname = ctPublic.wl_brandname; + encodedEmail = ctPublic.encodedEmailNodes; + } else if (typeof ctAdminCommon !== 'undefined') { + ctWlBrandname = ctAdminCommon.plugin_name; + encodedEmail = ctAdminCommon.encodedEmailNode; + } + + // get fade + document.body.classList.add('apbct-popup-fade'); + // popup show + let encoderPopup = document.getElementById('apbct_popup'); + if (!encoderPopup) { + // construct popup + let waitingPopup = document.createElement('div'); + waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); + waitingPopup.setAttribute('id', 'apbct_popup'); + + // construct text header + let popupHeaderWrapper = document.createElement('span'); + popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; + let popupHeader = document.createElement('p'); + popupHeader.innerText = ctWlBrandname; + popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); + popupHeaderWrapper.append(popupHeader); + + // construct text wrapper + let popupTextWrapper = document.createElement('div'); + popupTextWrapper.setAttribute('id', 'apbct_popup_text'); + popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center'); + popupTextWrapper.style.color = 'black'; + + // construct text first node + // todo make translatable + let popupTextWaiting = document.createElement('p'); + popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding; + } + popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center'); + + // construct text second node + // todo make translatable + let popupTextDecoding = document.createElement('p'); + popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second'; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) { + popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process; + } else { + popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process; + } + + // appending + popupTextWrapper.append(popupTextWaiting); + popupTextWrapper.append(popupTextDecoding); + waitingPopup.append(popupHeaderWrapper); + waitingPopup.append(popupTextWrapper); + waitingPopup.append(apbctSetEmailDecoderPopupAnimation()); + document.body.append(waitingPopup); + } else { + encoderPopup.setAttribute('style', 'display: inherit'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) { + document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding; + } else { + document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding; + } + } + + apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource); +} + +/** + * @param {mixed} event + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { + if (event && clickSource) { + // collect data + const javascriptClientData = getJavascriptClientData(); + let data = { + event_javascript_data: javascriptClientData, + post_url: document.location.href, + referrer: document.referrer, + encodedEmails: '', + }; + let encodedEmailsCollection = {}; + for (let i = 0; i < encodedEmailNodes.length; i++) { + // disable click for mailto + if ( + typeof encodedEmailNodes[i].href !== 'undefined' && + encodedEmailNodes[i].href.indexOf('mailto:') === 0 + ) { + event.preventDefault(); + ctPublic.encodedEmailNodesIsMixed = true; + } + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + apbct(encodedEmailNodes[i]).append(apbctTooltip); + + // collect encoded email strings + encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString; + } + + // JSONify encoded email strings + data.encodedEmails = JSON.stringify(encodedEmailsCollection); + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_decode_email', + { + data: data, + method: 'POST', + callback: function(result) { + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + + // Using AJAX request and handler + } else { + data.action = 'apbct_decode_email'; + apbct_public_sendAJAX( + data, + { + notJson: false, + callback: function(result) { + console.log('result'); + console.log(result); + + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + }, + }, + ); + } + } else { + const encodedEmail = encodedEmailNodes.dataset.originalString; + let data = { + encodedEmails: JSON.stringify({0: encodedEmail}), + }; + + // Adding a tooltip + let apbctTooltip = document.createElement('div'); + apbctTooltip.setAttribute('class', 'apbct-tooltip'); + encodedEmailNodes.appendChild(apbctTooltip); + + apbct_admin_sendAJAX( + { + 'action': 'apbct_decode_email', + 'encodedEmails': data.encodedEmails, + }, + { + 'callback': function(result) { + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); + }, + 'notJson': true, + }, + ); + } +} + +/** + * @param {mixed} result + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) { + if (result.success && result.data[0].is_allowed === true) { + // start process of visual decoding + setTimeout(function() { + // popup remove + let popup = document.getElementById('apbct_popup'); + if (popup !== null) { + let email = ''; + if (clickSource) { + let currentResultData; + result.data.forEach((row) => { + if (row.encoded_email === clickSource.dataset.originalString) { + currentResultData = row; + } + }); + + email = currentResultData.decoded_email.split(/[&?]/)[0]; + } else { + email = result.data[0].decoded_email; + } + // handle first node + let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); + // get email selectable by click + let selectableEmail = document.createElement('b'); + selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email'); + selectableEmail.innerText = email; + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) { + selectableEmail.title = ctPublicFunctions.text__ee_click_to_select; + } else { + selectableEmail.title = ctAdminCommon.text__ee_click_to_select; + } + // add email to the first node + if (firstNode) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) { + firstNode.innerHTML = ctPublicFunctions.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } else { + firstNode.innerHTML = ctAdminCommon.text__ee_original_email + + ' ' + selectableEmail.outerHTML; + } + + firstNode.setAttribute('style', 'flex-direction: row;'); + } + // remove animation + let wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); + if (wrapper) { + wrapper.remove(); + } + // remove second node + let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); + if (secondNode) { + secondNode.remove(); + } + // add button + let buttonWrapper = document.createElement('span'); + buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; + if (!document.querySelector('.apbct-email-encoder-got-it-button')) { + let button = document.createElement('button'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) { + button.innerText = ctPublicFunctions.text__ee_got_it; + } else { + button.innerText = ctAdminCommon.text__ee_got_it; + } + button.classList = 'apbct-email-encoder-got-it-button'; + button.addEventListener('click', function() { + document.body.classList.remove('apbct-popup-fade'); + popup.setAttribute('style', 'display:none'); + fillDecodedNodes(encodedEmailNodes, result); + // click on mailto if so + if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) { + clickSource.click(); + } + }); + buttonWrapper.append(button); + popup.append(buttonWrapper); + } + } + }, 3000); + } else { + if (clickSource) { + if (result.success) { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) { + ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + result.data[0].comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + result.data[0].comment); + } + } else { + resetEncodedNodes(); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) { + ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + result.apbct.comment); + } else { + ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + result.data[0].comment); + } + } + } else { + console.log('result', result); + } + } +} + +/** + * Reset click event for encoded email + */ +function resetEncodedNodes() { + if (typeof ctPublic.encodedEmailNodes !== 'undefined') { + ctPublic.encodedEmailNodes.forEach(function(element) { + element.addEventListener('click', ctFillDecodedEmailHandler); + }); + } +} + +/** + * Show Decode Comment + * @param {string} comment + */ +function ctShowDecodeComment(comment) { + if ( ! comment ) { + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) { + comment = ctPublicFunctions.text__ee_cannot_decode; + } else { + comment = ctAdminCommon.text__ee_cannot_decode; + } + } + + let popup = document.getElementById('apbct_popup'); + let popupText = document.getElementById('apbct_popup_text'); + if (popup !== null) { + document.body.classList.remove('apbct-popup-fade'); + if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) { + popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment; + } else { + popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment; + } + setTimeout(function() { + popup.setAttribute('style', 'display:none'); + }, 3000); + } +} + +/** + * Run filling for every node with decoding result. + * @param {mixed} encodedNodes + * @param {mixed} decodingResult + */ +function fillDecodedNodes(encodedNodes, decodingResult) { + if (encodedNodes.length > 0) { + for (let i = 0; i < encodedNodes.length; i++) { + // chek what is what + let currentResultData; + decodingResult.data.forEach((row) => { + if (row.encoded_email === encodedNodes[i].dataset.originalString) { + currentResultData = row; + } + }); + // quit case on cloud block + if (currentResultData.is_allowed === false) { + return; + } + // handler for mailto + if ( + typeof encodedNodes[i].href !== 'undefined' && + ( + encodedNodes[i].href.indexOf('mailto:') === 0 || + encodedNodes[i].href.indexOf('tel:') === 0 + ) + ) { + let linkTypePrefix; + if (encodedNodes[i].href.indexOf('mailto:') === 0) { + linkTypePrefix = 'mailto:'; + } else if (encodedNodes[i].href.indexOf('tel:') === 0) { + linkTypePrefix = 'tel:'; + } else { + continue; + } + let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); + let baseElementContent = encodedNodes[i].innerHTML; + encodedNodes[i].innerHTML = baseElementContent.replace( + encodedEmail, + currentResultData.decoded_email, + ); + encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email; + + encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => { + let encodedEmailTextInsideMailto = ''; + decodingResult.data.forEach((row) => { + if (row.encoded_email === el.dataset.originalString) { + encodedEmailTextInsideMailto = row.decoded_email; + } + }); + el.innerHTML = encodedEmailTextInsideMailto; + }); + } else { + encodedNodes[i].classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); + }, 2000); + } + // remove listeners + encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); + } + } else { + let currentResultData = decodingResult.data[0]; + encodedNodes.classList.add('no-blur'); + // fill the nodes + setTimeout(() => { + ctProcessDecodedDataResult(currentResultData, encodedNodes); + }, 2000); + encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler); + } +} + +/** + * @param {mixed} response + * @param {mixed} targetElement + */ +function ctProcessDecodedDataResult(response, targetElement) { + targetElement.setAttribute('title', ''); + targetElement.removeAttribute('style'); + ctFillDecodedEmail(targetElement, response.decoded_email); +} + +/** + * @param {mixed} target + * @param {string} email + */ +function ctFillDecodedEmail(target, email) { + target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1'); +} + +/** + * Base class + */ +class ApbctCore { + ajax_parameters = {}; + restParameters = {}; + + selector = null; + elements = []; + + // Event properties + eventCallback; + eventSelector; + event; + + /** + * Default constructor + * @param {string} selector + */ + constructor(selector) { + this.select(selector); + } + + /** + * Get elements by CSS selector + * + * @param {string} selector + * @return {*} + */ + select(selector) { + if (selector instanceof HTMLCollection) { + this.selector = null; + this.elements = []; + this.elements = Array.prototype.slice.call(selector); + } else if ( typeof selector === 'object' ) { + this.selector = null; + this.elements = []; + this.elements[0] = selector; + } else if ( typeof selector === 'string' ) { + this.selector = selector; + this.elements = Array.prototype.slice.call(document.querySelectorAll(selector)); + // this.elements = document.querySelectorAll(selector)[0]; + } else { + this.deselect(); + } + + return this; + } + + /** + * @param {object|string} elemToAdd + */ + addElement(elemToAdd) { + if ( typeof elemToAdd === 'object' ) { + this.elements.push(elemToAdd); + } else if ( typeof elemToAdd === 'string' ) { + this.selector = elemToAdd; + this.elements = Array.prototype.slice.call(document.querySelectorAll(elemToAdd)); + } else { + this.deselect(); + } + } + + /** + * @param {object} elem + */ + push(elem) { + this.elements.push(elem); + } + + /** + * reduce + */ + reduce() { + this.elements = this.elements.slice(0, -1); + } + + /** + * deselect + */ + deselect() { + this.elements = []; + } + + /** + * Set or get CSS for/of currently selected element + * + * @param {object|string} style + * @param {boolean} getRaw + * + * @return {boolean|*} + */ + css(style, getRaw) { + getRaw = getRaw || false; + + // Set style + if (typeof style === 'object') { + const stringToCamelCase = (str) => + str.replace(/([-_][a-z])/g, (group) => + group + .toUpperCase() + .replace('-', '') + .replace('_', ''), + ); + + // Apply multiple styles + for (const styleName in style) { + if (Object.hasOwn(style, styleName)) { + const DomStyleName = stringToCamelCase(styleName); + + // Apply to multiple elements (currently selected) + for (let i=0; i= 0; i-- ) { + if ( ! this.isElem(this.elements[i], filter) ) { + this.elements.splice(Number(i), 1); + } + } + + return this; + } + + /** + * NODES + */ + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parent(filter) { + this.select(this.elements[0].parentElement); + + if ( typeof filter !== 'undefined' && ! this.is(filter) ) { + this.deselect(); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + parents(filter) { + this.select(this.elements[0]); + + for ( ; this.elements[this.elements.length - 1].parentElement !== null; ) { + this.push(this.elements[this.elements.length - 1].parentElement); + } + + this.elements.splice(0, 1); // Deleting initial element from the set + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + children(filter) { + this.select(this.elements[0].children); + + if ( typeof filter !== 'undefined' ) { + this.filter(filter); + } + + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + siblings(filter) { + let current = this.elements[0]; // Remember current to delete it later + + this.parent(); + this.children(filter); + this.elements.splice(this.elements.indexOf(current), 1); // Remove current element + + return this; + } + + /** ************ DOM MANIPULATIONS **************/ + remove() { + for (let elem of this.elements) { + elem.remove(); + } + } + + /** + * @param {string} content + */ + after(content) { + for (let elem of this.elements) { + elem.after(content); + } + } + + /** + * @param {string} content + */ + append(content) { + for (let elem of this.elements) { + elem.append(content); + } + } + + /** ************ ANIMATION **************/ + /** + * @param {number} time + */ + fadeIn(time) { + for (let elem of this.elements) { + elem.style.opacity = 0; + elem.style.display = 'block'; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity + (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity < 1) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } + }; + + tick(); + } + } + + /** + * @param {number} time + */ + fadeOut(time) { + for (let elem of this.elements) { + elem.style.opacity = 1; + + let last = +new Date(); + const tick = function() { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / time; + last = +new Date(); + + if (+elem.style.opacity > 0) { + (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); + } else { + elem.style.display = 'none'; + } + }; + + tick(); + } + } +} + +/** + * Hack + * + * Make a proxy to keep both properties and methods from: + * - the native object and + * - the new one from ApbctCore for selected element. + * + * For example: + * apbct('#id).innerHTML = 'some'; + * apbct('#id).css({'backgorund-color': 'black'}); + */ +// apbct = new Proxy( +// apbct, +// { +// get(target, prop) { +// if (target.elements.length) { +// return target.elements[0][prop]; +// } else { +// return null; +// } +// }, +// set(target, prop, value){ +// if (target.elements.length) { +// target.elements[0][prop] = value; +// return true; +// } else { +// return false; +// } +// }, +// apply(target, thisArg, argArray) { +// +// } +// } +// ); + +/** + * @param {mixed} msg + * @param {string} url + */ +function ctProcessError(msg, url) { + let log = {}; + if (msg && msg.message) { + log.err = { + 'msg': msg.message, + 'file': !!msg.fileName ? msg.fileName : false, + 'ln': !!msg.lineNumber ? msg.lineNumber : !!lineNo ? lineNo : false, + 'col': !!msg.columnNumber ? msg.columnNumber : !!columnNo ? columnNo : false, + 'stacktrace': !!msg.stack ? msg.stack : false, + 'cause': !!url ? JSON.stringify(url) : false, + 'errorObj': !!error ? error : false, + }; + } else { + log.err = { + 'msg': msg, + }; + + if (!!url) { + log.err.file = url; + } + } + + log.url = window.location.href; + log.userAgent = window.navigator.userAgent; + + let ctJsErrors = 'ct_js_errors'; + let errArray = localStorage.getItem(ctJsErrors); + if (errArray === null) errArray = '[]'; + errArray = JSON.parse(errArray); + for (let i = 0; i < errArray.length; i++) { + if (errArray[i].err.msg === log.err.msg) { + return; + } + } + + errArray.push(log); + localStorage.setItem(ctJsErrors, JSON.stringify(errArray)); +} + +if (Math.floor(Math.random() * 100) === 1) { + window.onerror = function(exception, url) { + let filterWords = ['apbct', 'ctPublic']; + let length = filterWords.length; + while (length--) { + if (exception.indexOf(filterWords[length]) !== -1) { + ctProcessError(exception, url); + } + } + + return false; + }; +} + +/** + * Select actual WP nonce depending on the ajax type and the fresh nonce provided. + * @return {string} url + */ +function selectActualNonce() { + let defaultNonce = ''; + // return fresh nonce immediately if persists + if ( + ctPublicFunctions.hasOwnProperty('_fresh_nonce') && + typeof ctPublicFunctions._fresh_nonce === 'string' && + ctPublicFunctions._fresh_nonce.length > 0 + ) { + return ctPublicFunctions._fresh_nonce; + } + // select from default rest/ajax nonces + if ( + ctPublicFunctions.data__ajax_type === 'admin_ajax' && + ctPublicFunctions.hasOwnProperty('_ajax_nonce') && + typeof ctPublicFunctions._ajax_nonce === 'string' && + ctPublicFunctions._ajax_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._ajax_nonce; + } + if ( + ctPublicFunctions.data__ajax_type === 'rest' && + ctPublicFunctions.hasOwnProperty('_rest_nonce') && + typeof ctPublicFunctions._rest_nonce === 'string' && + ctPublicFunctions._rest_nonce.length > 0 + ) { + defaultNonce = ctPublicFunctions._rest_nonce; + } + + return defaultNonce; +} + +/** + * Enter point to ApbctCore class + * + * @param {array|object} params + * @return {*} + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +function apbct(params) { + return new ApbctCore() + .select(params); +} + +/** + * ApbctXhr + */ +class ApbctXhr { + xhr = new XMLHttpRequest(); + + // Base parameters + method = 'POST'; // HTTP-request type + url = ''; // URL to send the request + async = true; + user = null; // HTTP-authorization username + password = null; // HTTP-authorization password + data = {}; // Data to send + + // Optional params + button = null; // Button that should be disabled when request is performing + spinner = null; // Spinner that should appear when request is in process + progressbar = null; // Progress bar for the current request + context = this; // Context + callback = null; + onErrorCallback = null; + + responseType = 'json'; // Expected data type from server + headers = {}; + timeout = 15000; // Request timeout in milliseconds + + methods_to_convert_data_to_URL = [ + 'GET', + 'HEAD', + ]; + + body = null; + http_code = 0; + status_text = ''; + + // eslint-disable-next-line require-jsdoc + constructor(parameters) { + // Set class properties + for ( let key in parameters ) { + if ( typeof this[key] !== 'undefined' ) { + this[key] = parameters[key]; + } + } + + // Modifying DOM-elements + this.prepare(); + + // Modify URL with data for GET and HEAD requests + if ( Object.keys(this.data).length ) { + this.deleteDoubleJSONEncoding(this.data); + this.convertData(); + } + + if ( ! this.url ) { + console.log('%cXHR%c not URL provided', + 'color: red; font-weight: bold;', 'color: grey; font-weight: normal;'); + return false; + } + + // Configure the request + this.xhr.open(this.method, this.url, this.async, this.user, this.password); + this.setHeaders(); + + this.xhr.responseType = this.responseType; + this.xhr.timeout = this.timeout; + + /* EVENTS */ + // Monitoring status + this.xhr.onreadystatechange = function() { + if (this.isWpNonceError()) { + this.getFreshNonceAndRerunXHR(parameters); + return; + } + this.onReadyStateChange(); + }.bind(this); + + // Run callback + this.xhr.onload = function() { + this.onLoad(); + }.bind(this); + + // On progress + this.xhr.onprogress = function(event) { + this.onProgress(event); + }.bind(this); + + // On error + this.xhr.onerror = function() { + this.onError(); + }.bind(this); + + this.xhr.ontimeout = function() { + this.onTimeout(); + }.bind(this); + + // Send the request + this.xhr.send(this.body); + } + + /** + * prepare + */ + prepare() { + // Disable button + if (this.button) { + this.button.setAttribute('disabled', 'disabled'); + this.button.style.cursor = 'not-allowed'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'inline'; + } + } + + /** + * complete + */ + complete() { + this.http_code = this.xhr.status; + this.status_text = this.xhr.statusText; + + // Disable button + if (this.button) { + this.button.removeAttribute('disabled'); + this.button.style.cursor = 'auto'; + } + + // Enable spinner + if (this.spinner) { + this.spinner.style.display = 'none'; + } + + if ( this.progressbar ) { + this.progressbar.fadeOut('slow'); + } + } + + /** + * onReadyStateChange + */ + onReadyStateChange() { + if (this.on_ready_state_change !== null && typeof this.on_ready_state_change === 'function') { + this.on_ready_state_change(); + } + } + + /** + * @param {object} event + */ + onProgress(event) { + if (this.on_progress !== null && typeof this.on_progress === 'function') { + this.on_progress(); + } + } + + /** + * onError + */ + onError() { + console.log('error'); + + this.complete(); + this.error( + this.http_code, + this.status_text, + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * onTimeout + */ + onTimeout() { + this.complete(); + this.error( + 0, + 'timeout', + ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback('Timeout'); + } + } + + /** + * @return {boolean} + */ + onLoad() { + this.complete(); + + if (this.responseType === 'json' ) { + if (this.xhr.response === null) { + this.error(this.http_code, this.status_text, 'No response'); + return false; + } else if ( typeof this.xhr.response.error !== 'undefined') { + this.error(this.http_code, this.status_text, this.xhr.response.error); + return false; + } + } + + if (this.callback !== null && typeof this.callback === 'function') { + this.callback.call(this.context, this.xhr.response, this.data); + } + } + + /** + * Check if 403 code of WP nonce error + * @return {bool} + */ + isWpNonceError() { + let restErrror = false; + let ajaxErrror = false; + // check rest error + if (this.xhr.readyState == 4) { + restErrror = ( + typeof this.xhr.response === 'object' && this.xhr.response !== null && + this.xhr.response.hasOwnProperty('data') && + this.xhr.response.data.hasOwnProperty('status') && + this.xhr.response.data.status === 403 + ); + ajaxErrror = this.xhr.response === '-1' && this.xhr.status === 403; + } + // todo check AJAX error + return restErrror || ajaxErrror; + } + + /** + * Get the fresh nonce and rerun the initial XHR with params + * @param {[]} initialRequestParams + */ + getFreshNonceAndRerunXHR(initialRequestParams) { + let noncePrev = ''; + + // Check if initialRequestParams['headers']['X-WP-Nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('headers') && + initialRequestParams.headers.hasOwnProperty('X-WP-Nonce') + ) { + noncePrev = initialRequestParams['headers']['X-WP-Nonce']; + } + + // Check if initialRequestParams['data']['_ajax_nonce'] exists. + if ( + initialRequestParams.hasOwnProperty('data') && + initialRequestParams.data.hasOwnProperty('_ajax_nonce') + ) { + noncePrev = initialRequestParams['data']['_ajax_nonce']; + } + + // Nonce is not provided. Exit. + if ( noncePrev === '' ) { + return; + } + + // prepare params for refreshing nonce + let params = {}; + params.method = 'POST'; + params.data = { + 'spbc_remote_call_action': 'get_fresh_wpnonce', + 'plugin_name': 'antispam', + 'nonce_prev': noncePrev, + 'initial_request_params': initialRequestParams, + }; + params.notJson = true; + params.url = ctPublicFunctions.host_url; + // this callback will rerun the XHR with initial params + params.callback = function(...args) { + // the refresh result itself + let freshNonceResult = args[0]; + let newRequestParams = false; + // provided initial params + if (args[1] !== undefined && args[1].hasOwnProperty('initial_request_params')) { + newRequestParams = args[1].initial_request_params; + } + if (newRequestParams && freshNonceResult.hasOwnProperty('wpnonce')) { + ctPublicFunctions._fresh_nonce = freshNonceResult.wpnonce; + if (ctPublicFunctions.data__ajax_type === 'rest') { + new ApbctCore().rest(newRequestParams); + } else { + new ApbctCore().ajax(newRequestParams); + } + } + }; + // run the nonce refreshing call + new ApbctXhr(params); + } + + /** + * @param {number} httpCode + * @param {string} statusText + * @param {string} additionalMsg + */ + error(httpCode, statusText, additionalMsg) { + let errorString = ''; + + if ( statusText === 'timeout' ) { + errorString += 'Server response timeout'; + } else if ( httpCode === 200 ) { + if ( statusText === 'parsererror' ) { + errorString += 'Unexpected response from server. See console for details.'; + } else { + errorString += 'Unexpected error. Status: ' + statusText + '.'; + if ( typeof additionalMsg !== 'undefined' ) { + errorString += ' Additional error info: ' + additionalMsg; + } + } + } else if (httpCode === 500) { + errorString += 'Internal server error.'; + } else { + errorString += 'Unexpected response code:' + httpCode; + } + + this.errorOutput( errorString ); + + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback(this.status_text); + } + } + + /** + * @param {string} errorMsg + */ + errorOutput(errorMsg) { + console.log( '%c ctXHR error: %c' + errorMsg, 'color: red;', 'color: grey;' ); + } + + /** + * setHeaders + */ + setHeaders() { + // Set headers if passed + for ( let headerName in this.headers ) { + if ( typeof this.headers[headerName] !== 'undefined' ) { + this.xhr.setRequestHeader(headerName, this.headers[headerName]); + } + } + } + + /** + * @return {string|*} + */ + convertData() { + // GET, HEAD request-type + if ( ~this.methods_to_convert_data_to_URL.indexOf( this.method ) ) { + return this.convertDataToURL(); + + // POST request-type + } else { + return this.convertDataToBody(); + } + } + + /** + * @return {string} + */ + convertDataToURL() { + let paramsAppendix = new URLSearchParams(this.data).toString(); + let paramsPrefix = this.url.match(/^(https?:\/{2})?[a-z0-9.]+\?/) ? '&' : '?'; + this.url += paramsPrefix + paramsAppendix; + + return this.url; + } + + /** + * @return {null} + */ + convertDataToBody() { + this.body = new FormData(); + for (let dataKey in this.data) { + if (Object.hasOwn(this.data, dataKey)) { + this.body.append( + dataKey, + typeof this.data[dataKey] === 'object' ? + JSON.stringify(this.data[dataKey]) : + this.data[dataKey], + ); + } + } + + return this.body; + } + + /** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {object} object + * @return {*} + */ + deleteDoubleJSONEncoding(object) { + if ( typeof object === 'object') { + for (let objectKey in object) { + if (Object.hasOwn(object, objectKey)) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = this.deleteDoubleJSONEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + let parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + } + + return object; + } +} +// eslint-disable-next-line require-jsdoc +class ApbctAjax extends ApbctXhr { + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + args.data._ajax_nonce = selectActualNonce(); + super(args); + } +} +// eslint-disable-next-line require-jsdoc +class ApbctRest extends ApbctXhr { + static default_route = ctPublicFunctions._rest_url + 'cleantalk-antispam/v1/'; + route = ''; + + // eslint-disable-next-line require-jsdoc + constructor(...args) { + args = args[0]; + const nonce = selectActualNonce(); + args.url = ApbctRest.default_route + args.route; + args.headers = { + 'X-WP-Nonce': nonce, + }; + super(args); + } +} + +// add hasOwn +if (!Object.prototype.hasOwn) { + Object.defineProperty(Object.prototype, 'hasOwn', { // eslint-disable-line + value: function(property) { + return Object.prototype.hasOwnProperty.call(this, property); + }, + enumerable: false, + configurable: true, + writable: true, + }); +} + +/** + * Class collecting user activity data + * + */ +// eslint-disable-next-line no-unused-vars, require-jsdoc +class ApbctCollectingUserActivity { + elementBody = document.querySelector('body'); + collectionForms = document.forms; + /** + * Constructor + */ + constructor() { + this.setListeners(); + } + + /** + * Set listeners + */ + setListeners() { + this.elementBody.addEventListener('click', (event) => { + this.checkElementInForms(event, 'addClicks'); + }); + + this.elementBody.addEventListener('mouseup', (event) => { + const selectedType = document.getSelection().type.toString(); + if (selectedType == 'Range') { + this.addSelected(); + } + }); + + this.elementBody.addEventListener('mousemove', (event) => { + this.checkElementInForms(event, 'trackMouseMovement'); + }); + } + + /** + * Checking if there is an element in the form + * @param {object} event + * @param {string} addTarget + */ + checkElementInForms(event, addTarget) { + let resultCheck; + for (let i = 0; i < this.collectionForms.length; i++) { + if ( + event.target.outerHTML.length > 0 && + this.collectionForms[i].innerHTML.length > 0 + ) { + resultCheck = this.collectionForms[i].innerHTML.indexOf(event.target.outerHTML); + } else { + resultCheck = -1; + } + } + + switch (addTarget) { + case 'addClicks': + if (resultCheck < 0) { + this.addClicks(); + } + break; + case 'trackMouseMovement': + if (resultCheck > -1) { + this.trackMouseMovement(); + } + break; + default: + break; + } + } + + /** + * Add clicks + */ + addClicks() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.clicks) { + document.ctCollectingUserActivityData.clicks++; + } else { + document.ctCollectingUserActivityData.clicks = 1; + } + return; + } + + document.ctCollectingUserActivityData = {clicks: 1}; + } + + /** + * Add selected + */ + addSelected() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.selected) { + document.ctCollectingUserActivityData.selected++; + } else { + document.ctCollectingUserActivityData.selected = 1; + } + return; + } + + document.ctCollectingUserActivityData = {selected: 1}; + } + + /** + * Track mouse movement + */ + trackMouseMovement() { + if (!document.ctCollectingUserActivityData) { + document.ctCollectingUserActivityData = {}; + } + if (!document.ctCollectingUserActivityData.mouseMovementsInsideForm) { + document.ctCollectingUserActivityData.mouseMovementsInsideForm = false; + } + + document.ctCollectingUserActivityData.mouseMovementsInsideForm = true; + } +} + +/** + * @param {object|array|string} cookies + * @param {object|array|string} value + * @param {string|number} expires + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetCookie( cookies, value, expires ) { + let listOfCookieNamesToForceAlt = [ + 'ct_sfw_pass_key', + 'ct_sfw_passed', + 'wordpress_apbct_antibot', + 'apbct_anticrawler_passed', + 'apbct_bot_detector_exist', + 'apbct_antiflood_passed', + 'apbct_email_encoder_passed', + ]; + + let skipAlt = false; + + if ( typeof cookies === 'string') { + skipAlt = cookies === 'ct_pointer_data'; + if ( typeof value === 'string' || typeof value === 'number' ) { + cookies = [[cookies, value, expires]]; + } + } + + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + let forcedAltCookiesSet = []; + cookies.forEach( function(item) { + if (listOfCookieNamesToForceAlt.indexOf(item[0]) !== -1) { + forcedAltCookiesSet.push(item); + } else { + apbctLocalStorage.set(item[0], item[1]); + } + }); + + // if cookies from list found use alt cookies for this selection set + if ( forcedAltCookiesSet.length > 0 ) { + ctSetAlternativeCookie(forcedAltCookiesSet); + } + + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } else { + ctNoCookieAttachHiddenFieldsToForms(); + } + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + // If problem integration forms detected use alt cookies for whole cookies set + if ( ctPublic.force_alt_cookies && !skipAlt) { + // do it just once + ctSetAlternativeCookie(cookies, {forceAltCookies: true}); + } + cookies.forEach( function(item) { + const _expires = typeof item[2] !== 'undefined' ? 'expires=' + expires + '; ' : ''; + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = ctPublicFunctions.cookiePrefix + + item[0] + + '=' + + encodeURIComponent(item[1]) + + '; ' + + _expires + + 'path=/; samesite=lax' + + ctSecure; + }); + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' && !skipAlt ) { + ctSetAlternativeCookie(cookies); + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctDetectForcedAltCookiesForms() { + let ninjaFormsSign = document.querySelectorAll('#tmpl-nf-layout').length > 0; + let elementorUltimateAddonsRegister = document.querySelectorAll('.uael-registration-form-wrapper').length > 0; + let smartFormsSign = document.querySelectorAll('script[id*="smart-forms"]').length > 0; + let jetpackCommentsForm = document.querySelectorAll('iframe[name="jetpack_remote_comment"]').length > 0; + let cwginstockForm = document.querySelectorAll('.cwginstock-subscribe-form').length > 0; + let userRegistrationProForm = document.querySelectorAll('div[id^="user-registration-form"]').length > 0; + let etPbDiviSubscriptionForm = document.querySelectorAll('div[class^="et_pb_newsletter_form"]').length > 0; + let fluentBookingApp = document.querySelectorAll('div[class^="fluent_booking_app"]').length > 0; + let bloomPopup = document.querySelectorAll('div[class^="et_bloom_form_container"]').length > 0; + let pafeFormsFormElementor = document.querySelectorAll('div[class*="pafe-form"]').length > 0; + let otterForm = document.querySelectorAll('div [class*="otter-form"]').length > 0; + let smartQuizBuilder = document.querySelectorAll('form .sqbform, .fields_reorder_enabled').length > 0; + ctPublic.force_alt_cookies = smartFormsSign || + ninjaFormsSign || + jetpackCommentsForm || + elementorUltimateAddonsRegister || + cwginstockForm || + userRegistrationProForm || + etPbDiviSubscriptionForm || + fluentBookingApp || + pafeFormsFormElementor || + bloomPopup || + otterForm || + smartQuizBuilder; + + setTimeout(function() { + if (!ctPublic.force_alt_cookies) { + let bookingPress = document.querySelectorAll('main[id^="bookingpress_booking_form"]').length > 0; + ctPublic.force_alt_cookies = bookingPress; + } + }, 1000); +} + +// eslint-disable-next-line require-jsdoc +function ctSetAlternativeCookie(cookies, params) { + if (typeof (getJavascriptClientData) === 'function' ) { + // reprocess already gained cookies data + if (Array.isArray(cookies)) { + cookies = getJavascriptClientData(cookies); + } + } else { + console.log('APBCT ERROR: getJavascriptClientData() is not loaded'); + } + + try { + cookies = JSON.parse(cookies); + } catch (e) { + console.log('APBCT ERROR: JSON parse error:' + e); + return; + } + + const callback = params && params.callback || null; + const onErrorCallback = params && params.onErrorCallback || null; + + if ( params && params.forceAltCookies ) { + cookies.apbct_force_alt_cookies = true; + } + + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + // fix for url encoded cookie apbct_pixel_url on REST route + if (typeof cookies.apbct_pixel_url === 'string' && + cookies.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); + } + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_alt_session__save__AJAX', + cookies: cookies, + }, + { + notJson: 1, + callback: callback, + onErrorCallback: onErrorCallback, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * Get cookie by name + * @param name + * @return {string|undefined} + */ +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctGetCookie(name) { + let matches = document.cookie.match(new RegExp( + '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)', + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + +// eslint-disable-next-line require-jsdoc,no-unused-vars +function ctDeleteCookie(cookieName) { + // Cookies disabled + if ( ctPublicFunctions.data__cookies_type === 'none' ) { + return; + + // Using traditional cookies + } else if ( ctPublicFunctions.data__cookies_type === 'native' ) { + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = cookieName + '=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=lax' + ctSecure; + + // Using alternative cookies + } else if ( ctPublicFunctions.data__cookies_type === 'alternative' ) { + // @ToDo implement this logic + } +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendAJAX(data, params, obj) { + // Default params + let _params = []; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['callback_context'] = params.callback_context || null; + _params['callback_params'] = params.callback_params || null; + _params['async'] = params.async || true; + _params['notJson'] = params.notJson || null; + _params['responseType']= params.notJson ? 'text' : 'json'; + _params['timeout'] = params.timeout || 15000; + _params['obj'] = obj || null; + _params['button'] = params.button || null; + _params['spinner'] = params.spinner || null; + _params['progressbar'] = params.progressbar || null; + _params['silent'] = params.silent || null; + _params['no_nonce'] = params.no_nonce || null; + _params['data'] = data; + _params['url'] = ctPublicFunctions._ajax_url; + const nonce = selectActualNonce(); + + if (typeof (data) === 'string') { + if ( ! _params['no_nonce'] ) { + _params['data'] = _params['data'] + '&_ajax_nonce=' + nonce; + } + _params['data'] = _params['data'] + '&no_cache=' + Math.random(); + } else { + if ( ! _params['no_nonce'] ) { + _params['data']._ajax_nonce = nonce; + } + _params['data'].no_cache = Math.random(); + } + + new ApbctCore().ajax(_params); +} + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_public_sendREST( route, params ) { + let _params = []; + _params['route'] = route; + _params['callback'] = params.callback || null; + _params['onErrorCallback'] = params.onErrorCallback || null; + _params['data'] = params.data || []; + _params['method'] = params.method || 'POST'; + + new ApbctCore().rest(_params); +} + +/** + * Generate unique ID + * @return {string} + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function apbctGenerateUniqueID() { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10); +} + +let apbctLocalStorage = { + get: function(key, property) { + if ( typeof property === 'undefined' ) { + property = 'value'; + } + const storageValue = localStorage.getItem(key); + if ( storageValue !== null ) { + try { + const json = JSON.parse(storageValue); + if ( json.hasOwnProperty(property) ) { + try { + // if property can be parsed as JSON - do it + return JSON.parse( json[property] ); + } catch (e) { + // if not - return string of value + return json[property].toString(); + } + } else { + return json; + } + } catch (e) { + return storageValue; + } + } + return false; + }, + set: function(key, value, isJson = true) { + if (isJson) { + let objToSave = {'value': JSON.stringify(value), 'timestamp': Math.floor(new Date().getTime() / 1000)}; + localStorage.setItem(key, JSON.stringify(objToSave)); + } else { + localStorage.setItem(key, value); + } + }, + isAlive: function(key, maxLifetime) { + if ( typeof maxLifetime === 'undefined' ) { + maxLifetime = 86400; + } + const keyTimestamp = this.get(key, 'timestamp'); + return keyTimestamp + maxLifetime > Math.floor(new Date().getTime() / 1000); + }, + isSet: function(key) { + return localStorage.getItem(key) !== null; + }, + delete: function(key) { + localStorage.removeItem(key); + }, + getCleanTalkData: function() { + let data = {}; + for (let i=0; i this.checkBotCallback(result), + }); + } else if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + data.action = 'apbct_force_protection_check_bot'; + apbct_public_sendAJAX(data, {callback: (result) => this.checkBotCallback(result)}); + } + } + + /** + * Check bot callback + * @param {Object} result + * @return {void} + */ + checkBotCallback(result) { + // if error occurred + if (result.data && result.data.status && result.data.status !== 200) { + console.log('ApbctForceProtection connection error occurred'); + this.decodeForms(); + return; + } + + if (typeof result === 'string') { + try { + result = JSON.parse(result); + } catch (e) { + console.log('ApbctForceProtection decodeForms error', e); + this.decodeForms(); + return; + } + } + + if (typeof result === 'object' && result.allow && result.allow === 1) { + this.decodeForms(); + document.dispatchEvent(new Event('apbctForceProtectionAllowed')); + } else { + this.showMessageForBot(result.message); + } + } + + /** + * Decode forms + * @return {void} + */ + decodeForms() { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + + try { + if (form && typeof(form) == 'string') { + wrapper.outerHTML = atob(form); + } + } catch (error) { + console.log(error); + } + }); + } + + /** + * Show message for bot + * @param {string} message + * @return {void} + */ + showMessageForBot(message) { + let form; + + this.wrappers.forEach((wrapper) => { + form = wrapper.querySelector('div.ct-encoded-form').dataset.encodedForm; + if (form) { + wrapper.outerHTML = '
' + message + '
'; + } + }); + } +} + +/** + * Force protection + */ +function apbctForceProtect() { + if (ctPublic.settings__forms__force_protection && typeof ApbctForceProtection !== 'undefined') { + new ApbctForceProtection(); + } +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbctForceProtect(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbctForceProtect); + } +} + +/** + * Class for gathering data about user typing. + * + * ============================== + * isAutoFill - only person can use auto fill + * isUseBuffer - use buffer for fill current field + * ============================== + * lastKeyTimestamp - timestamp of last key press in current field + * speedDelta - change for each key press in current field, + * as difference between current and previous key press timestamps, + * robots in general have constant speed of typing. + * If speedDelta is constant for each key press in current field, + * so, speedDelta will be roughly to 0, then it is robot. + * ============================== + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +class CTTypoData { + fieldData = { + isAutoFill: false, + isUseBuffer: false, + speedDelta: 0, + firstKeyTimestamp: 0, + lastKeyTimestamp: 0, + lastDelta: 0, + countOfKey: 0, + }; + + fields = document.querySelectorAll('textarea[name=comment]'); + + data = []; + + /** + * Gather fields. + */ + gatheringFields() { + let fieldSet = Array.prototype.slice.call(this.fields); + fieldSet.forEach((field, i) => { + this.data.push(Object.assign({}, this.fieldData)); + }); + } + + /** + * Set listeners. + */ + setListeners() { + this.fields.forEach((field, i) => { + field.addEventListener('paste', () => { + this.data[i].isUseBuffer = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('onautocomplete', () => { + this.data[i].isAutoFill = true; + }); + }); + + this.fields.forEach((field, i) => { + field.addEventListener('input', () => { + this.data[i].countOfKey++; + let time = + new Date(); + let currentDelta = 0; + + if (this.data[i].countOfKey === 1) { + this.data[i].lastKeyTimestamp = time; + this.data[i].firstKeyTimestamp = time; + return; + } + + currentDelta = time - this.data[i].lastKeyTimestamp; + if (this.data[i].countOfKey === 2) { + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + return; + } + + if (this.data[i].countOfKey > 2) { + this.data[i].speedDelta += Math.abs(this.data[i].lastDelta - currentDelta); + this.data[i].lastKeyTimestamp = time; + this.data[i].lastDelta = currentDelta; + } + }); + }); + } +} + +// eslint-disable-next-line camelcase +const ctDate = new Date(); +const ctTimeMs = new Date().getTime(); +let ctMouseEventTimerFlag = true; // Reading interval flag +let ctMouseData = []; +let ctMouseDataCounter = 0; +let ctCheckedEmails = {}; +let ctCheckedEmailsExist = {}; +let ctMouseReadInterval; +let ctMouseWriteDataInterval; +let tokenCheckerIntervalId; +let botDetectorLogLastUpdate = 0; +let botDetectorLogEventTypesCollected = []; + +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_attach_event_handler(elem, event, callback) { + if (typeof window.addEventListener === 'function') elem.addEventListener(event, callback); + else elem.attachEvent(event, callback); +} +// eslint-disable-next-line require-jsdoc,camelcase +function apbct_remove_event_handler(elem, event, callback) { + if (typeof window.removeEventListener === 'function') elem.removeEventListener(event, callback); + else elem.detachEvent(event, callback); +} + +// Writing first key press timestamp +const ctFunctionFirstKey = function output(event) { + let KeyTimestamp = Math.floor(new Date().getTime() / 1000); + ctSetCookie('ct_fkp_timestamp', KeyTimestamp); + ctKeyStopStopListening(); +}; + +/** + * Run cron jobs + */ +// forms handler cron +cronFormsHandler(2000); + +// bot_detector frontend_data log alt session saving cron +if ( + ctPublicFunctions.hasOwnProperty('data__bot_detector_enabled') && + ctPublicFunctions.data__bot_detector_enabled == 1 && + ctPublicFunctions.hasOwnProperty('data__frontend_data_log_enabled') && + ctPublicFunctions.data__frontend_data_log_enabled == 1 +) { + sendBotDetectorLogToAltSessions(1000); +} +/** + * Cron jobs end. + */ + +// mouse read +if (ctPublic.data__key_is_ok) { + // Reading interval + ctMouseReadInterval = setInterval(function() { + ctMouseEventTimerFlag = true; + }, 150); + + // Writting interval + ctMouseWriteDataInterval = setInterval(function() { + ctSetCookie('ct_pointer_data', JSON.stringify(ctMouseData)); + }, 1200); +} + +// Logging mouse position each 150 ms +const ctFunctionMouseMove = function output(event) { + ctSetMouseMoved(); + if (ctMouseEventTimerFlag === true) { + ctMouseData.push([ + Math.round(event.clientY), + Math.round(event.clientX), + Math.round(new Date().getTime() - ctTimeMs), + ]); + + ctMouseDataCounter++; + ctMouseEventTimerFlag = false; + if (ctMouseDataCounter >= 50) { + ctMouseStopData(); + } + } +}; + +/** + * Do handle periodical actions. + * @param {int} cronStartTimeout Time to go before cron start. + */ +function cronFormsHandler(cronStartTimeout = 2000) { + setTimeout(function() { + setInterval(function() { + restartFieldsListening(); + restartBotDetectorEventTokenAttach(); + }, 2000); + }, cronStartTimeout); +} + +/** + * Send BotDetector logs data to alternative sessions. + * If log_last_update has changed and log contains new event types, the log will be sent to the alternative sessions. + * @param {int} cronStartTimeout delay before cron start + * @param {int} interval check fires on interval + */ +function sendBotDetectorLogToAltSessions(cronStartTimeout = 3000, interval = 1000) { + setTimeout(function() { + setInterval(function() { + const currentLog = apbctLocalStorage.get('ct_bot_detector_frontend_data_log'); + if (needsSaveLogToAltSessions(currentLog)) { + botDetectorLogLastUpdate = currentLog.log_last_update; + // the log will be taken from javascriptclientdata + ctSetAlternativeCookie([], {forceAltCookies: true}); + } + }, interval); + }, cronStartTimeout); +} + +/** + * Check if the log needs to be saved to the alt sessions. If the log has new event types, it will be saved. + * @param {object} currentLog + * @return {boolean} + */ +function needsSaveLogToAltSessions(currentLog) { + if ( + currentLog && currentLog.hasOwnProperty('log_last_update') && + botDetectorLogLastUpdate !== currentLog.log_last_update + ) { + try { + for (let i = 0; i < currentLog.records.length; i++) { + const currentType = currentLog.records[i].frontend_data.js_event; + // check if this event type was already collected + if (currentType !== undefined && botDetectorLogEventTypesCollected.includes(currentType)) { + continue; + } + // add new event type to collection, this type will be sent to the alt sessions further + botDetectorLogEventTypesCollected.push(currentType); + return true; + } + } catch (e) { + console.log('APBCT: bot detector log collection error: ' . e.toString()); + } + } + return false; +} + +/** + * Restart event_token attachment if some forms load after document ready. + */ +function restartBotDetectorEventTokenAttach() { + // List there any new conditions, right now it works only for LatePoint forms. + // Probably, we can remove this condition at all, because setEventTokenField() + // checks all the forms without the field + const doAttach = ( + document.getElementsByClassName('latepoint-form').length > 0 || + document.getElementsByClassName('mec-booking-form-container').length > 0 || + document.getElementById('login-form-popup') !== null + ); + + try { + if ( doAttach ) { + // get token from LS + const token = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof setEventTokenField === 'function' && token !== undefined && token.length === 64) { + setEventTokenField(token); + } + // probably there we could use a new botDetectorInit if token is not found + } + } catch (e) { + console.log(e.toString()); + } +} + +/** + * Stop mouse observing function + */ +function ctMouseStopData() { + apbct_remove_event_handler(document, 'mousemove', ctFunctionMouseMove); + clearInterval(ctMouseReadInterval); + clearInterval(ctMouseWriteDataInterval); +} + +/** + * Stop key listening function + */ +function ctKeyStopStopListening() { + apbct_remove_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_remove_event_handler(document, 'keydown', ctFunctionFirstKey); +} + +/** + * @param {mixed} e + */ +function checkEmail(e) { + let currentEmail = e.target.value; + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail && !(currentEmail in ctCheckedEmails)) { + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'check_email_before_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + // Using AJAX request and handler + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_before_post', + email: currentEmail, + }, + { + callback: function(result) { + if (result.result) { + ctCheckedEmails[currentEmail] = { + 'result': result.result, + 'timestamp': Date.now() / 1000 |0, + }; + ctSetCookie('ct_checked_emails', JSON.stringify(ctCheckedEmails)); + } + }, + }, + ); + } + } +} + +/** + * @param {mixed} e + */ +function checkEmailExist(e) { + let currentEmail = e.target.value; + let result; + + if (!currentEmail || !currentEmail.length) { + let envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.remove(); + } + let hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.remove(); + } + return; + } + + if (! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(currentEmail)) { + return; + } + + if (currentEmail in ctCheckedEmailsExist) { + result = ctCheckedEmailsExist[currentEmail]; + getResultCheckEmailExist(e, result, currentEmail); + + return; + } + + viewCheckEmailExist(e, 'load'); + + // Using REST API handler + ctPublicFunctions.data__ajax_type = 'rest'; + if (ctPublicFunctions.data__ajax_type === 'rest') { + apbct_public_sendREST( + 'check_email_exist_post', + { + method: 'POST', + data: {'email': currentEmail}, + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + + return; + } + + if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + apbct_public_sendAJAX( + { + action: 'apbct_email_check_exist_post', + email: currentEmail, + }, + { + callback: function(result) { + getResultCheckEmailExist(e, result, currentEmail); + }, + }, + ); + } +} + +/** + * @param {mixed} e + * @param {mixed} result + * @param {string} currentEmail + */ +function getResultCheckEmailExist(e, result, currentEmail) { + if (!result || !result.result) { + return; + } + + result = result.result; + + ctCheckedEmailsExist[currentEmail] = { + 'result': result, + 'timestamp': Date.now() / 1000 |0, + }; + + if (result.result == 'EXISTS') { + viewCheckEmailExist(e, 'good_email', result.text_result); + } else { + viewCheckEmailExist(e, 'bad_email', result.text_result); + } + + ctSetCookie('ct_checked_emails_exist', JSON.stringify(ctCheckedEmailsExist)); +} + +/** + * @param {mixed} e + * @param {string} state + * @param {string} textResult + */ +function viewCheckEmailExist(e, state, textResult) { + let parentElement = e.target.parentElement; + let inputEmail = parentElement.querySelector('[name*="email"]'); + + if (!inputEmail) { + return; + } + + let envelope; + let hint; + + // envelope + if (document.getElementById('apbct-check_email_exist-block')) { + envelope = document.getElementById('apbct-check_email_exist-block'); + } else { + envelope = document.createElement('div'); + envelope.setAttribute('class', 'apbct-check_email_exist-block'); + envelope.setAttribute('id', 'apbct-check_email_exist-block'); + window.addEventListener('scroll', function() { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + }); + parentElement.after(envelope); + } + + // hint + if (document.getElementById('apbct-check_email_exist-popup_description')) { + hint = document.getElementById('apbct-check_email_exist-popup_description'); + } else { + hint = document.createElement('div'); + hint.setAttribute('class', 'apbct-check_email_exist-popup_description'); + hint.setAttribute('id', 'apbct-check_email_exist-popup_description'); + window.addEventListener('scroll', function() { + hint.style.top = envelope.getBoundingClientRect().top + 'px'; + }); + + envelope.after(hint); + } + + ctEmailExistSetElementsPositions(); + + window.addEventListener('resize', function(event) { + ctEmailExistSetElementsPositions(); + }); + + switch (state) { + case 'load': + envelope.classList.remove('apbct-check_email_exist-good_email', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-load'); + break; + + case 'good_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-bad_email'); + envelope.classList.add('apbct-check_email_exist-good_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#1C7129'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + case 'bad_email': + envelope.classList.remove('apbct-check_email_exist-load', 'apbct-check_email_exist-good_email'); + envelope.classList.add('apbct-check_email_exist-bad_email'); + + envelope.onmouseover = function() { + hint.textContent = textResult; + hint.style.display = 'block'; + hint.style.top = inputEmail.getBoundingClientRect().top - hint.getBoundingClientRect().height + 'px'; + hint.style.color = '#E01111'; + }; + + envelope.onmouseout = function() { + hint.style.display = 'none'; + }; + + break; + + default: + break; + } +} + +/** + * Shift the envelope to the input field on resizing the window + * @param {object} envelope + * @param {object} inputEmail + */ +function ctEmailExistSetElementsPositions() { + const envelopeWidth = 35; + const inputEmail = document.querySelector('comment-form input[name*="email"], input#email'); + if (!inputEmail) { + return; + } + const envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.style.top = inputEmail.getBoundingClientRect().top + 'px'; + envelope.style.left = inputEmail.getBoundingClientRect().right - envelopeWidth - 10 + 'px'; + envelope.style.height = inputEmail.offsetHeight + 'px'; + envelope.style.width = envelopeWidth + 'px'; + } + + const hint = document.getElementById('apbct-check_email_exist-popup_description'); + if (hint) { + hint.style.width = inputEmail.offsetWidth + 'px'; + hint.style.left = inputEmail.getBoundingClientRect().left + 'px'; + } +} + +/** + * @return {bool} + */ +function ctIsDrawPixel() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + return +ctPublic.pixel__enabled || + (ctPublic.data__cookies_type === 'none' && document.querySelectorAll('img#apbct_pixel').length === 0) || + (ctPublic.data__cookies_type === 'alternative' && document.querySelectorAll('img#apbct_pixel').length === 0); +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImg(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + ctSetCookie('apbct_pixel_url', pixelUrl); + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', pixelUrl); + apbct('body').append(insertedImg); + } + } +} + +/** + * @param {string} pixelUrl + * @return {bool} + */ +function ctSetPixelImgFromLocalstorage(pixelUrl) { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + if ( ctIsDrawPixel() ) { + if ( ! document.getElementById('apbct_pixel') ) { + let insertedImg = document.createElement('img'); + insertedImg.setAttribute('alt', 'CleanTalk Pixel'); + insertedImg.setAttribute('title', 'CleanTalk Pixel'); + insertedImg.setAttribute('id', 'apbct_pixel'); + insertedImg.setAttribute('style', 'display: none; left: 99999px;'); + insertedImg.setAttribute('src', decodeURIComponent(pixelUrl)); + apbct('body').append(insertedImg); + } + } +} + +/** + * ctGetPixelUrl + * @return {bool} + */ +function ctGetPixelUrl() { + if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + return false; + } + + // Check if pixel is already in localstorage and is not outdated + let localStoragePixelUrl = apbctLocalStorage.get('apbct_pixel_url'); + if ( localStoragePixelUrl !== false ) { + if ( ! apbctLocalStorage.isAlive('apbct_pixel_url', 3600 * 3) ) { + apbctLocalStorage.delete('apbct_pixel_url'); + } else { + // if so - load pixel from localstorage and draw it skipping AJAX + ctSetPixelImgFromLocalstorage(localStoragePixelUrl); + return; + } + } + // Using REST API handler + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST( + 'apbct_get_pixel_url', + { + method: 'POST', + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + }, + ); + // Using AJAX request and handler + } else { + apbct_public_sendAJAX( + { + action: 'apbct_get_pixel_url', + }, + { + notJson: true, + callback: function(result) { + if (result && + (typeof result === 'string' || result instanceof String) && result.indexOf('https') === 0) { + // set pixel url to localstorage + if ( ! apbctLocalStorage.get('apbct_pixel_url') ) { + // set pixel to the storage + apbctLocalStorage.set('apbct_pixel_url', result); + // update pixel data in the hidden fields + ctNoCookieAttachHiddenFieldsToForms(); + } + // then run pixel drawing + ctSetPixelImg(result); + } + }, + beforeSend: function(xhr) { + xhr.setRequestHeader('X-Robots-Tag', 'noindex, nofollow'); + }, + }, + ); + } +} + +/** + * ctSetHasScrolled + */ +function ctSetHasScrolled() { + if ( ! apbctLocalStorage.isSet('ct_has_scrolled') || ! apbctLocalStorage.get('ct_has_scrolled') ) { + ctSetCookie('ct_has_scrolled', 'true'); + apbctLocalStorage.set('ct_has_scrolled', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_scrolled') === undefined + ) { + ctSetCookie('ct_has_scrolled', 'true'); + } +} + +/** + * ctSetMouseMoved + */ +function ctSetMouseMoved() { + if ( ! apbctLocalStorage.isSet('ct_mouse_moved') || ! apbctLocalStorage.get('ct_mouse_moved') ) { + ctSetCookie('ct_mouse_moved', 'true'); + apbctLocalStorage.set('ct_mouse_moved', true); + } + if ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_mouse_moved') === undefined + ) { + ctSetCookie('ct_mouse_moved', 'true'); + } +} + +/** + * Restart listen fields to set ct_has_input_focused or ct_has_key_up + */ +function restartFieldsListening() { + if (!apbctLocalStorage.isSet('ct_has_input_focused') && !apbctLocalStorage.isSet('ct_has_key_up')) { + ctStartFieldsListening(); + } +} + +/** + * init listeners for keyup and focus events + */ +function ctStartFieldsListening() { + if ( + (apbctLocalStorage.isSet('ct_has_key_up') || apbctLocalStorage.get('ct_has_key_up')) && + (apbctLocalStorage.isSet('ct_has_input_focused') || apbctLocalStorage.get('ct_has_input_focused')) && + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') !== undefined && + ctGetCookie('ct_has_key_up') !== undefined + ) + ) { + // already set + return; + } + + let forms = ctGetPageForms(); + ctPublic.handled_fields = []; + + if (forms.length > 0) { + for (let i = 0; i < forms.length; i++) { + // handle only inputs and textareas + const handledFormFields = forms[i].querySelectorAll('input,textarea'); + for (let i = 0; i < handledFormFields.length; i++) { + if (handledFormFields[i].type !== 'hidden') { + // collect handled fields to remove handler in the future + ctPublic.handled_fields.push(handledFormFields[i]); + // do attach handlers + apbct_attach_event_handler(handledFormFields[i], 'focus', ctFunctionHasInputFocused); + apbct_attach_event_handler(handledFormFields[i], 'keyup', ctFunctionHasKeyUp); + } + } + } + } +} + +/** + * stop listening keyup and focus + * @param {string} eventName + * @param {string} functionName + */ +function ctStopFieldsListening(eventName, functionName) { + if (typeof ctPublic.handled_fields !== 'undefined' && ctPublic.handled_fields.length > 0) { + for (let i = 0; i < ctPublic.handled_fields.length; i++) { + apbct_remove_event_handler(ctPublic.handled_fields[i], eventName, functionName); + } + } +} + +let ctFunctionHasInputFocused = function output(event) { + ctSetHasInputFocused(); + ctStopFieldsListening('focus', ctFunctionHasInputFocused); +}; + +let ctFunctionHasKeyUp = function output(event) { + ctSetHasKeyUp(); + ctStopFieldsListening('keyup', ctFunctionHasKeyUp); +}; + +/** + * set ct_has_input_focused ct_has_key_up cookies on session period + */ +function ctSetHasInputFocused() { + if ( ! apbctLocalStorage.isSet('ct_has_input_focused') || ! apbctLocalStorage.get('ct_has_input_focused') ) { + apbctLocalStorage.set('ct_has_input_focused', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_input_focused') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_input_focused', 'true'); + } +} + +/** + * ctSetHasKeyUp + */ +function ctSetHasKeyUp() { + if ( ! apbctLocalStorage.isSet('ct_has_key_up') || ! apbctLocalStorage.get('ct_has_key_up') ) { + apbctLocalStorage.set('ct_has_key_up', true); + } + if ( + ( + ( + ctPublic.data__cookies_type === 'native' && + ctGetCookie('ct_has_key_up') === undefined + ) || + ctPublic.data__cookies_type === 'alternative' + ) || + ( + ctPublic.data__cookies_type === 'none' && + ( + typeof ctPublic.force_alt_cookies !== 'undefined' || + (ctPublic.force_alt_cookies !== undefined && ctPublic.force_alt_cookies) + ) + ) + ) { + ctSetCookie('ct_has_key_up', 'true'); + } +} + +if (ctPublic.data__key_is_ok) { + apbct_attach_event_handler(document, 'mousemove', ctFunctionMouseMove); + apbct_attach_event_handler(document, 'mousedown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'keydown', ctFunctionFirstKey); + apbct_attach_event_handler(document, 'scroll', ctSetHasScrolled); +} + +/** + * Prepare block to intercept AJAX response + */ +function apbctPrepareBlockForAjaxForms() { + // eslint-disable-next-line require-jsdoc + function ctPrepareBlockMessage(xhr) { + if (xhr.responseText && + xhr.responseText.indexOf('"apbct') !== -1 && + xhr.responseText.indexOf('DOCTYPE') === -1 + ) { + try { + ctParseBlockMessage(JSON.parse(xhr.responseText)); + } catch (e) { + console.log(e.toString()); + } + } + } + + if (typeof jQuery !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + if (typeof jQuery(document).ajaxComplete() !== 'function') { + jQuery(document).on('ajaxComplete', function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } else { + jQuery(document).ajaxComplete( function(event, xhr, settings) { + ctPrepareBlockMessage(xhr); + }); + } + } else { + // if Jquery is not avaliable try to use xhr + if (typeof XMLHttpRequest !== 'undefined') { + // Capturing responses and output block message for unknown AJAX forms + document.addEventListener('readystatechange', function(event) { + if (event.target.readyState === 4) { + ctPrepareBlockMessage(event.target); + } + }); + } + } +} + +/** + * For forced alt cookies. + * If token is not added to the LS on apbc_ready, check every second if so and send token to the alt sessions. + */ +function startForcedAltEventTokenChecker() { + tokenCheckerIntervalId = setInterval( function() { + if (apbctLocalStorage.get('event_token_forced_set') === '1') { + clearInterval(tokenCheckerIntervalId); + return; + } + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if (eventToken) { + ctSetAlternativeCookie([['ct_bot_detector_event_token', eventToken]], {forceAltCookies: true}); + apbctLocalStorage.set('event_token_forced_set', '1'); + clearInterval(tokenCheckerIntervalId); + } else { + } + }, 1000); +} + + +/** + * Ready function + */ +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_ready() { + document.addEventListener('gform_page_loaded', function() { + if ( + typeof ctPublic.force_alt_cookies === 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + if (typeof setEventTokenField === 'function' && typeof botDetectorLocalStorage === 'function') { + setEventTokenField(botDetectorLocalStorage.get('bot_detector_event_token')); + } + } + }); + if ( ! ctPublic.wc_ajax_add_to_cart ) { + apbctCheckAddToCartByGet(); + } + + apbctPrepareBlockForAjaxForms(); + + // set session ID + if (!apbctSessionStorage.isSet('apbct_session_id')) { + const sessionID = apbctGenerateUniqueID(); + apbctSessionStorage.set('apbct_session_id', sessionID, false); + apbctLocalStorage.set('apbct_page_hits', 1); + if (document.referrer) { + let urlReferer = new URL(document.referrer); + if (urlReferer.host !== location.host) { + apbctSessionStorage.set('apbct_site_referer', document.referrer, false); + } + } + } else { + apbctLocalStorage.set('apbct_page_hits', Number(apbctLocalStorage.get('apbct_page_hits')) + 1); + } + + apbctWriteReferrersToSessionStorage(); + + const cookiesType = apbctLocalStorage.get('ct_cookies_type'); + if ( ! cookiesType || cookiesType !== ctPublic.data__cookies_type ) { + apbctLocalStorage.set('ct_cookies_type', ctPublic.data__cookies_type); + apbctLocalStorage.delete('ct_mouse_moved'); + apbctLocalStorage.delete('ct_has_scrolled'); + } + + if (ctPublic.data__cookies_type !== 'alternative') { + ctStartFieldsListening(); + // 2nd try to add listeners for delayed appears forms + setTimeout(ctStartFieldsListening, 1000); + } + + window.addEventListener('animationstart', apbctOnAnimationStart, true); + window.addEventListener('input', apbctOnInput, true); + document.ctTypoData = new CTTypoData(); + document.ctTypoData.gatheringFields(); + document.ctTypoData.setListeners(); + + // Collect scrolling info + const initCookies = [ + ['ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)], + ['ct_fkp_timestamp', '0'], + ['ct_pointer_data', '0'], + // eslint-disable-next-line camelcase + ['ct_timezone', ctDate.getTimezoneOffset()/60*(-1)], + ['ct_screen_info', apbctGetScreenInfo()], + ['apbct_headless', navigator.webdriver], + ]; + + apbctLocalStorage.set('ct_ps_timestamp', Math.floor(new Date().getTime() / 1000)); + apbctLocalStorage.set('ct_fkp_timestamp', '0'); + apbctLocalStorage.set('ct_pointer_data', '0'); + // eslint-disable-next-line camelcase + apbctLocalStorage.set('ct_timezone', ctDate.getTimezoneOffset()/60*(-1) ); + apbctLocalStorage.set('ct_screen_info', apbctGetScreenInfo()); + apbctLocalStorage.set('apbct_headless', navigator.webdriver); + + if ( ctPublic.data__cookies_type !== 'native' ) { + initCookies.push(['apbct_visible_fields', '0']); + } else { + // Delete all visible fields cookies on load the page + let cookiesArray = document.cookie.split(';'); + if ( cookiesArray.length !== 0 ) { + for ( let i = 0; i < cookiesArray.length; i++ ) { + let currentCookie = cookiesArray[i].trim(); + let cookieName = currentCookie.split('=')[0]; + if ( cookieName.indexOf('apbct_visible_fields_') === 0 ) { + ctDeleteCookie(cookieName); + } + } + } + } + + if ( + +ctPublic.pixel__setting && + !(+ctPublic.pixel__setting == 3 && ctPublic.settings__data__bot_detector_enabled == 1) + ) { + if ( ctIsDrawPixel() ) { + ctGetPixelUrl(); + } else { + initCookies.push(['apbct_pixel_url', ctPublic.pixel__url]); + } + } + + if ( +ctPublic.data__email_check_before_post) { + initCookies.push(['ct_checked_emails', '0']); + apbct('input[type = \'email\'], #email').on('blur', checkEmail); + } + + if ( +ctPublic.data__email_check_exist_post) { + initCookies.push(['ct_checked_emails_exist', '0']); + apbct('comment-form input[name = \'email\'], input#email').on('blur', checkEmailExist); + } + + if (apbctLocalStorage.isSet('ct_checkjs')) { + initCookies.push(['ct_checkjs', apbctLocalStorage.get('ct_checkjs')]); + } else { + initCookies.push(['ct_checkjs', 0]); + } + + // detect integrated forms that need to be handled via alternative cookies + ctDetectForcedAltCookiesForms(); + + // send bot detector event token to alt cookies on problem forms + let tokenForForceAlt = apbctLocalStorage.get('bot_detector_event_token'); + if (typeof ctPublic.force_alt_cookies !== 'undefined' && + ctPublic.force_alt_cookies && + ctPublic.settings__data__bot_detector_enabled + ) { + apbctLocalStorage.set('event_token_forced_set', '0'); + if (tokenForForceAlt) { + initCookies.push(['ct_bot_detector_event_token', tokenForForceAlt]); + apbctLocalStorage.set('event_token_forced_set', '1'); + } else { + startForcedAltEventTokenChecker(); + } + } + + ctSetCookie(initCookies); + + setTimeout(function() { + if ( + typeof ctPublic.force_alt_cookies == 'undefined' || + (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) + ) { + ctNoCookieAttachHiddenFieldsToForms(); + } + + if ( + typeof ctPublic.data__cookies_type !== 'undefined' && + ctPublic.data__cookies_type === 'none' + ) { + ctAjaxSetupAddCleanTalkDataBeforeSendAjax(); + ctAddWCMiddlewares(); + } + + for (let i = 0; i < document.forms.length; i++) { + let form = document.forms[i]; + + // Exclusion for forms + if (ctCheckHiddenFieldsExclusions(document.forms[i], 'visible_fields')) { + continue; + } + if (form.querySelector('input[name="wspsc_add_cart_submit"]') || + form.querySelector('input[name="option"][value="com_vikrentcar"]') || + form.querySelector('input[name="option"][value="com_vikbooking"]') + ) { + continue; + } + + // The Form has hidden field like apbct_visible_fields + if ( + document.forms[i].elements.apbct_visible_fields !== undefined && + document.forms[i].elements.apbct_visible_fields.length > 0 + ) { + continue; + } + + if (form.querySelector('input[name="apbct_visible_fields"]')) { + let visibleFields = form.querySelector('input[name="apbct_visible_fields"]'); + form.removeChild(visibleFields); + } + + let hiddenInput = document.createElement( 'input' ); + hiddenInput.setAttribute( 'type', 'hidden' ); + hiddenInput.setAttribute( 'id', 'apbct_visible_fields_' + i ); + hiddenInput.setAttribute( 'name', 'apbct_visible_fields'); + let visibleFieldsToInput = {}; + visibleFieldsToInput[0] = apbct_collect_visible_fields(form); + hiddenInput.value = btoa(JSON.stringify(visibleFieldsToInput)); + form.append( hiddenInput ); + + form.onsubmit_prev = form.onsubmit; + + form.ctFormIndex = i; + form.onsubmit = function(event) { + if ( ctPublic.data__cookies_type !== 'native' && typeof event.target.ctFormIndex !== 'undefined' ) { + apbct_visible_fields_set_cookie( apbct_collect_visible_fields(this), event.target.ctFormIndex ); + } + + if (ctPublic.data__cookies_type === 'none' && isFormThatNeedCatchXhr(event.target)) { + window.XMLHttpRequest.prototype.send = function(data) { + let noCookieData = getNoCookieData(); + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + defaultSend.call(this, noCookieData + data); + setTimeout(() => { + window.XMLHttpRequest.prototype.send = defaultSend; + }, 0); + }; + } + + // Call previous submit action + if (event.target.onsubmit_prev instanceof Function && !ctOnsubmitPrevCallExclude(event.target)) { + if (event.target.classList !== undefined && event.target.classList.contains('brave_form_form')) { + event.preventDefault(); + } + setTimeout(function() { + event.target.onsubmit_prev.call(event.target, event); + }, 0); + } + }; + } + }, 1000); + + // Listen clicks on encoded emails + let encodedEmailNodes = document.querySelectorAll('[data-original-string]'); + ctPublic.encodedEmailNodes = encodedEmailNodes; + if (encodedEmailNodes.length) { + for (let i = 0; i < encodedEmailNodes.length; ++i) { + encodedEmailNodes[i].addEventListener('click', ctFillDecodedEmailHandler); + } + } + + // WordPress Search form processing + for (const _form of document.forms) { + if ( + typeof ctPublic !== 'undefined' && + + ctPublic.settings__forms__search_test === 1 && + ( + _form.getAttribute('id') === 'searchform' || + (_form.getAttribute('class') !== null && _form.getAttribute('class').indexOf('search-form') !== -1) || + (_form.getAttribute('role') !== null && _form.getAttribute('role').indexOf('search') !== -1) + ) + ) { + // fibosearch integration + if (_form.querySelector('input.dgwt-wcas-search-input')) { + continue; + } + + if ( + _form.getAttribute('id') === 'hero-search-form' || + _form.getAttribute('class') === 'hb-booking-search-form' + ) { + continue; + } + + // this handles search forms onsubmit process + _form.apbctSearchPrevOnsubmit = _form.onsubmit; + _form.onsubmit = (e) => ctSearchFormOnSubmitHandler(e, _form); + } + } + + // Check any XMLHttpRequest connections + apbctCatchXmlHttpRequest(); + + // Initializing the collection of user activity + new ApbctCollectingUserActivity(); + + // Set important paramaters via ajax if problematic cache solutions found + // todo These AJAX calls removed untill we find a better solution, reason is a lot of requests to the server. + // apbctAjaxSetImportantParametersOnCacheExist(ctPublic.advancedCacheExists || ctPublic.varnishCacheExists); + + // Checking that the bot detector has loaded and received the event token for Anti-Crawler + if (ctPublic.settings__sfw__anti_crawler) { + checkBotDetectorExist(); + } +} + +/** + * Checking that the bot detector has loaded and received the event token + */ +function checkBotDetectorExist() { + if (ctPublic.settings__data__bot_detector_enabled) { + const botDetectorIntervalSearch = setInterval(() => { + let botDetectorEventToken = localStorage.bot_detector_event_token ? true : false; + + if (botDetectorEventToken) { + ctSetCookie('apbct_bot_detector_exist', '1', '3600'); + clearInterval(botDetectorIntervalSearch); + } + }, 500); + } +} + +/** + * Insert no_cookies_data to rest request + */ +function ctAddWCMiddlewares() { + const ctPinDataToRequest = (options, next) => { + if (typeof options !== 'object' || options === null || + !options.hasOwnProperty('data') || !options.hasOwnProperty('path') + ) { + return next(options); + } + + // add to cart + if (options.data.hasOwnProperty('requests') && + options.data.requests.length > 0 && + options.data.requests[0].hasOwnProperty('path') && + options.data.requests[0].path === '/wc/store/v1/cart/add-item' + ) { + options.data.requests[0].data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.requests[0].data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + // checkout + if (options.path === '/wc/store/v1/checkout') { + options.data.ct_no_cookie_hidden_field = getNoCookieData(); + options.data.event_token = localStorage.getItem('bot_detector_event_token'); + } + + return next(options); + }; + + if (window.hasOwnProperty('wp') && + window.wp.hasOwnProperty('apiFetch') && + typeof window.wp.apiFetch.use === 'function' + ) { + window.wp.apiFetch.use(ctPinDataToRequest); + } +} + +/** + * Insert event_token and no_cookies_data to some ajax request + */ +function apbctCatchXmlHttpRequest() { + // 1) Check the page if it needed to catch XHR + if ( document.querySelector('div.wfu_container') !== null ) { + const originalSend = XMLHttpRequest.prototype.send; + XMLHttpRequest.prototype.send = function(body) { + // 2) Check the caught request fi it needed to modify + if ( + body && + typeof body === 'string' && + ( + body.indexOf('action=wfu_ajax_action_ask_server') !== -1 + ) + ) { + let addidionalCleantalkData = ''; + let eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if ( + eventToken !== null && + eventToken !== false && + eventToken.hasOwnProperty('value') && + eventToken.value !== '' + ) { + eventToken = eventToken.value; + addidionalCleantalkData += '&' + 'data%5Bct_bot_detector_event_token%5D=' + eventToken; + } + + let noCookieData = getNoCookieData(); + addidionalCleantalkData += '&' + 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData; + + body += addidionalCleantalkData; + + return originalSend.apply(this, [body]); + } + return originalSend.apply(this, [body]); + }; + } +} + +/** + * Run AJAX to set important_parameters on the site backend if problematic cache solutions are defined. + * @param {boolean} cacheExist + */ +function apbctAjaxSetImportantParametersOnCacheExist(cacheExist) { // eslint-disable-line no-unused-vars + // Set important parameters via ajax + if ( cacheExist ) { + if ( ctPublicFunctions.data__ajax_type === 'rest' ) { + apbct_public_sendREST('apbct_set_important_parameters', {}); + } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { + apbct_public_sendAJAX({action: 'apbct_set_important_parameters'}, {}); + } + } +} + +/** + * Prepare jQuery.ajaxSetup to add nocookie data to the jQuery ajax request. + * Notes: + * - Do it just once, the ajaxSetup.beforeSend will be overwritten for any calls. + * - Signs of forms need to be caught will be checked during ajaxSetup.settings.data process on send. + * - Any sign of the form HTML of the caller is insignificant in this process. + * @return {void} + */ +function ctAjaxSetupAddCleanTalkDataBeforeSendAjax() { + // jquery ajax call intercept + // this is the only place where we can found hard dependency on jQuery, if the form use it - the script + // will work independing if jQuery is loaded by CleanTalk or not + let eventToken = false; + if ( typeof jQuery !== 'undefined' && typeof jQuery.ajaxSetup === 'function') { + jQuery.ajaxSetup({ + beforeSend: function(xhr, settings) { + let sourceSign = false; + // settings data is string (important!) + if ( typeof settings.data === 'string' ) { + if (settings.data.indexOf('twt_cc_signup') !== -1) { + sourceSign = 'twt_cc_signup'; + } + + if (settings.data.indexOf('action=mailpoet') !== -1) { + sourceSign = 'action=mailpoet'; + } + + if ( + settings.data.indexOf('action=user_registration') !== -1 && + settings.data.indexOf('ur_frontend_form_nonce') !== -1 + ) { + sourceSign = 'action=user_registration'; + } + + if (settings.data.indexOf('action=happyforms_message') !== -1) { + sourceSign = 'action=happyforms_message'; + } + + if (settings.data.indexOf('action=new_activity_comment') !== -1) { + sourceSign = 'action=new_activity_comment'; + } + } + if ( typeof settings.url === 'string' ) { + if (settings.url.indexOf('wc-ajax=add_to_cart') !== -1) { + sourceSign = 'wc-ajax=add_to_cart'; + if (localStorage.getItem('bot_detector_event_token') !== null) { + eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch { + eventToken = false; + } + if (eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') { + eventToken = eventToken.value; + } + } + } + } + + if (sourceSign) { + let noCookieData = getNoCookieData(); + if (typeof eventToken === 'string') { + eventToken = 'data%5Bct_bot_detector_event_token%5D=' + eventToken + '&'; + } else { + eventToken = ''; + } + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + + settings.data = noCookieData + eventToken + settings.data; + } + }, + }); + } +} + +// eslint-disable-next-line require-jsdoc +function ctOnsubmitPrevCallExclude(form) { + if (form.classList.contains('hb-booking-search-form')) { + return true; + } + + return false; +} + +if (ctPublic.data__key_is_ok) { + if (document.readyState !== 'loading') { + apbct_ready(); + } else { + apbct_attach_event_handler(document, 'DOMContentLoaded', apbct_ready); + } + + apbctLocalStorage.set('ct_checkjs', ctPublic.ct_checkjs_key, true ); +} + +/** + * @param {SubmitEvent} e + * @param {object} targetForm + */ +function ctSearchFormOnSubmitHandler(e, targetForm) { + try { + // get honeypot field and it's value + const honeyPotField = targetForm.querySelector('[name*="apbct_email_id__"]'); + let hpValue = null; + if ( + honeyPotField !== null && + honeyPotField.value !== null + ) { + hpValue = honeyPotField.value; + } + + // get cookie data from storages + let cleantalkStorageDataArray = getCleanTalkStorageDataArray(); + + // get event token from storage + let eventTokenLocalStorage = apbctLocalStorage.get('bot_detector_event_token'); + + // if noCookie data or honeypot data is set, proceed handling + if ( cleantalkStorageDataArray !== null || honeyPotField !== null || eventTokenLocalStorage !== null ) { + e.preventDefault(); + const callBack = () => { + if (honeyPotField !== null) { + honeyPotField.parentNode.removeChild(honeyPotField); + } + if (typeof targetForm.apbctSearchPrevOnsubmit === 'function') { + targetForm.apbctSearchPrevOnsubmit(); + } else { + HTMLFormElement.prototype.submit.call(targetForm); + } + }; + + let cookiesArray = cleantalkStorageDataArray; + + // if honeypot data provided add the fields to the parsed data + if ( hpValue !== null ) { + cookiesArray.apbct_search_form__honeypot_value = hpValue; + } + + // set event token + cookiesArray.ct_bot_detector_event_token = eventTokenLocalStorage; + + // if the pixel needs to be decoded + if ( + typeof cookiesArray.apbct_pixel_url === 'string' && + cookiesArray.apbct_pixel_url.indexOf('%3A') !== -1 + ) { + cookiesArray.apbct_pixel_url = decodeURIComponent(cookiesArray.apbct_pixel_url); + } + + // data to JSON + const parsedCookies = JSON.stringify(cookiesArray); + + // if any data provided, proceed data to xhr + if ( typeof parsedCookies !== 'undefined' && parsedCookies.length !== 0 ) { + ctSetAlternativeCookie( + parsedCookies, + {callback: callBack, onErrorCallback: callBack, forceAltCookies: true}, + ); + } else { + callBack(); + } + } + } catch (error) { + console.warn('APBCT search form onsubmit handler error. ' + error); + } +} + +/** + * @param {mixed} commonCookies + * @return {string} + */ +function getJavascriptClientData(commonCookies = []) { // eslint-disable-line no-unused-vars + let resultDataJson = {}; + + resultDataJson.ct_checked_emails = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails'); + resultDataJson.ct_checked_emails_exist = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checked_emails_exist'); + resultDataJson.ct_checkjs = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_checkjs'); + resultDataJson.ct_fkp_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_fkp_timestamp'); + resultDataJson.ct_pointer_data = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_pointer_data'); + resultDataJson.ct_ps_timestamp = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_ps_timestamp'); + resultDataJson.ct_screen_info = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_screen_info'); + resultDataJson.ct_timezone = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_timezone'); + + // collecting data from localstorage + const ctMouseMovedLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const apbctPageHits = apbctLocalStorage.get('apbct_page_hits'); + const apbctPrevReferer = apbctSessionStorage.get('apbct_prev_referer'); + const apbctSiteReferer = apbctSessionStorage.get('apbct_site_referer'); + const ctJsErrorsLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_js_errors'); + const ctPixelUrl = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadless = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + const ctBotDetectorFrontendDataLog = apbctLocalStorage.get( + ctPublicFunctions.cookiePrefix + 'ct_bot_detector_frontend_data_log', + ); + + // collecting data from cookies + const ctMouseMovedCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + const ctHasScrolledCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + const ctCookiesTypeCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + const ctCookiesPixelUrl = ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + const apbctHeadlessNative = !!ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + + + resultDataJson.ct_mouse_moved = ctMouseMovedLocalStorage !== undefined ? + ctMouseMovedLocalStorage : ctMouseMovedCookie; + resultDataJson.ct_has_scrolled = ctHasScrolledLocalStorage !== undefined ? + ctHasScrolledLocalStorage : ctHasScrolledCookie; + resultDataJson.ct_cookies_type = ctCookiesTypeLocalStorage !== undefined ? + ctCookiesTypeLocalStorage : ctCookiesTypeCookie; + resultDataJson.apbct_pixel_url = ctPixelUrl !== undefined ? + ctPixelUrl : ctCookiesPixelUrl; + resultDataJson.apbct_headless = apbctHeadless !== undefined ? + apbctHeadless : apbctHeadlessNative; + resultDataJson.ct_bot_detector_frontend_data_log = ctBotDetectorFrontendDataLog !== undefined ? + ctBotDetectorFrontendDataLog : ''; + if (resultDataJson.apbct_pixel_url && typeof(resultDataJson.apbct_pixel_url) == 'string') { + if (resultDataJson.apbct_pixel_url.indexOf('%3A%2F')) { + resultDataJson.apbct_pixel_url = decodeURIComponent(resultDataJson.apbct_pixel_url); + } + } + + resultDataJson.apbct_page_hits = apbctPageHits; + resultDataJson.apbct_prev_referer = apbctPrevReferer; + resultDataJson.apbct_site_referer = apbctSiteReferer; + resultDataJson.apbct_ct_js_errors = ctJsErrorsLocalStorage; + + if (!resultDataJson.apbct_pixel_url) { + resultDataJson.apbct_pixel_url = ctPublic.pixel__url; + } + + if ( typeof (commonCookies) === 'object') { + for (let i = 0; i < commonCookies.length; ++i) { + if ( typeof (commonCookies[i][1]) === 'object' ) { + // this is for handle SFW cookies + resultDataJson[commonCookies[i][1][0]] = commonCookies[i][1][1]; + } else { + resultDataJson[commonCookies[i][0]] = commonCookies[i][1]; + } + } + } else { + console.log('APBCT JS ERROR: Collecting data type mismatch'); + } + + // Parse JSON properties to prevent double JSON encoding + resultDataJson = removeDoubleJsonEncoding(resultDataJson); + + + return JSON.stringify(resultDataJson); +} + +/** + * Recursive + * + * Recursively decode JSON-encoded properties + * + * @param {mixed} object + * @return {*} + */ +function removeDoubleJsonEncoding(object) { + if ( typeof object === 'object') { + // eslint-disable-next-line guard-for-in + for (let objectKey in object) { + // Recursion + if ( typeof object[objectKey] === 'object') { + object[objectKey] = removeDoubleJsonEncoding(object[objectKey]); + } + + // Common case (out) + if ( + typeof object[objectKey] === 'string' && + object[objectKey].match(/^[\[{].*?[\]}]$/) !== null // is like JSON + ) { + const parsedValue = JSON.parse(object[objectKey]); + if ( typeof parsedValue === 'object' ) { + object[objectKey] = parsedValue; + } + } + } + } + + return object; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_collect_visible_fields( form ) { + // Get only fields + let inputs = []; + let inputsVisible = ''; + let inputsVisibleCount = 0; + let inputsInvisible = ''; + let inputsInvisibleCount = 0; + let inputsWithDuplicateNames = []; + + for (let key in form.elements) { + if (!isNaN(+key)) { + inputs[key] = form.elements[key]; + } + } + + // Filter fields + inputs = inputs.filter(function(elem) { + // Filter already added fields + if ( inputsWithDuplicateNames.indexOf( elem.getAttribute('name') ) !== -1 ) { + return false; + } + // Filter inputs with same names for type == radio + if ( -1 !== ['radio', 'checkbox'].indexOf( elem.getAttribute('type') )) { + inputsWithDuplicateNames.push( elem.getAttribute('name') ); + return false; + } + return true; + }); + + // Visible fields + inputs.forEach(function(elem, i, elements) { + // Unnecessary fields + if ( + elem.getAttribute('type') === 'submit' || // type == submit + elem.getAttribute('name') === null || + elem.getAttribute('name') === 'ct_checkjs' + ) { + return; + } + // Invisible fields + if ( + getComputedStyle(elem).display === 'none' || // hidden + getComputedStyle(elem).visibility === 'hidden' || // hidden + getComputedStyle(elem).opacity === '0' || // hidden + elem.getAttribute('type') === 'hidden' // type == hidden + ) { + if ( elem.classList.contains('wp-editor-area') ) { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } else { + inputsInvisible += ' ' + elem.getAttribute('name'); + inputsInvisibleCount++; + } + // eslint-disable-next-line brace-style + } + // Visible fields + else { + inputsVisible += ' ' + elem.getAttribute('name'); + inputsVisibleCount++; + } + }); + + inputsInvisible = inputsInvisible.trim(); + inputsVisible = inputsVisible.trim(); + + return { + visible_fields: inputsVisible, + visible_fields_count: inputsVisibleCount, + invisible_fields: inputsInvisible, + invisible_fields_count: inputsInvisibleCount, + }; +} + +// eslint-disable-next-line camelcase,require-jsdoc +function apbct_visible_fields_set_cookie( visibleFieldsCollection, formId ) { + let collection = typeof visibleFieldsCollection === 'object' && visibleFieldsCollection !== null ? + visibleFieldsCollection : {}; + + if ( ctPublic.data__cookies_type === 'native' ) { + // eslint-disable-next-line guard-for-in + for ( let i in collection ) { + if ( i > 10 ) { + // Do not generate more than 10 cookies + return; + } + let collectionIndex = formId !== undefined ? formId : i; + ctSetCookie('apbct_visible_fields_' + collectionIndex, JSON.stringify( collection[i] ) ); + } + } else { + ctSetCookie('apbct_visible_fields', JSON.stringify( collection ) ); + } +} + +// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars +function apbct_js_keys__set_input_value(result, data, params, obj) { + if ( document.querySelectorAll('[name^=ct_checkjs]').length > 0 ) { + let elements = document.querySelectorAll('[name^=ct_checkjs]'); + for ( let i = 0; i < elements.length; i++ ) { + elements[i].value = result.js_key; + } + } +} + +/** + * @return {string} + */ +function apbctGetScreenInfo() { + return JSON.stringify({ + fullWidth: document.documentElement.scrollWidth, + fullHeight: Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight, + ), + visibleWidth: document.documentElement.clientWidth, + visibleHeight: document.documentElement.clientHeight, + }); +} + +// eslint-disable-next-line require-jsdoc +function ctParseBlockMessage(response) { + let msg = ''; + if (typeof response.apbct !== 'undefined') { + response = response.apbct; + if (response.blocked) { + msg = response.comment; + } + } + if (typeof response.data !== 'undefined') { + response = response.data; + if (response.message !== undefined) { + msg = response.message; + } + } + + if (msg) { + document.dispatchEvent( + new CustomEvent( 'apbctAjaxBockAlert', { + bubbles: true, + detail: {message: msg}, + } ), + ); + + // Show the result by modal + cleantalkModal.loaded = msg; + cleantalkModal.open(); + + if (+response.stop_script === 1) { + window.stop(); + } + } +} + +// eslint-disable-next-line no-unused-vars,require-jsdoc +function ctSetPixelUrlLocalstorage(ajaxPixelUrl) { + // set pixel to the storage + ctSetCookie('apbct_pixel_url', ajaxPixelUrl); +} + +// eslint-disable-next-line require-jsdoc +function ctNoCookieConstructHiddenField(type) { + let inputType = 'hidden'; + if (type === 'submit') { + inputType = 'submit'; + } + let field = ''; + + let noCookieData = getCleanTalkStorageDataArray(); + noCookieData = JSON.stringify(noCookieData); + noCookieData = '_ct_no_cookie_data_' + btoa(noCookieData); + field = document.createElement('input'); + field.setAttribute('name', 'ct_no_cookie_hidden_field'); + field.setAttribute('value', noCookieData); + field.setAttribute('type', inputType); + field.classList.add('apbct_special_field'); + field.classList.add('ct_no_cookie_hidden_field'); + return field; +} + +/** + * Retrieves the clentalk "cookie" data from starages. + * Contains {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}. + * @return {string} + */ +function getCleanTalkStorageDataArray() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + + let noCookieDataTypo = {typo: []}; + if (document.ctTypoData && document.ctTypoData.data) { + noCookieDataTypo = {typo: document.ctTypoData.data}; + } + + let noCookieDataFromUserActivity = {collecting_user_activity_data: []}; + + if (document.ctCollectingUserActivityData) { + let collectingUserActivityData = JSON.parse(JSON.stringify(document.ctCollectingUserActivityData)); + noCookieDataFromUserActivity = {collecting_user_activity_data: collectingUserActivityData}; + } + + return {...noCookieDataLocal, ...noCookieDataSession, ...noCookieDataTypo, ...noCookieDataFromUserActivity}; +} + +/** + * @return {boolean|*} + */ +function ctGetPageForms() { + let forms = document.forms; + if (forms) { + return forms; + } + return false; +} + +/** + * Get type of the field should be excluded. Return exclusion signs via object. + * @param {object} form Form dom object. + * @return {object} {'no_cookie': 1|0, 'visible_fields': 1|0} + */ +function ctGetHiddenFieldExclusionsType(form) { + // visible fields + let result = {'no_cookie': 0, 'visible_fields': 0}; + if ( + +ctPublic.data__visible_fields_required === 0 || + (form.method.toString().toLowerCase() === 'get' && + form.querySelectorAll('.nf-form-content').length === 0 && + form.id !== 'twt_cc_signup') || + form.classList.contains('slp_search_form') || // StoreLocatorPlus form + form.parentElement.classList.contains('mec-booking') || + form.action.toString().indexOf('activehosted.com') !== -1 || // Active Campaign + (form.id && form.id === 'caspioform') || // Caspio Form + (form.classList && form.classList.contains('tinkoffPayRow')) || // TinkoffPayForm + (form.classList && form.classList.contains('give-form')) || // GiveWP + (form.id && form.id === 'ult-forgot-password-form') || // ult forgot password + (form.id && form.id.toString().indexOf('calculatedfields') !== -1) || // CalculatedFieldsForm + (form.id && form.id.toString().indexOf('sac-form') !== -1) || // Simple Ajax Chat + (form.id && + form.id.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + (form.name && + form.name.toString().indexOf('cp_tslotsbooking_pform') !== -1) || // WP Time Slots Booking Form + form.action.toString() === 'https://epayment.epymtservice.com/epay.jhtml' || // Custom form + (form.name && form.name.toString().indexOf('tribe-bar-form') !== -1) || // The Events Calendar + (form.id && form.id === 'ihf-login-form') || // Optima Express login + (form.id && + form.id === 'subscriberForm' && + form.action.toString().indexOf('actionType=update') !== -1) || // Optima Express update + (form.id && form.id === 'ihf-main-search-form') || // Optima Express search + (form.id && form.id === 'frmCalc') || // nobletitle-calc + form.action.toString().indexOf('property-organizer-delete-saved-search-submit') !== -1 || + form.querySelector('a[name="login"]') !== null // digimember login form + ) { + result.visible_fields = 1; + } + + // ajax search pro exclusion + let ncFieldExclusionsSign = form.parentNode; + if ( + ncFieldExclusionsSign && ncFieldExclusionsSign.classList.contains('proinput') || + (form.name === 'options' && form.classList.contains('asp-fss-flex')) + ) { + result.no_cookie = 1; + } + + // woocommerce login form + if ( + form && form.classList.contains('woocommerce-form-login') + ) { + result.visible_fields = 1; + result.no_cookie = 1; + } + + return result; +} + +/** + * Check if the form should be skipped from hidden field attach. + * Return exclusion description if it is found, false otherwise. + * @param {object} form Form dom object. + * @param {string} hiddenFieldType Type of hidden field that needs to be checked. + * Possible values: 'no_cookie'|'visible_fields'. + * @return {boolean} + */ +function ctCheckHiddenFieldsExclusions(form, hiddenFieldType) { + const formAction = typeof(form.action) == 'string' ? form.action : ''; + // Ajax Search Lite + if (Boolean(form.querySelector('fieldset.asl_sett_scroll'))) { + return true; + } + // Super WooCommerce Product Filter + if (form.classList.contains('swpf-instant-filtering')) { + return true; + } + // PayU 3-rd party service forms + if (formAction.indexOf('secure.payu.com') !== -1 ) { + return true; + } + + if (formAction.indexOf('hsforms') !== -1 ) { + return true; + } + + if (typeof (hiddenFieldType) === 'string' && + ['visible_fields', 'no_cookie'].indexOf(hiddenFieldType) !== -1) { + const exclusions = ctGetHiddenFieldExclusionsType(form); + return exclusions[hiddenFieldType] === 1; + } + + return false; +} + +/** + * ctNoCookieAttachHiddenFieldsToForms + */ +function ctNoCookieAttachHiddenFieldsToForms() { + if (ctPublic.data__cookies_type !== 'none') { + return; + } + + let forms = ctGetPageForms(); + + if (forms) { + for ( let i = 0; i < forms.length; i++ ) { + if ( ctCheckHiddenFieldsExclusions(document.forms[i], 'no_cookie') ) { + continue; + } + + // ignore forms with get method @todo We need to think about this + if (document.forms[i].getAttribute('method') === null || + document.forms[i].getAttribute('method').toLowerCase() === 'post') { + // remove old sets + let fields = forms[i].querySelectorAll('.ct_no_cookie_hidden_field'); + for ( let j = 0; j < fields.length; j++ ) { + fields[j].outerHTML = ''; + } + // add new set + document.forms[i].append(ctNoCookieConstructHiddenField()); + } + } + } +} + +const defaultFetch = window.fetch; +const defaultSend = XMLHttpRequest.prototype.send; + +if (document.readyState !== 'loading') { + checkFormsExistForCatching(); +} else { + apbct_attach_event_handler(document, 'DOMContentLoaded', checkFormsExistForCatching); +} + +/** + * checkFormsExistForCatching + */ +function checkFormsExistForCatching() { + setTimeout(function() { + if (isFormThatNeedCatch()) { + window.fetch = function(...args) { + if (args && + args[0] && + typeof args[0].includes === 'function' && + args[0].includes('/wp-json/metform/') + ) { + let noCookieData = getNoCookieData(); + + if (args && args[1] && args[1].body) { + args[1].body.append('ct_no_cookie_hidden_field', noCookieData); + } + } + + return defaultFetch.apply(window, args); + }; + } + }, 1000); +} + +/** + * @return {boolean} + */ +function isFormThatNeedCatch() { + const formClasses = [ + 'metform-form-content', + ]; + let classExists = false; + + const forms = document.forms; + for (let form of forms) { + formClasses.forEach(function(classForm) { + if (form.classList.contains(classForm)) { + classExists = true; + } + }); + } + + return classExists; +} + +/** + * @param {HTMLElement} form + * @return {boolean} + */ +function isFormThatNeedCatchXhr(form) { + if (document.querySelector('div.elementor-widget[title=\'Login/Signup\']') != null) { + return false; + } + if (form && form.action && form.action.toString().indexOf('mailpoet_subscription_form') !== -1) { + return true; + } + + return false; +} + +/** + * @return {string} + */ +function getNoCookieData() { + let noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + let noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + let noCookieData = {...noCookieDataLocal, ...noCookieDataSession}; + noCookieData = JSON.stringify(noCookieData); + + return '_ct_no_cookie_data_' + btoa(noCookieData); +} + +/** + * Set three statements to the sessions storage: apbct_session_current_page, apbct_prev_referer. + * @return {void} + */ +function apbctWriteReferrersToSessionStorage() { + const sessionCurrentPage = apbctSessionStorage.get('apbct_session_current_page'); + + // set session apbct_referer + if (sessionCurrentPage!== false && document.location.href !== sessionCurrentPage) { + apbctSessionStorage.set('apbct_prev_referer', sessionCurrentPage, false); + } + + // set session current page to know referrer + apbctSessionStorage.set('apbct_session_current_page', document.location.href, false); +} + +/** + * WooCommerce add to cart by GET request params collecting + */ +function apbctCheckAddToCartByGet() { + // 1) Collect all links with add_to_cart_button class + document.querySelectorAll('a.add_to_cart_button:not(.product_type_variable):not(.wc-interactive)').forEach((el) => { + el.addEventListener('click', function(e) { + let href = el.getAttribute('href'); + // 2) Add to href attribute additional parameter ct_bot_detector_event_token gathered from apbctLocalStorage + let eventToken = apbctLocalStorage.get('bot_detector_event_token'); + if ( eventToken ) { + if ( href.indexOf('?') === -1 ) { + href += '?'; + } else { + href += '&'; + } + href += 'ct_bot_detector_event_token=' + eventToken; + el.setAttribute('href', href); + } + }); + }); +} + +/* Cleantalk Modal object */ +let cleantalkModal = { + + // Flags + loaded: false, + loading: false, + opened: false, + opening: false, + ignoreURLConvert: false, + + // Methods + load: function( action ) { + if ( ! this.loaded ) { + this.loading = true; + let callback = function( result, data, params, obj ) { + cleantalkModal.loading = false; + cleantalkModal.loaded = result; + document.dispatchEvent( + new CustomEvent( 'cleantalkModalContentLoaded', { + bubbles: true, + } ), + ); + }; + // eslint-disable-next-line camelcase + if ( typeof apbct_admin_sendAJAX === 'function' ) { + apbct_admin_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } else { + apbct_public_sendAJAX( {'action': action}, {'callback': callback, 'notJson': true} ); + } + } + }, + + open: function() { + /* Cleantalk Modal CSS start */ + let renderCss = function() { + let cssStr = ''; + // eslint-disable-next-line guard-for-in + for ( const key in this.styles ) { + cssStr += key + ':' + this.styles[key] + ';'; + } + return cssStr; + }; + let overlayCss = { + styles: { + 'z-index': '9999999999', + 'position': 'fixed', + 'top': '0', + 'left': '0', + 'width': '100%', + 'height': '100%', + 'background': 'rgba(0,0,0,0.5)', + 'display': 'flex', + 'justify-content': 'center', + 'align-items': 'center', + }, + toString: renderCss, + }; + let innerCss = { + styles: { + 'position': 'relative', + 'padding': '30px', + 'background': '#FFF', + 'border': '1px solid rgba(0,0,0,0.75)', + 'border-radius': '4px', + 'box-shadow': '7px 7px 5px 0px rgba(50,50,50,0.75)', + }, + toString: renderCss, + }; + let closeCss = { + styles: { + 'position': 'absolute', + 'background': '#FFF', + 'width': '20px', + 'height': '20px', + 'border': '2px solid rgba(0,0,0,0.75)', + 'border-radius': '15px', + 'cursor': 'pointer', + 'top': '-8px', + 'right': '-8px', + 'box-sizing': 'content-box', + }, + toString: renderCss, + }; + let closeCssBefore = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(45deg)', + }, + toString: renderCss, + }; + let closeCssAfter = { + styles: { + 'content': '""', + 'display': 'block', + 'position': 'absolute', + 'background': '#000', + 'border-radius': '1px', + 'width': '2px', + 'height': '16px', + 'top': '2px', + 'left': '9px', + 'transform': 'rotate(-45deg)', + }, + toString: renderCss, + }; + let bodyCss = { + styles: { + 'overflow': 'hidden', + }, + toString: renderCss, + }; + let cleantalkModalStyle = document.createElement( 'style' ); + cleantalkModalStyle.setAttribute( 'id', 'cleantalk-modal-styles' ); + cleantalkModalStyle.innerHTML = 'body.cleantalk-modal-opened{' + bodyCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-overlay{' + overlayCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close{' + closeCss + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:before{' + closeCssBefore + '}'; + cleantalkModalStyle.innerHTML += '#cleantalk-modal-close:after{' + closeCssAfter + '}'; + document.body.append( cleantalkModalStyle ); + /* Cleantalk Modal CSS end */ + + let overlay = document.createElement( 'div' ); + overlay.setAttribute( 'id', 'cleantalk-modal-overlay' ); + document.body.append( overlay ); + + document.body.classList.add( 'cleantalk-modal-opened' ); + + let inner = document.createElement( 'div' ); + inner.setAttribute( 'id', 'cleantalk-modal-inner' ); + inner.setAttribute( 'style', innerCss ); + overlay.append( inner ); + + let close = document.createElement( 'div' ); + close.setAttribute( 'id', 'cleantalk-modal-close' ); + inner.append( close ); + + let content = document.createElement( 'div' ); + if ( this.loaded ) { + const urlRegex = /(https?:\/\/[^\s]+)/g; + const serviceContentRegex = /.*\/inc/g; + if (serviceContentRegex.test(this.loaded) || this.ignoreURLConvert) { + content.innerHTML = this.loaded; + } else { + content.innerHTML = this.loaded.replace(urlRegex, '$1'); + } + } else { + content.innerHTML = 'Loading...'; + // @ToDo Here is hardcoded parameter. Have to get this from a 'data-' attribute. + this.load( 'get_options_template' ); + } + content.setAttribute( 'id', 'cleantalk-modal-content' ); + inner.append( content ); + + this.opened = true; + }, + + close: function() { + document.body.classList.remove( 'cleantalk-modal-opened' ); + document.getElementById( 'cleantalk-modal-overlay' ).remove(); + document.getElementById( 'cleantalk-modal-styles' ).remove(); + document.dispatchEvent( + new CustomEvent( 'cleantalkModalClosed', { + bubbles: true, + } ), + ); + }, + +}; + +/* Cleantalk Modal helpers */ +document.addEventListener('click', function( e ) { + if ( e.target && (e.target.id === 'cleantalk-modal-overlay' || e.target.id === 'cleantalk-modal-close') ) { + cleantalkModal.close(); + } +}); +document.addEventListener('cleantalkModalContentLoaded', function( e ) { + if ( cleantalkModal.opened && cleantalkModal.loaded ) { + document.getElementById( 'cleantalk-modal-content' ).innerHTML = cleantalkModal.loaded; + } +}); + +document.addEventListener('DOMContentLoaded', function() { + let ctTrpLocalize = undefined; + let ctTrpIsAdminCommentsList = false; + + if ( typeof ctPublic !== 'undefined' || typeof ctTrpAdminLocalize !== 'undefined' ) { + if ( typeof ctPublic !== 'undefined' && ctPublic.theRealPerson ) { + ctTrpLocalize = ctPublic.theRealPerson; + } + if ( + typeof ctTrpLocalize === 'undefined' && + typeof ctTrpAdminLocalize !== 'undefined' && + ctTrpAdminLocalize.theRealPerson + ) { + ctTrpLocalize = ctTrpAdminLocalize.theRealPerson; + ctTrpIsAdminCommentsList = true; + } + } + + if ( ! ctTrpLocalize ) { + return; + } + + // Selectors. Try to handle the WIDE range of themes. + let themesCommentsSelector = '.apbct-trp *[class*="comment-author"]'; + if ( document.querySelector('.apbct-trp .comment-author .comment-author-link') ) { + // For Spacious theme + themesCommentsSelector = '.apbct-trp *[class*="comment-author-link"]'; + } + let woocommerceReviewsSelector = '.apbct-trp *[class*="review__author"]'; + let adminCommentsListSelector = '.apbct-trp td[class*="column-author"] > strong'; + const trpComments = document.querySelectorAll( + themesCommentsSelector + ',' + + woocommerceReviewsSelector + ',' + + adminCommentsListSelector); + + if ( trpComments.length === 0 ) { + return; + } + + trpComments.forEach(( element, index ) => { + // Exceptions for items that are included in the selection + if ( + typeof pagenow == 'undefined' && + element.parentElement.className.indexOf('group') < 0 && + element.tagName != 'DIV' + ) { + return; + } + + let trpLayout = document.createElement('div'); + trpLayout.setAttribute('class', 'apbct-real-user-badge'); + + let trpImage = document.createElement('img'); + trpImage.setAttribute('src', ctTrpLocalize.imgPersonUrl); + trpImage.setAttribute('class', 'apbct-real-user-popup-img'); + + let trpDescription = document.createElement('div'); + trpDescription.setAttribute('class', 'apbct-real-user-popup'); + + let trpDescriptionHeading = document.createElement('p'); + trpDescriptionHeading.setAttribute('class', 'apbct-real-user-popup-header'); + trpDescriptionHeading.append(ctTrpLocalize.phrases.trpHeading); + + let trpDescriptionContent = document.createElement('div'); + trpDescriptionContent.setAttribute('class', 'apbct-real-user-popup-content_row'); + + let trpDescriptionContentSpan = document.createElement('span'); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent1 + ' '); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent2); + + if ( ctTrpIsAdminCommentsList ) { + let learnMoreLink = document.createElement('a'); + learnMoreLink.setAttribute('href', ctTrpLocalize.trpContentLink); + learnMoreLink.setAttribute('target', '_blank'); + learnMoreLink.text = ctTrpLocalize.phrases.trpContentLearnMore; + trpDescriptionContentSpan.append(' '); // Need one space + trpDescriptionContentSpan.append(learnMoreLink); + } + + trpDescriptionContent.append(trpDescriptionContentSpan); + trpDescription.append(trpDescriptionHeading, trpDescriptionContent); + trpLayout.append(trpImage); + element.append(trpLayout); + element.append(trpDescription); + }); + + const badges = document.querySelectorAll('.apbct-real-user-badge'); + + badges.forEach((badge) => { + let hideTimeout = undefined; + + this.body.addEventListener('click', function(e) { + if ( + e.target.className.indexOf('apbct-real-user') == -1 && + e.target.parentElement.className.indexOf('apbct-real-user') == -1 + ) { + closeAllPopupTRP(); + } + }); + + badge.addEventListener('click', function() { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.toggle('visible'); + } + }); + + badge.addEventListener('mouseenter', function() { + closeAllPopupTRP(); + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.add('visible'); + } + }); + + badge.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + const popup = badge.nextElementSibling; + popup.addEventListener('mouseenter', function() { + clearTimeout(hideTimeout); + popup.classList.add('visible'); + }); + + popup.addEventListener('mouseleave', function() { + hideTimeout = setTimeout(() => { + if (popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + // For mobile devices + badge.addEventListener('touchend', function() { + hideTimeout = setTimeout(() => { + const popup = this.nextElementSibling; + const selection = window.getSelection(); + // Check if no text is selected + if (popup && selection && popup.classList.contains('apbct-real-user-popup') && + selection.toString().length === 0 + ) { + popup.classList.remove('visible'); + } else { + clearTimeout(hideTimeout); + document.addEventListener('selectionchange', function onSelectionChange() { + const selection = window.getSelection(); + if (selection && selection.toString().length === 0) { + // Restart the hide timeout when selection is cleared + hideTimeout = setTimeout(() => { + const popup = badge.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 3000); + document.removeEventListener('selectionchange', onSelectionChange); + } + }); + } + }, 3000); + }); + }); +}); + +/** + * Closing all TRP popup + */ +function closeAllPopupTRP() { + let allDisplayPopup = document.querySelectorAll('.apbct-real-user-popup.visible'); + if (allDisplayPopup.length > 0) { + allDisplayPopup.forEach((element) => { + element.classList.remove('visible'); + }); + } +} + +/** + * Check form as internal. + * @param {int} currForm Current form. + */ +function ctCheckInternal(currForm) { + // Gathering data + const ctData = {}; + const elems = currForm.elements; + let key; + + for (key in elems) { + if (elems[key].type !== 'submit' && + elems[key].value !== undefined && + elems[key].value !== '') { + ctData[elems[key].name] = currForm.elements[key].value; + } + } + ctData.action = 'ct_check_internal'; + + // AJAX Request + apbct_public_sendAJAX( + ctData, + { + url: ctPublicFunctions._ajax_url, + callback: function(data) { + if (data.success === true) { + currForm.origSubmit(); + } else { + alert(data.data); + return false; + } + }, + }, + ); +} + +document.addEventListener('DOMContentLoaded', function() { + if ( ! +ctPublic.settings__forms__check_internal ) { + return; + } + + setTimeout(() => { + ctProtectInternalForms(); + }, 500); + + document.addEventListener('apbctForceProtectionAllowed', function() { + ctProtectInternalForms(); + }); +}); + +/** + * Protect internal forms + * @return {void} + */ +function ctProtectInternalForms() { + let ctCurrAction = ''; + let ctCurrForm = ''; + + for ( let i = 0; i < document.forms.length; i++ ) { + if ( typeof(document.forms[i].action) == 'string' ) { + ctCurrForm = document.forms[i]; + ctCurrAction = ctCurrForm.action; + if ( + ctCurrAction.indexOf('https?://') !== null && // The protocol is obligatory + ctCurrAction.match(ctPublic.blog_home + '.*?\.php') !== null && // Main check + ! ctCheckInternalIsExcludedForm(ctCurrAction) // Exclude WordPress native scripts from processing + ) { + const formClone = ctCurrForm.cloneNode(true); + ctCurrForm.parentNode.replaceChild(formClone, ctCurrForm); + + formClone.origSubmit = ctCurrForm.submit; + formClone.submit = null; + + formClone.addEventListener('submit', function(event) { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + ctCheckInternal(event.target); + return false; + }); + } + } + } +} + +/** + * Check by action to exclude the form checking + * @param {string} action + * @return {boolean} + */ +function ctCheckInternalIsExcludedForm(action) { + // An array contains forms action need to be excluded. + const ctInternalScriptExclusions = [ + 'wp-login.php', // WordPress login page + 'wp-comments-post.php', // WordPress Comments Form + ]; + + return ctInternalScriptExclusions.some((item) => { + return action.match(new RegExp(ctPublic.blog_home + '.*' + item)) !== null; + }); +} diff --git a/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php b/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php new file mode 100644 index 000000000..f3ef7e34d --- /dev/null +++ b/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php @@ -0,0 +1,41 @@ +getArrayCopy(); + } + + $needCommFuncBundle = !empty($settings['data__email_decoder']) && $settings['data__email_decoder'] === '1'; + $external = !empty($settings['forms__check_external']) && $settings['forms__check_external'] === '1'; + $internal = !empty($settings['forms__check_internal']) && $settings['forms__check_internal'] === '1'; + + if ($external && $internal) { + return $needCommFuncBundle + ? 'apbct-public-bundle_full-protection_comm-func.js' + : 'apbct-public-bundle_full-protection.js'; + } elseif ($external) { + return $needCommFuncBundle + ? 'apbct-public-bundle_ext-protection_comm-func.js' + : 'apbct-public-bundle_ext-protection.js'; + } elseif ($internal) { + return $needCommFuncBundle + ? 'apbct-public-bundle_int-protection_comm-func.js' + : 'apbct-public-bundle_int-protection.js'; + } else { + return $needCommFuncBundle + ? 'apbct-public-bundle_comm-func.js' + : 'apbct-public-bundle.js'; + } + } +} \ No newline at end of file From d135eec5a821b91c18a73294ca43d00e819df863 Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Mon, 19 May 2025 21:57:03 +0700 Subject: [PATCH 2/2] Mod. ApbctJsBundleResolver. Add newline --- lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php b/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php index f3ef7e34d..fa119bb7c 100644 --- a/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php +++ b/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php @@ -38,4 +38,4 @@ public static function getBundleName($settings) : 'apbct-public-bundle.js'; } } -} \ No newline at end of file +}