From c22868dd505565635c67ce3169a20dff7f1187cb Mon Sep 17 00:00:00 2001 From: svfcode Date: Fri, 2 May 2025 13:48:45 +0300 Subject: [PATCH 1/5] New. BrowserCheck. Draft. --- gulpfile.js | 5 + js/apbct-public--8--browser-check.min.js | 68 +++++++ js/apbct-public--8--browser-check.min.js.map | 1 + js/apbct-public-bundle.min.js | 2 +- js/apbct-public-bundle_ext-protection.min.js | 68 ++++++- ...ct-public-bundle_ext-protection.min.js.map | 2 +- js/apbct-public-bundle_full-protection.min.js | 68 ++++++- ...t-public-bundle_full-protection.min.js.map | 2 +- js/apbct-public-bundle_int-protection.min.js | 68 ++++++- ...ct-public-bundle_int-protection.min.js.map | 2 +- js/src/apbct-public--1--functions.js | 3 +- js/src/apbct-public--8--browser-check.js | 172 +++++++++++++++++ js/src/apbct-public-bundle.js | 176 +++++++++++++++++- js/src/apbct-public-bundle_ext-protection.js | 176 +++++++++++++++++- js/src/apbct-public-bundle_full-protection.js | 176 +++++++++++++++++- js/src/apbct-public-bundle_int-protection.js | 176 +++++++++++++++++- 16 files changed, 1153 insertions(+), 12 deletions(-) create mode 100644 js/apbct-public--8--browser-check.min.js create mode 100644 js/apbct-public--8--browser-check.min.js.map create mode 100644 js/src/apbct-public--8--browser-check.js diff --git a/gulpfile.js b/gulpfile.js index 9ec40be87..0e342e640 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -26,6 +26,7 @@ function compress_all_js() { '!js/src/apbct-common-functions.js', 'js/src/apbct-public--3--cleantalk-modal.js', 'js/src/apbct-public--7--trp.js', + 'js/src/apbct-public--8--browser-check.js', ]) .pipe(sourcemaps.init()) .pipe(uglify()) @@ -58,6 +59,7 @@ function bundle_src_js() { 'js/src/apbct-public--2*.js', 'js/src/apbct-public--3*.js', 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--8*.js', 'js/src/apbct-common-functions.js', ]) // Unminified bundle @@ -73,6 +75,7 @@ function bundle_src_js_external_protection() { 'js/src/apbct-public--2*.js', 'js/src/apbct-public--3*.js', 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--8*.js', 'js/src/apbct-public--5--external-forms.js', 'js/src/apbct-common-functions.js', ]) @@ -90,6 +93,7 @@ function bundle_src_js_internal_protection() { 'js/src/apbct-public--2*.js', 'js/src/apbct-public--3*.js', 'js/src/apbct-public--7*.js', + 'js/src/apbct-public--8*.js', 'js/src/apbct-public--6--internal-forms.js', 'js/src/apbct-common-functions.js', ]) @@ -110,6 +114,7 @@ function bundle_src_js_ext_int_protection() { 'js/src/apbct-public--5--external-forms.js', 'js/src/apbct-public--6--internal-forms.js', 'js/src/apbct-common-functions.js', + 'js/src/apbct-public--8*.js', ]) // Unminified bundle .pipe(concat('apbct-public-bundle_full-protection.js')) diff --git a/js/apbct-public--8--browser-check.min.js b/js/apbct-public--8--browser-check.min.js new file mode 100644 index 000000000..4f9563f8d --- /dev/null +++ b/js/apbct-public--8--browser-check.min.js @@ -0,0 +1,68 @@ +let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}document.addEventListener("DOMContentLoaded",function(){loaderContainer.className="ct-browser-check-container";let e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)];document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px";let t="botDetector",o="",r="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',r=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML=` + ${o} + > + `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `,document.head.appendChild(o),loaderContainer.style.cssText=` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` + border-bottom: 1px solid #bbbbbb; + `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` + border-top: 1px solid #bbbbbb; + `,o.textContent="Browser check",loaderContainer.appendChild(o)}); +//# sourceMappingURL=apbct-public--8--browser-check.min.js.map diff --git a/js/apbct-public--8--browser-check.min.js.map b/js/apbct-public--8--browser-check.min.js.map new file mode 100644 index 000000000..9e925436b --- /dev/null +++ b/js/apbct-public--8--browser-check.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EAoKpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAzKAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KAwBhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACJ,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBACRC,EAAM,4LACNC,EAAc,4DAEtB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CAtDA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EAsCDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file diff --git a/js/apbct-public-bundle.min.js b/js/apbct-public-bundle.min.js index cff391e3c..3d77c9c2a 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[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 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)})}))});var loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}function apbctSetEmailDecoderPopupAnimation(){var e=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],t=document.createElement("div");t.classList="apbct-ee-animation-wrapper";for(var o=0;o{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("DOMContentLoaded",function(){loaderContainer.className="ct-browser-check-container";var e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)],t=(document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px","botDetector"),o="",n="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',n=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML="\n ".concat(o,'\n >\n "),loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(function(){t()},3e3-(new Date-e)):setTimeout(function(){t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent='\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: ""; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n ',document.head.appendChild(o),loaderContainer.style.cssText="\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n ",document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText="\n border-bottom: 1px solid #bbbbbb;\n ",o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText="\n border-top: 1px solid #bbbbbb;\n ",o.textContent="Browser check",loaderContainer.appendChild(o)}); \ 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..58a3428b2 100644 --- a/js/apbct-public-bundle_ext-protection.min.js +++ b/js/apbct-public-bundle_ext-protection.min.js @@ -1,2 +1,68 @@ -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"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),_=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:m,o.ct_cookies_type=void 0!==n?n:_,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")})}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 s=void 0,d=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(s="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:s)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(s=ctTrpAdminLocalize.theRealPerson,d=!0),s){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,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)})}))}});let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}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> + `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `,document.head.appendChild(o),loaderContainer.style.cssText=` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` + border-bottom: 1px solid #bbbbbb; + `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` + border-top: 1px solid #bbbbbb; + `,o.textContent="Browser check",loaderContainer.appendChild(o)}),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(m){var e={};e[0]=apbct_collect_visible_fields(m),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=m.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(m);var n=m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of m.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of m.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of m.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==m.classList&&m.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=m.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==m.dataset.mailingListId){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),void(e=m.querySelector('[type="submit"]')).click()}if(m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("webto.salesforce.com")){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}if(n){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}var l,s,d=m,u=(m.parentElement.removeChild(m),m.apbctPrev),p=m.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")} //# 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..49235d253 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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 diff --git a/js/apbct-public-bundle_full-protection.min.js b/js/apbct-public-bundle_full-protection.min.js index 686eb2726..67e5d8313 100644 --- a/js/apbct-public-bundle_full-protection.min.js +++ b/js/apbct-public-bundle_full-protection.min.js @@ -1,2 +1,68 @@ -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()}))}); +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"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),_=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:m,o.ct_cookies_type=void 0!==n?n:_,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(m){var e={};e[0]=apbct_collect_visible_fields(m),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=m.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(m);var n=m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of m.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of m.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of m.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==m.classList&&m.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=m.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==m.dataset.mailingListId){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),void(e=m.querySelector('[type="submit"]')).click()}if(m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("webto.salesforce.com")){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}if(n){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}var l,s,d=m,u=(m.parentElement.removeChild(m),m.apbctPrev),p=m.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()}))});let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}document.addEventListener("DOMContentLoaded",function(){loaderContainer.className="ct-browser-check-container";let e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)];document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px";let t="botDetector",o="",c="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',c=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML=` + ${o} + > + `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `,document.head.appendChild(o),loaderContainer.style.cssText=` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` + border-bottom: 1px solid #bbbbbb; + `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` + border-top: 1px solid #bbbbbb; + `,o.textContent="Browser check",loaderContainer.appendChild(o)}); //# 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..0d8106f58 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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"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,GAExEzY,SAAS2Y,cAAc,IAAIC,YAAY,oBAAoB,CAAC,EAC5DhV,sBACI,eACA,CACIC,OAAQ,OACRnB,KAAM,CAAC2T,QAASA,CAAO,EACvBvS,SAAUA,EACVK,gBAAiBA,CACrB,CACJ,EACAnE,SAAS2Y,cAAc,IAAIC,YAAY,qBAAqB,CAAC,GAEf,eAAtC5W,kBAAkB2B,iBAC1Ba,sBACI,CACID,OAAQ,gCACR8R,QAASA,CACb,EACA,CACI5R,QAAS,EACTX,SAAUA,EACVK,gBAAiBA,EACjB0U,WAAY,SAAS3I,GACjBA,EAAI2D,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAQA,SAASiF,YAAYnN,GACboN,EAAU/Y,SAASqX,OAAOrL,MAAM,IAAIgN,OACpC,WAAarN,EAAKtE,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAO0R,EAAUL,mBAAmBK,EAAQ,EAAE,EAAI1F,KAAAA,CACtD,CAGA,SAAS4F,eAAeC,GAEpB,IAKQ/B,EALsC,SAAzCnV,kBAAkByU,qBAI8B,WAAzCzU,kBAAkByU,oBACtBU,EAAiC,WAAtBrU,SAASsU,SAAwB,WAAa,GAC7DpX,SAASqX,OAAS6B,EAAa,mEAAqE/B,GAG5FnV,kBAAkByU,mBAGlC,CAGA,SAASjS,sBAAsB9B,EAAMgN,EAAQyJ,GAEzChZ,IAAIiZ,EAAU,GAiBRvE,GAhBNuE,EAAkB,SAAI1J,EAAO5L,UAAY,KACzCsV,EAAyB,gBAAI1J,EAAOvL,iBAAmB,KACvDiV,EAA0B,iBAAI1J,EAAO2J,kBAAoB,KACzDD,EAAyB,gBAAI1J,EAAO4J,iBAAmB,KACvDF,EAAe,MAAI1J,EAAOU,OAAS,CAAA,EACnCgJ,EAAiB,QAAI1J,EAAOjL,SAAW,KACvC2U,EAAsB,aAAG1J,EAAOjL,QAAU,OAAS,OACnD2U,EAAiB,QAAI1J,EAAOkB,SAAW,KACvCwI,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAI1J,EAAOrJ,QAAU,KACrC+S,EAAiB,QAAI1J,EAAOa,SAAW,KACvC6I,EAAqB,YAAI1J,EAAOc,aAAe,KAC/C4I,EAAgB,OAAI1J,EAAO6J,QAAU,KACrCH,EAAkB,SAAI1J,EAAO8J,UAAY,KACzCJ,EAAc,KAAI1W,EAClB0W,EAAa,IAAIpX,kBAAkByX,UACrBrK,kBAAkB,GAEV,UAAlB,OAAO,GACAgK,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBvE,GAE1DuE,EAAc,KAAIA,EAAc,KAAI,aAAezJ,KAAKE,OAAO,IAExDuJ,EAAkB,WACrBA,EAAc,KAAE5J,YAAcqF,GAElCuE,EAAc,KAAEM,SAAW/J,KAAKE,OAAO,IAG3C,IAAI9H,WAAYwC,KAAK6O,CAAO,CAChC,CAGA,SAASxV,sBAAuBgR,EAAOlF,GACnCvP,IAAIiZ,EAAU,GACdA,EAAe,MAAIxE,EACnBwE,EAAkB,SAAI1J,EAAO5L,UAAY,KACzCsV,EAAyB,gBAAI1J,EAAOvL,iBAAmB,KACvDiV,EAAc,KAAI1J,EAAOhN,MAAQ,GACjC0W,EAAgB,OAAI1J,EAAO7L,QAAU,QAErC,IAAIkE,WAAY2C,KAAK0O,CAAO,CAChC,CAOA,SAASO,wBACL,OAAOhK,KAAKE,OAAO,EAAEqE,SAAS,EAAE,EAAE7M,QAAQ,WAAY,EAAE,EAAEuS,OAAO,EAAG,EAAE,CAC1E,CAEAzZ,IAAIyW,kBAAoB,CACpBiD,IAAK,SAAS5I,EAAK+D,GACU,KAAA,IAAbA,IACRA,EAAW,SAET8E,EAAe9K,aAAaC,QAAQgC,CAAG,EAC7C,GAAsB,OAAjB6I,EACD,IACI,IAAMC,EAAOtW,KAAKyL,MAAM4K,CAAY,EACpC,GAAKC,CAAAA,EAAKzK,eAAe0F,CAAQ,EAS7B,OAAO+E,EARP,IAEI,OAAOtW,KAAKyL,MAAO6K,EAAK/E,EAAU,CAItC,CAHE,MAAOuD,GAEL,OAAOwB,EAAK/E,GAAUd,SAAS,CACnC,CAMR,CAFE,MAAOqE,GACL,OAAOuB,CACX,CAEJ,MAAO,CAAA,CACX,EACAjD,IAAK,SAAS5F,EAAKzF,EAAOwO,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzO,MAAS/H,KAAKC,UAAU8H,CAAK,EAAG0O,UAAavK,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAAC,EACrGnL,aAAaG,QAAQ8B,EAAKxN,KAAKC,UAAUuW,CAAS,CAAC,GAEnDjL,aAAaG,QAAQ8B,EAAKzF,CAAK,CAEvC,EACA4O,QAAS,SAASnJ,EAAKoJ,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEGtZ,KAAK8Y,IAAI5I,EAAK,WAAW,EACxBoJ,EAAc1K,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAASrJ,GACZ,OAAqC,OAA9BjC,aAAaC,QAAQgC,CAAG,CACnC,EACAsJ,OAAQ,SAAStJ,GACbjC,aAAawL,WAAWvJ,CAAG,CAC/B,EACAwJ,iBAAkB,WACdta,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,kBAAkBiD,IAAI5I,CAAG,EAExD,CACA,OAAOvO,CACX,CAEJ,EAEIgY,oBAAsB,CACtBb,IAAK,SAAS5I,EAAK+D,GACU,KAAA,IAAbA,IACRA,EAAW,SAET8E,EAAea,eAAe1L,QAAQgC,CAAG,EAC/C,GAAsB,OAAjB6I,EACD,IACI,IAAMC,EAAOtW,KAAKyL,MAAM4K,CAAY,EACpC,OAAOC,EAAKzK,eAAe0F,CAAQ,EAAIvR,KAAKyL,MAAM6K,EAAK/E,EAAS,EAAI+E,CAGxE,CAFE,MAAOxB,GACL,OAAOuB,CACX,CAEJ,MAAO,CAAA,CACX,EACAjD,IAAK,SAAS5F,EAAKzF,EAAOwO,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzO,MAAS/H,KAAKC,UAAU8H,CAAK,EAAG0O,UAAavK,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAexL,QAAQ8B,EAAKxN,KAAKC,UAAUuW,CAAS,CAAC,GAErDU,eAAexL,QAAQ8B,EAAKzF,CAAK,CAEzC,EACA8O,MAAO,SAASrJ,GACZ,OAAuC,OAAhC0J,eAAe1L,QAAQgC,CAAG,CACrC,EACAsJ,OAAQ,SAAStJ,GACb0J,eAAeH,WAAWvJ,CAAG,CACjC,EACAwJ,iBAAkB,WACdta,IAAIuC,EAAO,GACX,IAAKvC,IAAIC,EAAE,EAAGA,EAAEua,eAAeta,OAAQD,CAAC,GAAI,CACxCD,IAAI8Q,EAAM0J,eAAe1J,IAAI7Q,CAAC,EACJ,CAAC,IAAvB6Q,EAAI9N,QAAQ,KAAK,GAAoC,CAAC,IAA1B8N,EAAI9N,QAAQ,QAAQ,IAChDT,EAAKuO,EAAIiD,SAAS,GAAKwG,oBAAoBb,IAAI5I,CAAG,EAE1D,CACA,OAAOvO,CACX,CACJ,EAUA,SAASkY,sBAAsBla,IAC1B,oBAAsBA,EAAMma,cACzBC,kBAAkCC,yBAAhBra,EAAMoH,MAAM,CACtC,CAUA,SAASkT,aAAata,IACjB,0BAA4BA,EAAMua,WAAe,SAAUva,EACtBqa,wBAAlCD,mBAA0Dpa,EAAMoH,MAAM,CAC9E,CAWA,SAASgT,kBAAkBjU,GACvB,IAGInG,EAHAmG,EAAQqU,aAAa,eAAe,IACxCrU,EAAQ9E,aAAa,gBAAiB,EAAE,EAEpCrB,EAAQ,IAAI6M,OAAOqL,YAAY,iBAAkB,CACjDuC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIxU,EAAQ8R,cAAcjY,CAAK,KAC5BmG,EAAQ2E,MAAQ,GAExB,CAWA,SAASuP,wBAAwBlU,GACxBA,EAAQqU,aAAa,eAAe,IACzCrU,EAAQe,gBAAgB,eAAe,EAGvCf,EAAQ8R,cAAc,IAAIpL,OAAOqL,YAAY,iBAAkB,CAC3DuC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAKMC,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,SAAS2Y,cAAc,IAAIkD,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,MAAO8M,QAAQ,EAChCoD,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,MAAO8M,QAAQ,EAAI,GAAI,CACb,EAC5CkE,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,MAAO8M,QAAQ,EAAImD,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,kBAAkBiD,IAAI,mCAAmC,EACxEyF,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,kBAAkBiD,IAAI,0BAA0B,EAC5B,YAA9B,OAAOmG,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,OACjBmW,UAAa7M,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,OACjBmW,UAAa7M,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,EACVmW,UAAa7M,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,kBAAkBiD,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzBwI,EAAiC,CAClC,GAAOzL,kBAAkBwD,QAAQ,kBAAmB,KAAQ,EAKxD,OADA+H,KAAAA,8BAA8BE,CAAoB,EAHlDzL,kBAAkB2D,OAAO,iBAAiB,CAMlD,CAE2C,SAAtCvY,kBAAkB2B,gBACnBC,sBACI,sBACA,CACIC,OAAQ,OACRC,SAAU,SAASC,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBue,SAAuC,IAA5Bve,EAAOZ,QAAQ,OAAO,IAE3EyT,kBAAkBiD,IAAI,iBAAiB,IAE1CjD,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,kBAAkBiD,IAAI,iBAAiB,IAE1CjD,kBAAkBC,IAAI,kBAAmB9S,CAAM,EAE/CkT,oCAAoC,GAGxC+K,cAAcje,CAAM,EAE5B,EACA8U,WAAY,SAAS3I,GACjBA,EAAI2D,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAKA,SAAS0O,mBACE3L,kBAAkB0D,MAAM,iBAAiB,GAAO1D,kBAAkBiD,IAAI,iBAAiB,IAC1F7V,YAAY,kBAAmB,MAAM,EACrC4S,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhC/V,SAAS2V,oBAC0BpD,KAAAA,IAAnCyF,YAAY,iBAAiB,GAE7B9U,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAAS4a,kBACEhI,kBAAkB0D,MAAM,gBAAgB,GAAO1D,kBAAkBiD,IAAI,gBAAgB,IACxF7V,YAAY,iBAAkB,MAAM,EACpC4S,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhC/V,SAAS2V,oBACyBpD,KAAAA,IAAlCyF,YAAY,gBAAgB,GAE5B9U,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAASkb,yBACAtI,kBAAkB0D,MAAM,sBAAsB,GAAM1D,kBAAkB0D,MAAM,eAAe,GAC5FkI,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACK5L,CAAAA,kBAAkB0D,MAAM,eAAe,GAAK1D,CAAAA,kBAAkBiD,IAAI,eAAe,GACjFjD,CAAAA,kBAAkB0D,MAAM,sBAAsB,GAAK1D,CAAAA,kBAAkBiD,IAAI,sBAAsB,GAE5D,WAAhC/Y,SAAS2V,oBAC+BpD,KAAAA,IAAxCyF,YAAY,sBAAsB,GACDzF,KAAAA,IAAjCyF,YAAY,eAAe,EANnC,CAaA3Y,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,kBAAkB0D,MAAM,sBAAsB,GAAO1D,kBAAkBiD,IAAI,sBAAsB,GACpGjD,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhC/V,SAAS2V,oBAC+BpD,KAAAA,IAAxCyF,YAAY,sBAAsB,GAEN,gBAAhChY,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,kBAAkB0D,MAAM,eAAe,GAAO1D,kBAAkBiD,IAAI,eAAe,GACtFjD,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhC/V,SAAS2V,oBACwBpD,KAAAA,IAAjCyF,YAAY,eAAe,GAEC,gBAAhChY,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,kBAAkBiD,IAAI,wBAAwB,EAC9CoG,cAAcnC,sBAAsB,GAGpC6F,EAAa/M,kBAAkBiD,IAAI,0BAA0B,KAE7D/C,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,wBAAwBhK,IAAI,0BAA0B,CAAC,CAGtF,CAAC,EACM/Y,SAASgjB,qBACZC,yBAAyB,EAG7BZ,8BAA8B,EAGzBzI,oBAAoBJ,MAAM,kBAAkB,EAW7C1D,kBAAkBC,IAAI,kBAAmBhN,OAAO+M,kBAAkBiD,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvFmK,EAAYrK,sBAAsB,EACxCe,oBAAoB7D,IAAI,mBAAoBmN,EAAW,CAAA,CAAK,EAC5DpN,kBAAkBC,IAAI,kBAAmB,CAAC,EACtC7W,SAASgD,UACQ,IAAIihB,IAAIjkB,SAASgD,QAAQ,EAC3BkhB,OAASphB,SAASohB,MAC7BxJ,oBAAoB7D,IAAI,qBAAsB7W,SAASgD,SAAU,CAAA,CAAK,GAOlFmhB,oCAAoC,EAdpC,IAgBMC,EAAcxN,kBAAkBiD,IAAI,iBAAiB,EAoBrDwK,GAnBCD,GAAeA,IAAgBtjB,SAAS2V,qBAC3CG,kBAAkBC,IAAI,kBAAmB/V,SAAS2V,kBAAkB,EACpEG,kBAAkB2D,OAAO,gBAAgB,EACzC3D,kBAAkB2D,OAAO,iBAAiB,GAGV,gBAAhCzZ,SAAS2V,qBACT+L,uBAAuB,EAEvBvd,WAAWud,uBAAwB,GAAI,GAG3CjV,OAAOhH,iBAAiB,iBAAkBqU,sBAAuB,CAAA,CAAI,EACrErN,OAAOhH,iBAAiB,QAASyU,aAAc,CAAA,CAAI,EACnDhb,SAASskB,WAAa,IAAIhI,WAC1Btc,SAASskB,WAAWtH,gBAAgB,EACpChd,SAASskB,WAAW9O,aAAa,EAGb,CAChB,CAAC,kBAAmB7F,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAekD,OAAOkH,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkB1V,UAAU2V,aAWjC,GARA7N,kBAAkBC,IAAI,kBAAmBlH,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAAC,EAChFvD,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,IACI+Y,EADgBwL,EAAatkB,GAAGukB,KAAK,EACVlf,MAAM,GAAG,EAAE,GACW,IAAhDyT,EAAW/V,QAAQ,uBAAuB,GAC3C8V,eAAeC,CAAU,CAEjC,CAER,CAGI,CAAA,CAACpY,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,kBAAkB0D,MAAM,YAAY,EACpC+J,EAAYrb,KAAK,CAAC,aAAc4N,kBAAkBiD,IAAI,YAAY,EAAE,EAEpEwK,EAAYrb,KAAK,CAAC,aAAc,EAAE,EAItCwO,8BAA8B,EAG9BrX,IAAI4kB,EAAmBnO,kBAAkBiD,IAAI,0BAA0B,EAqGnE1Y,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,CACb/O,WAAY,SAAS3I,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,kBAAkBiD,IAAI,0BAA0B,EAG1C,OAA9BsO,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,kBAAoBhQ,YAAY9W,kBAAkBsV,aAAe,mBAAmB,EACnGuR,EAAeE,wBAA0BjQ,YAAY9W,kBAAkBsV,aAAe,yBAAyB,EAC/GuR,EAAeG,WAAalQ,YAAY9W,kBAAkBsV,aAAe,YAAY,EACrFuR,EAAeI,iBAAmBnQ,YAAY9W,kBAAkBsV,aAAe,kBAAkB,EACjGuR,EAAeK,gBAAkBpQ,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EAC/FuR,EAAeM,gBAAkBrQ,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EAC/FuR,EAAeO,eAAiBtQ,YAAY9W,kBAAkBsV,aAAe,gBAAgB,EAC7FuR,EAAeQ,YAAcvQ,YAAY9W,kBAAkBsV,aAAe,aAAa,EAGvF,IAAMgS,EAA2B1S,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,gBAAgB,EAClGiS,EAA4B3S,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,iBAAiB,EACpGkS,EAA4B5S,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,iBAAiB,EACpGmS,EAAgB7S,kBAAkBiD,IAAI,iBAAiB,EACvD6P,EAAmBhP,oBAAoBb,IAAI,oBAAoB,EAC/D8P,EAAmBjP,oBAAoBb,IAAI,oBAAoB,EAC/D+P,EAAyBhT,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,cAAc,EAC9FuS,EAAajT,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,iBAAiB,EACrFwS,EAAgBlT,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,gBAAgB,EACvFyS,EAA+BnT,kBAAkBiD,IACnD7X,kBAAkBsV,aAAe,mCACrC,EAGM0S,EAAqBlR,YAAY9W,kBAAkBsV,aAAe,gBAAgB,EAClF2S,EAAsBnR,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EACpF4S,EAAsBpR,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EACpF6S,EAAoBrR,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EAClF8S,EAAsB,CAAC,CAACtR,YAAY9W,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,EAAQyJ,GAC1D,GAA8D,EAAzDnZ,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,SAAS2Y,cACL,IAAIC,YAAa,qBAAsB,CACnCuC,QAAS,CAAA,EACTE,OAAQ,CAACvN,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,IAAI8a,EAAY,SACH,WAATtF,IACAsF,EAAY,UAEhB9a,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,OAAQkZ,CAAS,EACpCgC,EAAM/c,UAAUsB,IAAI,qBAAqB,EACzCyb,EAAM/c,UAAUsB,IAAI,2BAA2B,EACxCyb,CACX,CAOA,SAASmL,+BACLjoB,IAWQ+sB,EAXJC,EAAoBvW,kBAAkB6D,iBAAiB,EACvD2S,EAAsB1S,oBAAoBD,iBAAiB,EAE/Dta,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,kBAAkB6D,iBAAiB,EACvD2S,EAAsB1S,oBAAoBD,iBAAiB,EAC3DsL,EAAe,CAAC,GAAGoH,EAAmB,GAAGC,CAAmB,EAChErH,EAAetiB,KAAKC,UAAUqiB,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS5B,sCACL,IAAMqK,EAAqB9T,oBAAoBb,IAAI,4BAA4B,EAGrD,CAAA,IAAtB2U,GAA+BxuB,SAAS8C,SAASC,OAASyrB,GAC1D9T,oBAAoB7D,IAAI,qBAAsB2X,EAAoB,CAAA,CAAK,EAI3E9T,oBAAoB7D,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,kBAAkBiD,IAAI,0BAA0B,EAC5D8J,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,EAAQyJ,GAC3CwT,eAAe8B,QAAU,CAAA,EACzB9B,eAAeC,OAAS7oB,EACxB/D,SAAS2Y,cACL,IAAIC,YAAa,8BAA+B,CAC5CuC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAOrW,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,SAAS2Y,cACL,IAAIC,YAAa,uBAAwB,CACrCuC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EA0LA,SAASqV,mBACLrwB,IAAIswB,EAAkBzwB,SAASuH,iBAAiB,gCAAgC,EACnD,EAAzBkpB,EAAgBpwB,QAChBowB,EAAgBprB,QAAQ,IACpBwB,EAAQ3G,UAAUiG,OAAO,SAAS,CACtC,CAAC,CAET,CAKA,SAASuqB,oBACL,IAAKvwB,IAAIC,EAAI,EAAGA,EAAIJ,SAASuV,MAAMlV,OAAQD,CAAC,GACxC,GAAkDiT,KAAAA,IAA9CrT,SAASuV,MAAMnV,GAAGuwB,yBAC4Btd,KAAAA,IAA9CrT,SAASuV,MAAMnV,GAAGwwB,wBAAuC,CAEzD,IA2CcC,EA3CRC,EAAc9wB,SAASuV,MAAMnV,GAGnC,GAAK2wB,CAAAA,gBAAgBD,CAAW,EAKhC,GAAKE,iBAAiBF,CAAW,EAC7BG,yBAAyBH,EAAa1wB,EAAGJ,QAAQ,OAG9C,GAEmCqT,KAAAA,IAAtCyd,EAAYvtB,QAAQ2tB,eACW,UAA9B,OAAOJ,EAAkB,QACkC,CAAC,IAAxDA,EAAYvsB,OAAOpB,QAAQ,sBAAsB,GACvB,UAA9B,OAAO2tB,EAAkB,QAC1BA,EAAYnrB,cAAc,0BAA0B,GAElB,UAA9B,OAAOmrB,EAAkB,QACqB,CAAC,IAA/CA,EAAYvsB,OAAOpB,QAAQ,aAAa,GACxC2tB,EAAYxlB,aAAa,kBAAkB,EAG/C6lB,qCAAqCL,EAAa1wB,EAAGJ,QAAQ,OAE1D,GAC2B,UAA9B,OAAO8wB,EAAkB,SACmB,CAAC,IAA3CA,EAAYvsB,OAAOpB,QAAQ,SAAS,GACS,CAAC,IAA5C2tB,EAAYvsB,OAAOpB,QAAQ,UAAU,GAC3C,CACEhD,IAAIixB,EAAMN,EAAYvsB,OAAOkB,MAAM,IAAI,GACvC2rB,EAAMA,EAAI,GAAG3rB,MAAM,GAAG,GACL,GAAG6G,YAAY,IAEnBxJ,SAASuuB,SAAS/kB,YAAY,KACjCglB,EAAWtxB,SAASC,cAAc,OAAO,GACtC0L,KAAO,0BAChB2lB,EAAS9lB,MAAQslB,EAAYvsB,OAC7B+sB,EAAS3b,KAAO,SAChBmb,EAAYjsB,YAAYysB,CAAQ,GAE1BT,EAAW7wB,SAASC,cAAc,OAAO,GACtC0L,KAAO,0BAChBklB,EAASrlB,MAAQslB,EAAYjtB,OAC7BgtB,EAASlb,KAAO,SAEhBmb,EAAYjtB,OAAS,OAErBitB,EAAYjsB,YAAYgsB,CAAQ,EAEhCC,EAAYvsB,OAASvE,SAAS8C,SAEtC,CACJ,CAGJyuB,oBAAoB,EAEpB/O,uBAAuB,CAC3B,CAOA,SAASuO,gBAAgBD,GA0BrB3wB,IAAI4D,EAAS,CAAA,EAEb,IAEQ+sB,EAAYpkB,eACiC,EAA7CokB,EAAYpkB,cAAcxM,UAAUG,QACyB,CAAC,IAA9DywB,EAAYpkB,cAAcxM,UAAU,GAAGiD,QAAQ,QAAQ,IACvDY,EAAS,CAAA,GAG8B,OAAvC+sB,EAAYxlB,aAAa,QAAQ,GAdd,CACvB,6BAcuBjG,QAAQ,SAASmsB,GACoC,CAAC,IAAjEV,EAAYxlB,aAAa,QAAQ,EAAEnI,QAAQquB,CAAe,IAC1DztB,EAAS,CAAA,EAEjB,CAAC,EAxCc,CACnB,YACA,UACA,2BACA,WAuCesB,QAAQ,SAASosB,GAC5B,IAAM7F,EAASkF,EAAYxlB,aAAa,IAAI,EACvCsgB,MAAAA,GAAsF,CAAC,IAAjCA,EAAOzoB,QAAQsuB,CAAW,IACjF1tB,EAAS,CAAA,EAEjB,CAAC,EArCqB,CACtB,cACA,UACA,uBACA,kBACA,iBACA,UACA,oBAgCkBsB,QAAQ,SAASqsB,GAC/BvxB,IAAIwxB,EAAa,GAMjB,IAAMC,EAJFD,EADAb,EAAYxlB,aAAa,OAAO,EACnBwlB,EAAYxlB,aAAa,OAAO,EAEhCumB,kBAAkBf,EAAaY,CAAc,EAGzDE,MAAAA,GAAgG,CAAC,IAAvCA,EAAUzuB,QAAQuuB,CAAc,IAEvF3tB,EADA+sB,CAAAA,EAAYxlB,aAAa,kBAAkB,EAMvD,CAAC,EA1DoB,CACrB,UA2DiBjG,QAAQ,SAASysB,GAC9B,IAAMC,EAAWjB,EAAYxlB,aAAa,IAAI,EACzCymB,MAAAA,GAA2F,CAAC,IAArCA,EAAS5uB,QAAQ2uB,CAAa,IACtF/tB,EAAS,CAAA,EAEjB,CAAC,CAGL,CAFE,MAAOwU,GACL7T,QAAQstB,MAAM,oCAAqCzZ,CAAC,CACxD,CAEA,OAAOxU,CACX,CAQA,SAAS8tB,kBAAkBf,EAAaY,GACpC,GAA2B,UAAvB,OAAM,GAA6BZ,EAAYnrB,cAAc,IAAM+rB,CAAc,EACjF,OAAOA,CAEf,CAKA,SAASH,sBACL,IAAMU,EAASjyB,SAASkyB,qBAAqB,QAAQ,EAErD,GAAqB,EAAhBD,EAAO5xB,OACR,IAAMF,IAAI4tB,EAAI,EAAGA,EAAIkE,EAAO5xB,OAAQ0tB,CAAC,GACjC,GAAkC,MAA7BkE,EAAOlE,GAAGoE,gBAAf,CAIA,IAAMC,EAAcH,EAAOlE,GAAGoE,gBAAgB5c,MAC9C,GAA4B,IAAvB6c,EAAY/xB,OAIjB,IAAMF,IAAIkyB,EAAI,EAAGA,EAAID,EAAY/xB,OAAQgyB,CAAC,GAAK,CAC3C,IAAMvB,EAAcsB,EAAYC,GAC3BtB,gBAAgBD,CAAW,GAGhCG,yBAAyBH,EAAauB,EAAGJ,EAAOlE,GAAGoE,eAAe,CACtE,CAbA,CAgBZ,CAQA,SAASlB,yBAAyBH,EAAawB,EAAUC,GACrD,IAAMC,EAAuBxyB,SAASC,cAAc,GAAG,EAOjDwyB,GANND,EAAqBroB,UAAY,wBACjCqoB,EAAqBnwB,MAAQ,gBAE7ByuB,EAAYpkB,cAAcgmB,aAAaF,EAAsB1B,CAAW,EAG3DA,EAAY6B,iBACnBC,EAAW9B,EAAY7qB,UACvB4sB,EAAe/B,EAMfgC,GAHNhC,EAAYpkB,cAAc6Y,YAAYuL,CAAW,EAG7B9wB,SAASC,cAAc,KAAK,GAI1C8yB,GAHND,EAAY5wB,UAAY0wB,EACxBH,EAAK1lB,MAAM+lB,EAAYE,iBAAiB,EAEpBhzB,SAASC,cAAc,OAAO,GAClD8yB,EAAYpnB,KAAO,SACnBonB,EAAYvnB,MAAQ,6BACpBunB,EAAYpd,KAAO,SAEnB,IAAMsd,EAAmBV,EAAehd,MAAM+c,GAO1CY,GALJD,EAAiBpuB,YAAYkuB,CAAW,EACxCE,EAAiBE,UAAYV,EAC7BQ,EAAiBG,kBAAoBP,EAGP,CAAA,GACKxf,KAAAA,IAA/B4f,EAAiB/yB,WAES,CAAC,iBAAkB,iBAC3BmF,QAAQ,SAASguB,GAC3BJ,EAAiB/yB,UAAUkmB,SAASiN,CAAe,IACnDH,EAA0BG,EAElC,CAAC,EAGDC,EAAyB,KACxBJ,EAEII,OADLA,EAAyBL,EAAiBttB,cAAc,uBAAuB,IAE3E2tB,EAAuB/sB,iBAAiB,QAAS,SAAS7F,GACtDA,EAAM0C,eAAe,EACrBmwB,yBAAyBN,CAAgB,CAC7C,CAAC,EAKTV,EAAehd,MAAM+c,GAAU3M,SAAW,SAASjlB,GAC/CA,EAAM0C,eAAe,EACrBmwB,yBAAyB7yB,EAAM8yB,aAAa,CAChD,CACJ,CAQA,SAASrC,qCAAqCL,EAAawB,EAAUC,GACjE,IAOM9lB,EAWAsmB,EAKAE,EAvBAQ,EAAuB3C,EAAYnrB,cAAc,iBAAiB,EAClE+tB,EAAmB5C,EAAYnrB,cAAc,iBAAiB,EAAEoW,KAAK4J,SAEpE8N,IAIDhnB,EAASgnB,EAAqB/mB,cAC9BinB,EAAmBF,EAAqBxtB,UAG9CwtB,EAAqBttB,OAAO,GAGtB2sB,EAAc9yB,SAASC,cAAc,KAAK,GACpCiC,UAAYyxB,EACxBlnB,EAAO5H,YAAYiuB,EAAYE,iBAAiB,GAE1CD,EAAc/yB,SAASC,cAAc,OAAO,GACtC0L,KAAO,SACnBonB,EAAYvnB,MAAQ,6BACpBunB,EAAYpd,KAAO,UAEbsd,EAAmBV,EAAehd,MAAM+c,IAE7BztB,YAAYkuB,CAAW,EACxCE,EAAiBW,YAAcnnB,EAC/BwmB,EAAiBQ,qBAAuBA,EACxCR,EAAiBS,iBAAmBA,EAEpCnB,EAAehd,MAAM+c,GAAU3M,SAAW,SAASjlB,GAC/CA,EAAM0C,eAAe,EAGrBywB,0BAA0BnzB,EAAM8yB,aAAa,EAE7CD,yBAAyB7yB,EAAM8yB,aAAa,CAChD,EACJ,CAMA,SAASK,0BAA0B9X,GAC/B,IAEUxL,EAFJujB,EAAgB/X,EAAKpW,cAAc,uBAAuB,EAC3DmuB,IACKvjB,EAAUujB,EAAcnuB,cAAc,GAAG,EACzCouB,EAAaD,EAAcnuB,cAAc,MAAM,EACjD4K,IAAWwjB,IACkB,GAAxBxjB,EAAQlO,MAAM2xB,QACfD,EAAW1xB,MAAM8K,QAAU,EAC3BoD,EAAQlO,MAAM2xB,OAAS,CAAC,EACxBzjB,EAAQlO,MAAM8K,QAAU,IAExB4mB,EAAW1xB,MAAM8K,QAAU,EAC3BoD,EAAQlO,MAAM2xB,OAAS,EACvBzjB,EAAQlO,MAAM8K,QAAU,GAIxC,CAOA,SAAS8mB,sCAAsCC,EAAYC,GACvD,IAAMC,EAAeF,EAAW3sB,iBAAiB,iCAAiC,EAClF,IAAM8sB,EAAeF,EAAW5sB,iBAAiB,iCAAiC,EAEV,CAAC,IAArE2sB,EAAWjuB,UAAU9C,QAAQ,iCAAiC,GAC9DmxB,sBAAsBJ,CAAU,GAC8B,CAAC,IAA/DA,EAAWjuB,UAAU9C,QAAQ,2BAA2B,GACQ,CAAC,IAAjE+wB,EAAWjuB,UAAU9C,QAAQ,6BAA6B,GACL,CAAC,IAAtD+wB,EAAWjuB,UAAU9C,QAAQ,kBAAkB,GACkB,CAAC,IAAlE+wB,EAAWjuB,UAAU9C,QAAQ,8BAA8B,EAE3DixB,EAAa/uB,QAAQ,IACjBgvB,EAAahvB,QAAQ,IACbkvB,EAAW5oB,OAAS6oB,EAAW7oB,OACP,aAApB6oB,EAAW7e,MAA2C,UAApB6e,EAAW7e,KAC7C6e,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWhpB,MAAQkpB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,EAKLH,EAAa/uB,QAAQ,IACjBgvB,EAAahvB,QAAQ,IACbkvB,EAAWtuB,YAAcuuB,EAAWvuB,YACZ,aAApBuuB,EAAW7e,MAA2C,UAApB6e,EAAW7e,KAC7C6e,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWhpB,MAAQkpB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,CACL,CAqBA,SAASI,uBACL,GAAK30B,SAAS2F,cAAc,uDAAuD,EAAnF,CAIAxF,IAAIC,EAAIue,YAAY,KAChB,IAAMiW,EAAe50B,SAASuH,iBAAiB,mBAAmB,EAC9DqtB,EAAav0B,SACb4f,cAAc7f,CAAC,EACfw0B,EAAavvB,QAAQ,CAAC0W,EAAM8Y,KACxBC,gCAAgC/Y,EAAM8Y,EAAO70B,QAAQ,CACzD,CAAC,EAET,EAAG,GAAG,CAVN,CAWJ,CAQA,SAAS80B,gCAAgC/Y,EAAMuW,EAAUC,GACrD,IAYIwC,EAZEC,EAAMjZ,EAAKpW,cAAc,kCAAkC,EAC5DqvB,IAGLA,EAAIC,SAAW,CAAA,GAETlC,EAAc/yB,SAASC,cAAc,OAAO,GACtC0L,KAAO,SACnBonB,EAAYvnB,MAAQ,6BACpBunB,EAAYpd,KAAO,SACnBoG,EAAKlX,YAAYkuB,CAAW,GAExBgC,EAAQ/0B,SAASC,cAAc,KAAK,GAClCsC,GAAK,sBACXwyB,EAAM1yB,MAAMof,MAAQ,OACpBsT,EAAM1yB,MAAM+e,OAAS,OACrB2T,EAAM1yB,MAAM+sB,WAAa,QACzB2F,EAAM1yB,MAAM8K,QAAU,EACtB4nB,EAAM1yB,MAAM8sB,SAAW,WACvB4F,EAAM1yB,MAAM0e,IAAM,EAClBgU,EAAM1yB,MAAM+P,OAAS,UACrB2iB,EAAMG,QAAU,SAAS3c,GACrBgb,yBAAyBxX,CAAI,CACjC,EACAiZ,EAAI1M,WAAWjmB,MAAM8sB,SAAW,WAChC6F,EAAI1M,WAAWzjB,YAAYkwB,CAAK,EACpC,CAKA,SAASI,yBACLh1B,IAAIi1B,EAAUp1B,SAASuH,iBAAiB,QAAQ,EAC3B,EAAjB6tB,EAAQ/0B,QACR+0B,EAAQ/vB,QAAQ,SAASgwB,GACjBA,EAA4C,CAAC,IAA7CA,EAAOC,IAAInyB,QAAQ,mBAAmB,GACS,CAAC,IAAhDkyB,EAAOC,IAAInyB,QAAQ,sBAAsB,GACU,CAAC,IAApDkyB,EAAOC,IAAInyB,QAAQ,0BAA0B,GACD,CAAC,IAA7CkyB,EAAOC,IAAInyB,QAAQ,mBAAmB,GACtCkyB,EAAOn1B,UAAUkmB,SAAS,gBAAgB,GACD,CAAC,IAAxCiP,EAAOC,IAAInyB,QAAQ,cAAc,GAA2D,CAAC,IAAhDkyB,EAAOC,IAAInyB,QAAQ,sBAAsB,IAGpF,CAAA,IAAUyT,kBAAkBiD,IAAI,yBAAyB,GACC,EAA1DjD,kBAAkBiD,IAAI,yBAAyB,EAAExZ,QAC5B,KAAA,IAAdg1B,EAAO9yB,IAC0D,CAAC,IAAzEqU,kBAAkBiD,IAAI,yBAAyB,EAAE1W,QAAQkyB,EAAO9yB,KAIpEgzB,8BAA8BF,CAAM,CAE5C,CAAC,CAET,CA1pBAr1B,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,IAAIq1B,EAAgBniB,KAAAA,EAChBoiB,EAA2B,CAAA,EAgB/B,GAdyB,aAApB,OAAO30B,UAA0D,aAA9B,OAAO40B,oBAKd,KAAA,KAHzBF,EADqB,aAApB,OAAO10B,UAA4BA,SAAS60B,cAC7B70B,SAAS60B,cAGlBH,IACuB,aAA9B,OAAOE,oBACPA,mBAAmBC,gBAEnBH,EAAgBE,mBAAmBC,cACnCF,EAA2B,CAAA,GAI5BD,EAAP,CAKAr1B,IAAIy1B,EAAyB,wCACxB51B,SAAS2F,cAAc,iDAAiD,IAEzEiwB,EAAyB,8CAE7Bz1B,IAEM01B,EAAc71B,SAASuH,iBACzBquB,EAF4B,uFAIH,EAED,IAAvBC,EAAYx1B,SAIjBw1B,EAAYxwB,QAAQ,CAAEwB,EAASguB,KAE3B,IAQIiB,EAGAC,EAIAC,EAGAC,EAIAC,EAGAC,EAKIC,EA7Bc,aAAlB,OAAOC,SACPxvB,EAAQ6F,cAAcvC,UAAUhH,QAAQ,OAAO,EAAI,GAChC,OAAnB0D,EAAQwF,WAKRypB,EAAY91B,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uBAAuB,GAEnDg0B,EAAW/1B,SAASC,cAAc,KAAK,GAClC8B,aAAa,MAAOyzB,EAAcc,YAAY,EACvDP,EAASh0B,aAAa,QAAS,2BAA2B,GAEtDi0B,EAAiBh2B,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uBAAuB,GAExDk0B,EAAwBj2B,SAASC,cAAc,GAAG,GAChC8B,aAAa,QAAS,8BAA8B,EAC1Ek0B,EAAsBz1B,OAAOg1B,EAAce,QAAQC,UAAU,GAEzDN,EAAwBl2B,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,mCAAmC,GAE3Eo0B,EAA4Bn2B,SAASC,cAAc,MAAM,GACnCO,OAAOg1B,EAAce,QAAQE,YAAc,GAAG,EACxEN,EAA0B31B,OAAOg1B,EAAce,QAAQG,WAAW,EAE7DjB,KACGW,EAAgBp2B,SAASC,cAAc,GAAG,GAChC8B,aAAa,OAAQyzB,EAAcmB,cAAc,EAC/DP,EAAcr0B,aAAa,SAAU,QAAQ,EAC7Cq0B,EAAcQ,KAAOpB,EAAce,QAAQM,oBAC3CV,EAA0B31B,OAAO,GAAG,EACpC21B,EAA0B31B,OAAO41B,CAAa,GAGlDF,EAAsB11B,OAAO21B,CAAyB,EACtDH,EAAex1B,OAAOy1B,EAAuBC,CAAqB,EAClEJ,EAAUt1B,OAAOu1B,CAAQ,EACzBlvB,EAAQrG,OAAOs1B,CAAS,EACxBjvB,EAAQrG,OAAOw1B,CAAc,EACjC,CAAC,EAEch2B,SAASuH,iBAAiB,wBAAwB,EAE1DlC,QAAQ,IACXlF,IAAI22B,EAAczjB,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,EAEDuG,EAAMxwB,iBAAiB,QAAS,WAC5B,IAAMrB,EAAQnE,KAAKi2B,mBACf9xB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUoK,OAAO,SAAS,CAExC,CAAC,EAEDysB,EAAMxwB,iBAAiB,aAAc,WACjCiqB,iBAAiB,EACjB,IAAMtrB,EAAQnE,KAAKi2B,mBACf9xB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUsB,IAAI,SAAS,CAErC,CAAC,EAEDu1B,EAAMxwB,iBAAiB,aAAc,WACjCuwB,EAAc7xB,WAAW,KACrB,IAAMC,EAAQnE,KAAKi2B,mBACf9xB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAEa4wB,EAAMC,oBACpB9xB,EAAMqB,iBAAiB,aAAc,WACjC0wB,aAAaH,CAAW,EACxB5xB,EAAMhF,UAAUsB,IAAI,SAAS,CACjC,CAAC,EAED0D,EAAMqB,iBAAiB,aAAc,WACjCuwB,EAAc7xB,WAAW,KACjBC,EAAMhF,UAAUkmB,SAAS,uBAAuB,GAChDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAGD4wB,EAAMxwB,iBAAiB,WAAY,WAC/BuwB,EAAc7xB,WAAW,KACrB,IAAMC,EAAQnE,KAAKi2B,mBACbE,EAAY3pB,OAAOmI,aAAa,EAElCxQ,GAASgyB,GAAahyB,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACtC,IAAhC8Q,EAAUhjB,SAAS,EAAE7T,OAErB6E,EAAMhF,UAAUiG,OAAO,SAAS,GAEhC8wB,aAAaH,CAAW,EACxB92B,SAASuG,iBAAiB,kBAAmB,SAAS4wB,IAClD,IAAMD,EAAY3pB,OAAOmI,aAAa,EAClCwhB,GAA6C,IAAhCA,EAAUhjB,SAAS,EAAE7T,SAElCy2B,EAAc7xB,WAAW,KACrB,IAAMC,EAAQ6xB,EAAMC,mBAChB9xB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,EACPnG,SAASgB,oBAAoB,kBAAmBm2B,CAAiB,EAEzE,CAAC,EAET,EAAG,GAAI,CACX,CAAC,CACL,CAAC,EAlJD,CAmJJ,CAAC,EAwYDvgB,kBAAkBC,IAAI,0BAA2B,EAAE,EACnDtJ,OAAOhH,iBAAiB,OAAQ,WACrB,CAACzF,SAASs2B,kCAIjBnyB,WAAW,WACPyrB,kBAAkB,EAClB2G,yBAAyB,EACzBC,4BAA4B,EAC5BnC,uBAAuB,CAC3B,EAAG,GAAI,EAEPR,qBAAqB,EACzB,CAAC,EAoFDx0B,IAAIo3B,4BAKJ,SAAShC,8BAA8BF,GACnCl1B,IAAI40B,EAAQ/0B,SAASC,cAAc,KAAK,EACxC80B,EAAM1yB,MAAMof,MAAQ,OACpBsT,EAAM1yB,MAAM+e,OAAS,OACrB2T,EAAM1yB,MAAM+sB,WAAa,QACzB2F,EAAM1yB,MAAM8K,QAAU,EACtB4nB,EAAM1yB,MAAM8sB,SAAW,WACvB4F,EAAM1yB,MAAM0e,IAAM,EAClBgU,EAAMG,QAAU,SAAS3c,GACrB,GAAoClF,KAAAA,IAAhCkkB,4BAA2C,CAC3Cp3B,IAAIq3B,EAAajf,EAAEib,cAEfiE,GADJD,EAAWn1B,MAAM8K,QAAU,GACXnN,SAASC,cAAc,KAAK,GAC5Cw3B,EAAUttB,UAAY,yBACtBqtB,EAAW3yB,YAAY4yB,CAAS,EAChCt3B,IAAIu3B,EAAmB,GACnB13B,SAAS2F,cAAc,uCAAuC,IAC9D+xB,EAAmB13B,SAAS2F,cAAc,uCAAuC,EAAE6F,OASvFhH,sBANW,CACPD,OAAU,sCACV8iB,0BAA6BrB,gBAAgB,EAC7C0C,4BAA+BgP,CACnC,EAII,CACItnB,MAAO,CAAA,EACPtM,SAAU,SAASC,GAEc,EAD7BwzB,4BAA8B,CAAA,KAC1BxzB,EAAOT,MAAMopB,QACb1sB,SAASuH,iBAAiB,4BAA4B,EAAElC,QAAQ,SAASoC,GACrEA,EAAG6gB,WAAWniB,OAAO,CACzB,CAAC,GAEDnG,SAASuH,iBAAiB,4BAA4B,EAAElC,QAAQ,IAC5DoC,EAAG6gB,WAAWjmB,MAAMC,MAAQ,QAC5BmF,EAAG6gB,WAAWpmB,WAAa6B,EAAOT,MAAMqD,OAC5C,CAAC,EACD3G,SAASuH,iBAAiB,4BAA4B,EAAElC,QAAQ,IAC5DoC,EAAGtB,OAAO,CACd,CAAC,EAET,CACJ,CACJ,CACJ,CACJ,EACAkvB,EAAO/M,WAAWjmB,MAAM8sB,SAAW,WACnCkG,EAAO/M,WAAWzjB,YAAYkwB,CAAK,EACnC50B,IAAIi1B,EAAUxe,kBAAkBiD,IAAI,yBAAyB,EACzD,CAAA,IAAUub,IACVA,EAAU,IAEW,KAAA,IAAdC,EAAO9yB,KACd6yB,EAAQpsB,KAAKqsB,EAAO9yB,EAAE,EACtBqU,kBAAkBC,IAAI,0BAA2Bue,CAAO,EAEhE,CAKA,SAASkC,8BACLn3B,IAAIw3B,EAAW33B,SAAS8B,eAAe,4BAA4B,EAC/D61B,GACAC,2BAA2BD,CAAQ,CAE3C,CAMA,SAASC,2BAA2BD,GAChCx3B,IAAI03B,EAAgBF,EAASpwB,iBAAiB,0BAA0B,EACpEuwB,EAAeH,EAASpwB,iBAAiB,kCAAkC,EAC/EswB,EAAcxyB,QAAQ,IAClBoC,EAAG1F,aAAa,2BAA4B,MAAM,EAClD0F,EAAGlB,iBAAiB,QAAS,IACzB7F,EAAM0C,eAAe,CACzB,CAAC,CACL,CAAC,EACD00B,EAAazyB,QAAQ,IACjBoC,EAAGlB,iBAAiB,QAAS,IACzB7F,EAAM0C,eAAe,EACrB1C,EAAMsK,gBAAgB,EACtB+sB,YAAYtwB,CAAE,CAClB,CAAC,CACL,CAAC,CACL,CAMA,SAASuwB,4BAA4BC,GACjCA,EAASvrB,cAAc3K,aAAa,2BAA4B,OAAO,EACvEk2B,EAASvrB,cAAcjG,MAAM,CACjC,CAOA,SAASyxB,gCAAgCD,EAAUtqB,GAC/CxN,IAKQg4B,EALJzrB,EAAgBurB,EAASvrB,cACiC,SAA1DA,EAAcpB,aAAa,0BAA0B,GACrDoB,EAAc3K,aAAa,2BAA4B,MAAM,EAE5D/B,SAAS2F,cAAc,mBAAmB,KACvCwyB,EAAan4B,SAASC,cAAc,KAAK,GAClCkK,UAAY,mBACvBguB,EAAW91B,MAAM+sB,WAAa,MAC9B+I,EAAW91B,MAAMC,MAAQ,QACzB61B,EAAW91B,MAAMmtB,QAAU,MAC3B2I,EAAWj2B,UAAYyL,EACvBjB,EAAc0rB,sBAAsB,cAAeD,CAAU,EAErE,CAMA,SAASJ,YAAY9uB,GAMjBzE,sBALW,CACPD,OAAU,2BACV8iB,0BAA6BrnB,SAASq4B,kBAAkB,2BAA2B,EAAE,GAAG7sB,KAC5F,EAII,CACI4E,MAAO,CAAA,EACPtM,SAAU,SAASC,GACc,CAAA,IAAzBA,EAAOT,MAAMopB,QACbsL,4BAA4B/uB,CAAI,EAEhCivB,gCAAgCjvB,EAAMlF,EAAOT,MAAMqD,OAAO,CAElE,CACJ,CACJ,CACJ,CAOA,SAASqqB,iBAAiBsH,GACtB,IAAMxK,EAAuC,UAA1B,OAAOwK,EAAc,OAAgBA,EAAQ/zB,OAAS,GACnEqnB,EAAwC,OAA/B0M,EAAQhtB,aAAa,IAAI,EAAagtB,EAAQhtB,aAAa,IAAI,EAAI,GAC5EitB,EAA6C,UAA7B,OAAOD,EAAiB,UAAgBA,EAAQnuB,UAAY,GAElF,MACI,CAAA,EACiD,CAAC,IAA9C2jB,EAAW3qB,QAAQ,oBAAoB,GACD,CAAC,IAAvC2qB,EAAW3qB,QAAQ,aAAa,GACM,CAAC,IAAvC2qB,EAAW3qB,QAAQ,aAAa,GAEDkQ,KAAAA,IAAjCilB,EAAQE,WAAWt4B,WACjBo4B,EAAQE,WAAWt4B,UAAUkmB,SAAS,eAAe,GAChB,CAAC,IAA1C0H,EAAW3qB,QAAQ,gBAAgB,GACQ,CAAC,IAA5C2qB,EAAW3qB,QAAQ,kBAAkB,GACA,CAAC,IAAtC2qB,EAAW3qB,QAAQ,YAAY,GACY,CAAC,IAA5C2qB,EAAW3qB,QAAQ,kBAAkB,GACQ,CAAC,IAA9C2qB,EAAW3qB,QAAQ,oBAAoB,GACJ,CAAC,IAApC2qB,EAAW3qB,QAAQ,UAAU,GACU,CAAC,IAAxC2qB,EAAW3qB,QAAQ,cAAc,GACE,CAAC,IAApC2qB,EAAW3qB,QAAQ,UAAU,GACS,CAAC,IAAvC2qB,EAAW3qB,QAAQ,aAAa,GACM,CAAC,IAAvC2qB,EAAW3qB,QAAQ,aAAa,GACK,CAAC,IAAtC2qB,EAAW3qB,QAAQ,YAAY,GACW,CAAC,IAA3C2qB,EAAW3qB,QAAQ,iBAAiB,GACH,CAAC,IAAlC2qB,EAAW3qB,QAAQ,QAAQ,GAA8C,CAAC,IAAnCyoB,EAAOzoB,QAAQ,aAAa,GACpB,CAAC,IAAhDyoB,EAAOzoB,QAAQ,0BAA0B,GACF,CAAC,IAAxC2qB,EAAW3qB,QAAQ,cAAc,GACW,CAAC,IAA7CyoB,EAAOzoB,QAAQ,uBAAuB,GAMD,CAAC,IAAtC2qB,EAAW3qB,QAAQ,YAAY,GACO,CAAC,IAAvC2qB,EAAW3qB,QAAQ,aAAa,GAChCmxB,sBAAsBgE,CAAO,GACa,CAAC,IAA3CxK,EAAW3qB,QAAQ,iBAAiB,GACA,CAAC,IAArC2qB,EAAW3qB,QAAQ,WAAW,GACa,CAAC,IAA5C2qB,EAAW3qB,QAAQ,kBAAkB,GACa,CAAC,IAAnD2qB,EAAW3qB,QAAQ,yBAAyB,GAED,CAAC,IAAxC2qB,EAAW3qB,QAAQ,cAAc,GACE,CAAC,IAApCo1B,EAAcp1B,QAAQ,OAAO,GAGPkQ,KAAAA,IAAtBilB,EAAQp4B,WACRo4B,EAAQp4B,UAAUkmB,SAAS,sBAAsB,GAErDqS,iBAAiBH,EAAS,UAAU,EAM5C,CAOA,SAAShE,sBAAsBgE,GAC3Bn4B,IAAI4D,EAAS,CAAA,EACb,IAAM20B,EAAwB14B,SAAS2F,cAAc,+BAA+B,EAUpF,OAFI5B,EANmB,UAAnB,OAAOu0B,GAAoC,OAAZA,GACL,OAA1BI,GACAA,EAAsBxd,aAAa,mBAAmB,GACM,KAA5Dwd,EAAsBptB,aAAa,mBAAmB,GACuB,OAA7EotB,EAAsB/yB,cAAc,mCAAmC,EAE9D2yB,IAAYI,EAAsB/yB,cAAc,mCAAmC,EAEzF5B,CACX,CAQA,SAASwvB,yBAAyBxX,GAE9B,IAAMuJ,EAAgB,GACtBA,EAAc,GAAKE,6BAA6BzJ,CAAI,EACpD8J,gCAAiCP,CAAc,EAE/C,IAAM5iB,EAAO,CACTgmB,4BAA+B9R,kBAAkBiD,IAAI,0BAA0B,CACnF,EACI8e,EAAQ5c,EAAK5T,UAGjBwwB,EAFQlwB,MAAMC,UAAUC,MAAMC,KAAK+vB,CAAK,GAElCtzB,QAAS,SAAU4D,EAAMopB,GACR,KAAdppB,EAAK0C,KACNjJ,EAAK,SAAW2vB,GAAKppB,EAAKuC,MAE1B9I,EAAKuG,EAAK0C,MAAQ1C,EAAKuC,KAE/B,CAAC,EAEDhH,sBACI9B,EACA,CACI0N,MAAO,CAAA,EACPtM,SAAU,SAAUC,EAAQrB,EAAMgN,EAAQyJ,GAEtC0a,0BAA0B9X,CAAI,EAE9B,IAAM6c,EACF7c,EAAKb,aAAa,QAAQ,GACyB,CAAC,IAApDa,EAAKzQ,aAAa,QAAQ,EAAEnI,QAAQ,SAAS,EAEjD,GAAsBkQ,KAAAA,IAAjBtP,EAAOT,OAAuC+P,KAAAA,IAAhBtP,EAAOrB,MACpB2Q,KAAAA,IAAjBtP,EAAOT,OAAuB,CAAE,CAACS,EAAOT,MAAMopB,QACjD,CAEE,IAAK,IAAMjlB,KAAMsU,EAAKxU,iBAAiB,oCAAoC,EACvEE,EAAGtB,OAAO,EAEd,IAAK,IAAMsB,KAAMsU,EAAKxU,iBAAiB,2CAA2C,EAC9EE,EAAGtB,OAAO,EAEd,IAAK,IAAMsB,KAAMsU,EAAKxU,iBAAiB,yCAAyC,EAC5EE,EAAGtB,OAAO,EAId,GAAuBkN,KAAAA,IAAnB0I,EAAK7b,WAA2B6b,EAAK7b,UAAUkmB,SAAS,cAAc,EAUtE,OATM2O,EAAQ/0B,SAAS8B,eAAe,qBAAqB,IAEvDizB,EAAM5uB,OAAO,EAGjB,MADM6uB,EAAMjZ,EAAKpW,cAAc,kCAAkC,KAE7DqvB,EAAIC,SAAW,CAAA,EACfD,EAAIvuB,MAAM,IAMlB,GAAoC4M,KAAAA,IAA/B0I,EAAKxY,QAAQ2tB,cAA8B,CAC5C/wB,IAAI04B,EAAe9c,EAAKpW,cAAc,iBAAiB,EAMvD,OALAkzB,EAAa1yB,OAAO,EACL4V,EAAK6X,YACb/uB,YAAYkX,EAAK0X,oBAAoB,EAA5ChnB,KACAosB,EAAe9c,EAAKpW,cAAc,iBAAiB,GACtCc,MAAM,CAEvB,CAGA,GAAIsV,EAAKb,aAAa,QAAQ,GACuC,CAAC,IAAjEa,EAAKzQ,aAAa,QAAQ,EAAEnI,QAAQ,sBAAsB,EAC7D,CACEhD,IAAI04B,EAAe9c,EAAKpW,cAAc,iBAAiB,EAOvD,OANAkzB,EAAa1yB,OAAO,EACL4V,EAAK6X,YACb/uB,YAAYkX,EAAK0X,oBAAoB,EAC5C1X,EAAK4J,SAAW5J,EAAK2X,iBADrBjnB,KAEAosB,EAAe9c,EAAKpW,cAAc,iBAAiB,GACtCc,MAAM,CAEvB,CAGA,GAAImyB,EAAoB,CACpBz4B,IAAI04B,EAAe9c,EAAKpW,cAAc,iBAAiB,EAOvD,OANAkzB,EAAa1yB,OAAO,EACL4V,EAAK6X,YACb/uB,YAAYkX,EAAK0X,oBAAoB,EAC5C1X,EAAK4J,SAAW5J,EAAK2X,iBADrBjnB,KAEAosB,EAAe9c,EAAKpW,cAAc,iBAAiB,GACtCc,MAAM,CAEvB,CAEA,IAmBWgB,EAIAA,EAvBLqxB,EAAU/c,EAEV0W,GADN1W,EAAKrP,cAAc6Y,YAAYxJ,CAAI,EACtBA,EAAKoX,WACZN,EAAe9W,EAAKqX,kBAC1BjzB,IAAI44B,EAAoB,CAAA,EAExB9E,sCAAsC6E,EAASjG,CAAY,EAGvDA,GAC2B,UAA3B,OAAOA,EAAatwB,IACkB,CAAC,IAAvCswB,EAAatwB,GAAGY,QAAQ,QAAQ,IAEhC41B,EAAoB,CAAA,GAGxBtG,EAAK1lB,MAAO8lB,CAAa,EAGzB,IAAWprB,KAAMorB,EAAatrB,iBAAiB,oCAAoC,EAC/EE,EAAGtB,OAAO,EAGd,IAAWsB,KAAMorB,EAAatrB,iBAAiB,2CAA2C,EACtFE,EAAGtB,OAAO,EAIdhG,IAAI64B,EAAanG,EAAatrB,iBAAiB,qBAAqB,EACpE,GAA2B,IAAtByxB,EAAW34B,OAOZ,OANA24B,EAAW,GAAGvyB,MAAM,EAApBuyB,KACID,GACA9zB,WAAW,WACPyrB,kBAAkB,CACtB,EAAG,IAAI,GAMf,GAA2B,KAD3BsI,EAAanG,EAAatrB,iBAAiB,oBAAoB,GAC/ClH,OAEZ,OADA24B,KAAAA,EAAW,GAAGvyB,MAAM,EAMxB,GAA2B,KAD3BuyB,EAAanG,EAAatrB,iBAAiB,+BAA+B,GAC1DlH,OAEZ,OADA24B,KAAAA,EAAW,GAAGvyB,MAAM,EAIxB,GAA2B,KAD3BuyB,EAAanG,EAAatrB,iBAAiB,4BAA4B,GACvDlH,OAEZ,OADA24B,KAAAA,EAAW,GAAGvyB,MAAM,EAMG,KAD3BuyB,EAAanG,EAAatrB,iBAAiB,oCAAoC,GAC/DlH,QACZ24B,EAAW,GAAGvyB,MAAM,CAE5B,EACsB4M,KAAAA,IAAjBtP,EAAOT,OAAuB,CAACS,EAAOT,MAAMopB,SAC5BrZ,KAAAA,IAAhBtP,EAAOrB,MAA8C2Q,KAAAA,IAAxBtP,EAAOrB,KAAKoL,WAE1CwV,oBAAoBvf,CAAM,EAEtB60B,IACA3zB,WAAW,WACPjF,SAAS8C,SAASm2B,OAAO,CAC7B,EAAG,GAAI,CAGnB,CACJ,CAAC,CACT,CAKA,SAAS5B,2BAGL6B,gCAFcl5B,SAASkyB,qBAAqB,MAAM,CAEb,EAFrC,IAIMD,EAASjyB,SAASkyB,qBAAqB,QAAQ,EACrD,GAAqB,EAAhBD,EAAO5xB,OACR,IAAMF,IAAI4tB,EAAI,EAAGA,EAAIkE,EAAO5xB,OAAQ0tB,CAAC,GACjC,GAAkC,MAA7BkE,EAAOlE,GAAGoE,gBAAf,CAIA,IAAMC,EAAcH,EAAOlE,GAAGoE,gBAAgB5c,MAE9C,GAA4B,IAAvB6c,EAAY/xB,OACb,OAGJ64B,gCAAgC9G,EAAaH,EAAOlE,GAAGoE,eAAe,CARtE,CAWZ,CAQA,SAAS+G,gCAAgC3jB,EAAOgd,EAAiBvyB,UAC7D,IACW+b,EAYA6P,EAbLuN,EAAgB,GACtB,IAAWpd,KAAQxG,EAAO,CACtB,IAAM6jB,EAAard,EAAKzQ,aAAa,IAAI,EACrC8tB,GAA+C,CAAC,IAAlCA,EAAWj2B,QAAQ,QAAQ,GACzCg2B,EAAcnwB,KAAKowB,CAAU,EAE7BA,GAAmD,CAAC,IAAtCA,EAAWj2B,QAAQ,YAAY,GACzBkQ,KAAAA,IAAnB0I,EAAK7b,WAA2B6b,EAAK7b,UAAUkmB,SAAS,sBAAsB,GAE/E+S,EAAcnwB,KAAKowB,CAAU,CAErC,CAEA,IAAWxN,KAAUuN,EAAe,CAChC,IAAMpd,EAAOwW,EAAezwB,eAAe8pB,CAAM,EACjD7P,EAAKsd,6BAA+Btd,EAAK4J,SACzC5J,EAAK4J,SAAW2T,+BACpB,CACJ,CAMA,SAASA,gCAAgCvd,GACrCA,EAAK3Y,eAAe,EACpB2Y,EAAKwd,yBAAyB,EAC9B,IAAMC,EAAYzd,EAClBA,EAAOA,EAAKjU,OAEZ,IAAMirB,EAAc/yB,SAASC,cAAc,OAAO,EAO5CqlB,GANNyN,EAAYpnB,KAAO,SACnBonB,EAAYvnB,MAAQ,6BACpBunB,EAAYpd,KAAO,SACnBoG,EAAKlX,YAAYkuB,CAAW,EAGN,IACtBzN,EAAc,GAAKE,6BAA6BzJ,CAAI,EACpD8J,gCAAgCP,CAAa,EAC7CvJ,EAAKvb,OAAOysB,+BAA+B,QAAQ,CAAC,EAEpD,IAAMvqB,EAAO,GACTi2B,EAAQ5c,EAAK5T,UAGjBwwB,EAFQlwB,MAAMC,UAAUC,MAAMC,KAAK+vB,CAAK,GAElCtzB,QAAS,SAAU4D,EAAMopB,GACR,KAAdppB,EAAK0C,KACNjJ,EAAK,SAAW2vB,GAAKppB,EAAKuC,MAE1B9I,EAAKuG,EAAK0C,MAAQ1C,EAAKuC,KAE/B,CAAC,EAEDhH,sBACI9B,EACA,CACI0N,MAAO,CAAA,EACPtM,SAAU,SAASC,GACf,GAAsBsP,KAAAA,IAAjBtP,EAAOT,OAAuB,CAAE,CAACS,EAAOT,MAAMopB,QAAU,CACzD3Q,EAAK4J,SAAW,KAGhB,IAAK,IAAMle,KAAMsU,EAAKxU,iBAAiB,oCAAoC,EACvEE,EAAGtB,OAAO,EAEd,IAAK,IAAMsB,KAAMsU,EAAKxU,iBAAiB,2CAA2C,EAC9EE,EAAGtB,OAAO,EAEd,IAAK,IAAMsB,KAAMsU,EAAKxU,iBAAiB,yCAAyC,EAC5EE,EAAGtB,OAAO,EAIV4V,EAAKsd,wCAAwCnT,WACzCuT,EAAUx0B,WAAW,WACrB8W,EAAKsd,6BAA6BzwB,KAAKmT,EAAMyd,CAAS,CAC1D,EAAG,GAAG,EACNvC,aAAawC,CAAO,GAJxB,IAOMT,EAAajd,EAAKpW,cAAc,sBAAsB,EAC5D,GAAIqzB,EAEA,OADAA,KAAAA,EAAWvyB,MAAM,CAGzB,CAEqB4M,KAAAA,IAAjBtP,EAAOT,OAAuB,CAACS,EAAOT,MAAMopB,SAC5CpJ,oBAAoBvf,CAAM,CAElC,CACJ,CAAC,CACT,CAOA,SAAS2wB,SAASjtB,GACd,OAAIA,EAAGwf,SAAWxf,EAAGiyB,SACVjyB,EAAGwf,QACLpb,OAAO,GAAY8tB,EAAOxjB,QAAQ,EAClCyjB,IAAI,GAAYD,EAAOnuB,KAAK,EACd,aAAZ/D,EAAGkO,MAAmC,UAAZlO,EAAGkO,KAC7BlO,EAAGgtB,SAAuB,KAE1BhtB,EAAG+D,KAElB,CASA,SAASitB,iBAAiBH,EAASuB,GAC/B15B,IAAIsM,EAAS6rB,EAAQ5rB,cACrB,KAAOD,GAAQ,CACX,GAAIA,EAAOvM,UAAUkmB,SAASyT,CAAY,EACtC,MAAO,CAAA,EAEXptB,EAASA,EAAOC,aACpB,CACA,MAAO,CAAA,CACX,CAMA,SAASotB,gBAAgBC,GAErB,IAAMC,EAAS,GACTrB,EAAQoB,EAAS5xB,SACvBhI,IAAI8Q,EAEJ,IAAKA,KAAO0nB,EACgB,WAApBA,EAAM1nB,GAAK0E,MACUtC,KAAAA,IAArBslB,EAAM1nB,GAAKzF,OACU,KAArBmtB,EAAM1nB,GAAKzF,QACXwuB,EAAOrB,EAAM1nB,GAAKtF,MAAQouB,EAAS5xB,SAAS8I,GAAKzF,OAGzDwuB,EAAOz1B,OAAS,oBAGhBC,sBACIw1B,EACA,CACIpsB,IAAK5L,kBAAkByX,UACvB3V,SAAU,SAASpB,GACf,GAAqB,CAAA,IAAjBA,EAAKqC,QAIL,OADAk1B,MAAMv3B,EAAKA,IAAI,EACR,CAAA,EAHPq3B,EAASG,WAAW,CAK5B,CACJ,CACJ,CACJ,CAoBA,SAASC,yBACLh6B,IAYkBi6B,EAZdC,EAAe,GACfC,EAAa,GAEjB,IAAMn6B,IAAIC,EAAI,EAAGA,EAAIJ,SAASuV,MAAMlV,OAAQD,CAAC,GACA,UAApC,OAAOJ,SAASuV,MAAMnV,GAAS,QAIU,QAAtCi6B,GAFWC,EADFt6B,SAASuV,MAAMnV,IACFmE,QAETpB,QAAQ,WAAW,GACwB,OAAxDk3B,EAAaruB,MAAMlL,SAASy5B,UAAY,SAAU,GAChDC,8BAA8BH,CAAY,IAEtCD,EAAYE,EAAWG,UAAU,CAAA,CAAI,EAC3CH,EAAWhS,WAAWoS,aAAaN,EAAWE,CAAU,EAExDF,EAAUF,WAAaI,EAAW9R,OAClC4R,EAAU5R,OAAS,KAEnB4R,EAAU7zB,iBAAiB,SAAU,SAAS7F,GAK1C,OAJAA,EAAM0C,eAAe,EACrB1C,EAAMsK,gBAAgB,EACtBtK,EAAM64B,yBAAyB,EAC/BO,gBAAgBp5B,EAAMoH,MAAM,EACrB,CAAA,CACX,CAAC,EAIjB,CAOA,SAAS0yB,8BAA8Bj2B,GAOnC,MALmC,CAC/B,eACA,wBAG8Bo2B,KAAK,GACmC,OAA/Dp2B,EAAOyH,MAAM,IAAIgN,OAAOlY,SAASy5B,UAAY,KAAO5jB,CAAI,CAAC,CACnE,CACL,CAhEA3W,SAASuG,iBAAiB,mBAAoB,WACnC,CAACzF,SAAS85B,kCAIjB31B,WAAW,KACPk1B,uBAAuB,CAC3B,EAAG,GAAG,EAENn6B,SAASuG,iBAAiB,8BAA+B,WACrD4zB,uBAAuB,CAC3B,CAAC,EACL,CAAC,EAsDD,IAAMU,gBAAkB76B,SAASC,cAAc,KAAK,EAoKpD,SAAS66B,qBACL96B,SAAS2F,cAAc,yBAAyB,EAAEwb,YAAc,MAChE0Z,gBAAgBx4B,MAAMkf,MAAQ,QAC9BsZ,gBAAgBx4B,MAAM04B,WAAa,OACnC/6B,SAAS2F,cAAc,yBAAyB,EAAEtD,MAAM04B,WAAa,OACrE/6B,SAAS2F,cAAc,yBAAyB,EAAEtD,MAAMof,MAAQ,OAChEzhB,SAAS2F,cAAc,yBAAyB,EAAEtD,MAAM24B,WAAa,OACzE,CAzKAh7B,SAASuG,iBAAiB,mBAAoB,WAC1Cs0B,gBAAgB1wB,UAAY,6BAC5BhK,IAAI86B,EAAY,KAwBhB,SAASC,IACL/6B,IAAIg7B,EAAU,CAAC,MAAO,SAClBp3B,EAASo3B,EAAQxrB,KAAKC,MAAMD,KAAKE,OAAO,EAAIsrB,EAAQ96B,MAAM,GAE9DL,SAAS2F,cAAc,0BAA0B,EAAEQ,OAAO,EAC1DnG,SAAS2F,cAAc,+BAA+B,EAAEQ,OAAO,EAC/DnG,SAAS2F,cAAc,6BAA6B,EAAEtD,MAAM+e,OAAS,OAGrEjhB,IAAI4F,EAAQ,cACRq1B,EAAM,GACNC,EAAc,GAClB,OAAQt3B,GACJ,IAAK,MACDW,QAAQC,IAAI,KAAK,EAEjBy2B,EAAM,wOACN,MACJ,IAAK,QACD12B,QAAQC,IAAI,OAAO,EACnBoB,EAAQ,kBACRq1B,EAAM,4LACNC,EAAc,4DAEtB,CACAr7B,SAAS2F,cAAc,yBAAyB,EAAEwb,YAAcpb,EAC1Du1B,EAAMt7B,SAASC,cAAc,KAAK,EACxCq7B,EAAInxB,UAAY,yBAChBmxB,EAAIp5B;cACEk5B;wDAC0CC;UAEhDR,gBAAgBh2B,YAAYy2B,CAAG,CACnC,CAtDAt7B,SAASuG,iBAAiB,qBAAsB,WAC5Cs0B,gBAAgBx4B,MAAM2H,QAAU,QAChCixB,EAAY,IAAI5tB,IACpB,CAAC,EAEDrN,SAASuG,iBAAiB,mBAAoB,WAC1C7B,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3E,SAASuG,iBAAiB,sBAAuB,WACzC00B,GAAa,IAAI5tB,KAAS4tB,EAZR,IAalBh2B,WAAW,KACPi2B,EAAW,CACf,EAfkB,KAeQ,IAAI7tB,KAAS4tB,EAAU,EAGrDh2B,WAAW,KACPi2B,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EAsCDl7B,SAASuG,iBAAiB,qBAAsB,WAC5C7B,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtC,EAAQrC,SAASC,cAAc,OAAO,EAmEtC8F,GAlEN1D,EAAM8e;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNnhB,SAASu7B,KAAK12B,YAAYxC,CAAK,EAG/Bw4B,gBAAgBx4B,MAAMm5B;;;;;;;;;;;;;;;;;MAoBRx7B,SAASC,cAAc,KAAK,GASpCw7B,GARN11B,EAAMoE,UAAY,yBAClBpE,EAAM1D,MAAMm5B;;MAGZz1B,EAAMob,YAAc,cACpB0Z,gBAAgBh2B,YAAYkB,CAAK,EAGlB/F,SAASC,cAAc,KAAK,GAQrCy7B,GAPND,EAAOtxB,UAAY,0BAGnB0wB,gBAAgBh2B,YAAY42B,CAAM,EAClCz7B,SAASuB,KAAKsD,YAAYg2B,eAAe,EAGrB76B,SAASC,cAAc,KAAK,GAChDy7B,EAAYvxB,UAAY,+BACxBuxB,EAAYr5B,MAAMm5B;;MAGlBE,EAAYva,YAAc,gBAC1B0Z,gBAAgBh2B,YAAY62B,CAAW,CAC3C,CAAC"} \ 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..1810b36ca 100644 --- a/js/apbct-public-bundle_int-protection.min.js +++ b/js/apbct-public-bundle_int-protection.min.js @@ -1,2 +1,68 @@ -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()}))}); +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)})}))}});let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}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(){loaderContainer.className="ct-browser-check-container";let e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)];document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px";let t="botDetector",o="",c="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',c=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML=` + ${o} + > + `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `,document.head.appendChild(o),loaderContainer.style.cssText=` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` + border-bottom: 1px solid #bbbbbb; + `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` + border-top: 1px solid #bbbbbb; + `,o.textContent="Browser check",loaderContainer.appendChild(o)}),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..00eda2b5d 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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","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,GAExEzY,SAAS2Y,cAAc,IAAIC,YAAY,oBAAoB,CAAC,EAC5DhV,sBACI,eACA,CACIC,OAAQ,OACRnB,KAAM,CAAC2T,QAASA,CAAO,EACvBvS,SAAUA,EACVK,gBAAiBA,CACrB,CACJ,EACAnE,SAAS2Y,cAAc,IAAIC,YAAY,qBAAqB,CAAC,GAEf,eAAtC5W,kBAAkB2B,iBAC1Ba,sBACI,CACID,OAAQ,gCACR8R,QAASA,CACb,EACA,CACI5R,QAAS,EACTX,SAAUA,EACVK,gBAAiBA,EACjB0U,WAAY,SAAS3I,GACjBA,EAAI2D,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAQA,SAASiF,YAAYnN,GACboN,EAAU/Y,SAASqX,OAAOrL,MAAM,IAAIgN,OACpC,WAAarN,EAAKtE,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAO0R,EAAUL,mBAAmBK,EAAQ,EAAE,EAAI1F,KAAAA,CACtD,CAGA,SAAS4F,eAAeC,GAEpB,IAKQ/B,EALsC,SAAzCnV,kBAAkByU,qBAI8B,WAAzCzU,kBAAkByU,oBACtBU,EAAiC,WAAtBrU,SAASsU,SAAwB,WAAa,GAC7DpX,SAASqX,OAAS6B,EAAa,mEAAqE/B,GAG5FnV,kBAAkByU,mBAGlC,CAGA,SAASjS,sBAAsB9B,EAAMgN,EAAQyJ,GAEzChZ,IAAIiZ,EAAU,GAiBRvE,GAhBNuE,EAAkB,SAAI1J,EAAO5L,UAAY,KACzCsV,EAAyB,gBAAI1J,EAAOvL,iBAAmB,KACvDiV,EAA0B,iBAAI1J,EAAO2J,kBAAoB,KACzDD,EAAyB,gBAAI1J,EAAO4J,iBAAmB,KACvDF,EAAe,MAAI1J,EAAOU,OAAS,CAAA,EACnCgJ,EAAiB,QAAI1J,EAAOjL,SAAW,KACvC2U,EAAsB,aAAG1J,EAAOjL,QAAU,OAAS,OACnD2U,EAAiB,QAAI1J,EAAOkB,SAAW,KACvCwI,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAI1J,EAAOrJ,QAAU,KACrC+S,EAAiB,QAAI1J,EAAOa,SAAW,KACvC6I,EAAqB,YAAI1J,EAAOc,aAAe,KAC/C4I,EAAgB,OAAI1J,EAAO6J,QAAU,KACrCH,EAAkB,SAAI1J,EAAO8J,UAAY,KACzCJ,EAAc,KAAI1W,EAClB0W,EAAa,IAAIpX,kBAAkByX,UACrBrK,kBAAkB,GAEV,UAAlB,OAAO,GACAgK,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBvE,GAE1DuE,EAAc,KAAIA,EAAc,KAAI,aAAezJ,KAAKE,OAAO,IAExDuJ,EAAkB,WACrBA,EAAc,KAAE5J,YAAcqF,GAElCuE,EAAc,KAAEM,SAAW/J,KAAKE,OAAO,IAG3C,IAAI9H,WAAYwC,KAAK6O,CAAO,CAChC,CAGA,SAASxV,sBAAuBgR,EAAOlF,GACnCvP,IAAIiZ,EAAU,GACdA,EAAe,MAAIxE,EACnBwE,EAAkB,SAAI1J,EAAO5L,UAAY,KACzCsV,EAAyB,gBAAI1J,EAAOvL,iBAAmB,KACvDiV,EAAc,KAAI1J,EAAOhN,MAAQ,GACjC0W,EAAgB,OAAI1J,EAAO7L,QAAU,QAErC,IAAIkE,WAAY2C,KAAK0O,CAAO,CAChC,CAOA,SAASO,wBACL,OAAOhK,KAAKE,OAAO,EAAEqE,SAAS,EAAE,EAAE7M,QAAQ,WAAY,EAAE,EAAEuS,OAAO,EAAG,EAAE,CAC1E,CAEAzZ,IAAIyW,kBAAoB,CACpBiD,IAAK,SAAS5I,EAAK+D,GACU,KAAA,IAAbA,IACRA,EAAW,SAET8E,EAAe9K,aAAaC,QAAQgC,CAAG,EAC7C,GAAsB,OAAjB6I,EACD,IACI,IAAMC,EAAOtW,KAAKyL,MAAM4K,CAAY,EACpC,GAAKC,CAAAA,EAAKzK,eAAe0F,CAAQ,EAS7B,OAAO+E,EARP,IAEI,OAAOtW,KAAKyL,MAAO6K,EAAK/E,EAAU,CAItC,CAHE,MAAOuD,GAEL,OAAOwB,EAAK/E,GAAUd,SAAS,CACnC,CAMR,CAFE,MAAOqE,GACL,OAAOuB,CACX,CAEJ,MAAO,CAAA,CACX,EACAjD,IAAK,SAAS5F,EAAKzF,EAAOwO,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzO,MAAS/H,KAAKC,UAAU8H,CAAK,EAAG0O,UAAavK,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAAC,EACrGnL,aAAaG,QAAQ8B,EAAKxN,KAAKC,UAAUuW,CAAS,CAAC,GAEnDjL,aAAaG,QAAQ8B,EAAKzF,CAAK,CAEvC,EACA4O,QAAS,SAASnJ,EAAKoJ,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEGtZ,KAAK8Y,IAAI5I,EAAK,WAAW,EACxBoJ,EAAc1K,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAASrJ,GACZ,OAAqC,OAA9BjC,aAAaC,QAAQgC,CAAG,CACnC,EACAsJ,OAAQ,SAAStJ,GACbjC,aAAawL,WAAWvJ,CAAG,CAC/B,EACAwJ,iBAAkB,WACdta,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,kBAAkBiD,IAAI5I,CAAG,EAExD,CACA,OAAOvO,CACX,CAEJ,EAEIgY,oBAAsB,CACtBb,IAAK,SAAS5I,EAAK+D,GACU,KAAA,IAAbA,IACRA,EAAW,SAET8E,EAAea,eAAe1L,QAAQgC,CAAG,EAC/C,GAAsB,OAAjB6I,EACD,IACI,IAAMC,EAAOtW,KAAKyL,MAAM4K,CAAY,EACpC,OAAOC,EAAKzK,eAAe0F,CAAQ,EAAIvR,KAAKyL,MAAM6K,EAAK/E,EAAS,EAAI+E,CAGxE,CAFE,MAAOxB,GACL,OAAOuB,CACX,CAEJ,MAAO,CAAA,CACX,EACAjD,IAAK,SAAS5F,EAAKzF,EAAOwO,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzO,MAAS/H,KAAKC,UAAU8H,CAAK,EAAG0O,UAAavK,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAexL,QAAQ8B,EAAKxN,KAAKC,UAAUuW,CAAS,CAAC,GAErDU,eAAexL,QAAQ8B,EAAKzF,CAAK,CAEzC,EACA8O,MAAO,SAASrJ,GACZ,OAAuC,OAAhC0J,eAAe1L,QAAQgC,CAAG,CACrC,EACAsJ,OAAQ,SAAStJ,GACb0J,eAAeH,WAAWvJ,CAAG,CACjC,EACAwJ,iBAAkB,WACdta,IAAIuC,EAAO,GACX,IAAKvC,IAAIC,EAAE,EAAGA,EAAEua,eAAeta,OAAQD,CAAC,GAAI,CACxCD,IAAI8Q,EAAM0J,eAAe1J,IAAI7Q,CAAC,EACJ,CAAC,IAAvB6Q,EAAI9N,QAAQ,KAAK,GAAoC,CAAC,IAA1B8N,EAAI9N,QAAQ,QAAQ,IAChDT,EAAKuO,EAAIiD,SAAS,GAAKwG,oBAAoBb,IAAI5I,CAAG,EAE1D,CACA,OAAOvO,CACX,CACJ,EAUA,SAASkY,sBAAsBla,IAC1B,oBAAsBA,EAAMma,cACzBC,kBAAkCC,yBAAhBra,EAAMoH,MAAM,CACtC,CAUA,SAASkT,aAAata,IACjB,0BAA4BA,EAAMua,WAAe,SAAUva,EACtBqa,wBAAlCD,mBAA0Dpa,EAAMoH,MAAM,CAC9E,CAWA,SAASgT,kBAAkBjU,GACvB,IAGInG,EAHAmG,EAAQqU,aAAa,eAAe,IACxCrU,EAAQ9E,aAAa,gBAAiB,EAAE,EAEpCrB,EAAQ,IAAI6M,OAAOqL,YAAY,iBAAkB,CACjDuC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIxU,EAAQ8R,cAAcjY,CAAK,KAC5BmG,EAAQ2E,MAAQ,GAExB,CAWA,SAASuP,wBAAwBlU,GACxBA,EAAQqU,aAAa,eAAe,IACzCrU,EAAQe,gBAAgB,eAAe,EAGvCf,EAAQ8R,cAAc,IAAIpL,OAAOqL,YAAY,iBAAkB,CAC3DuC,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAKMC,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,SAAS2Y,cAAc,IAAIkD,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,MAAO8M,QAAQ,EAChCoD,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,MAAO8M,QAAQ,EAAI,GAAI,CACb,EAC5CkE,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,MAAO8M,QAAQ,EAAImD,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,kBAAkBiD,IAAI,mCAAmC,EACxEyF,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,kBAAkBiD,IAAI,0BAA0B,EAC5B,YAA9B,OAAOmG,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,OACjBmW,UAAa7M,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,OACjBmW,UAAa7M,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,EACVmW,UAAa7M,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,kBAAkBiD,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzBwI,EAAiC,CAClC,GAAOzL,kBAAkBwD,QAAQ,kBAAmB,KAAQ,EAKxD,OADA+H,KAAAA,8BAA8BE,CAAoB,EAHlDzL,kBAAkB2D,OAAO,iBAAiB,CAMlD,CAE2C,SAAtCvY,kBAAkB2B,gBACnBC,sBACI,sBACA,CACIC,OAAQ,OACRC,SAAU,SAASC,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBue,SAAuC,IAA5Bve,EAAOZ,QAAQ,OAAO,IAE3EyT,kBAAkBiD,IAAI,iBAAiB,IAE1CjD,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,kBAAkBiD,IAAI,iBAAiB,IAE1CjD,kBAAkBC,IAAI,kBAAmB9S,CAAM,EAE/CkT,oCAAoC,GAGxC+K,cAAcje,CAAM,EAE5B,EACA8U,WAAY,SAAS3I,GACjBA,EAAI2D,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAKA,SAAS0O,mBACE3L,kBAAkB0D,MAAM,iBAAiB,GAAO1D,kBAAkBiD,IAAI,iBAAiB,IAC1F7V,YAAY,kBAAmB,MAAM,EACrC4S,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhC/V,SAAS2V,oBAC0BpD,KAAAA,IAAnCyF,YAAY,iBAAiB,GAE7B9U,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAAS4a,kBACEhI,kBAAkB0D,MAAM,gBAAgB,GAAO1D,kBAAkBiD,IAAI,gBAAgB,IACxF7V,YAAY,iBAAkB,MAAM,EACpC4S,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhC/V,SAAS2V,oBACyBpD,KAAAA,IAAlCyF,YAAY,gBAAgB,GAE5B9U,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAASkb,yBACAtI,kBAAkB0D,MAAM,sBAAsB,GAAM1D,kBAAkB0D,MAAM,eAAe,GAC5FkI,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACK5L,CAAAA,kBAAkB0D,MAAM,eAAe,GAAK1D,CAAAA,kBAAkBiD,IAAI,eAAe,GACjFjD,CAAAA,kBAAkB0D,MAAM,sBAAsB,GAAK1D,CAAAA,kBAAkBiD,IAAI,sBAAsB,GAE5D,WAAhC/Y,SAAS2V,oBAC+BpD,KAAAA,IAAxCyF,YAAY,sBAAsB,GACDzF,KAAAA,IAAjCyF,YAAY,eAAe,EANnC,CAaA3Y,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,kBAAkB0D,MAAM,sBAAsB,GAAO1D,kBAAkBiD,IAAI,sBAAsB,GACpGjD,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhC/V,SAAS2V,oBAC+BpD,KAAAA,IAAxCyF,YAAY,sBAAsB,GAEN,gBAAhChY,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,kBAAkB0D,MAAM,eAAe,GAAO1D,kBAAkBiD,IAAI,eAAe,GACtFjD,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhC/V,SAAS2V,oBACwBpD,KAAAA,IAAjCyF,YAAY,eAAe,GAEC,gBAAhChY,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,kBAAkBiD,IAAI,wBAAwB,EAC9CoG,cAAcnC,sBAAsB,GAGpC6F,EAAa/M,kBAAkBiD,IAAI,0BAA0B,KAE7D/C,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,wBAAwBhK,IAAI,0BAA0B,CAAC,CAGtF,CAAC,EACM/Y,SAASgjB,qBACZC,yBAAyB,EAG7BZ,8BAA8B,EAGzBzI,oBAAoBJ,MAAM,kBAAkB,EAW7C1D,kBAAkBC,IAAI,kBAAmBhN,OAAO+M,kBAAkBiD,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvFmK,EAAYrK,sBAAsB,EACxCe,oBAAoB7D,IAAI,mBAAoBmN,EAAW,CAAA,CAAK,EAC5DpN,kBAAkBC,IAAI,kBAAmB,CAAC,EACtC7W,SAASgD,UACQ,IAAIihB,IAAIjkB,SAASgD,QAAQ,EAC3BkhB,OAASphB,SAASohB,MAC7BxJ,oBAAoB7D,IAAI,qBAAsB7W,SAASgD,SAAU,CAAA,CAAK,GAOlFmhB,oCAAoC,EAdpC,IAgBMC,EAAcxN,kBAAkBiD,IAAI,iBAAiB,EAoBrDwK,GAnBCD,GAAeA,IAAgBtjB,SAAS2V,qBAC3CG,kBAAkBC,IAAI,kBAAmB/V,SAAS2V,kBAAkB,EACpEG,kBAAkB2D,OAAO,gBAAgB,EACzC3D,kBAAkB2D,OAAO,iBAAiB,GAGV,gBAAhCzZ,SAAS2V,qBACT+L,uBAAuB,EAEvBvd,WAAWud,uBAAwB,GAAI,GAG3CjV,OAAOhH,iBAAiB,iBAAkBqU,sBAAuB,CAAA,CAAI,EACrErN,OAAOhH,iBAAiB,QAASyU,aAAc,CAAA,CAAI,EACnDhb,SAASskB,WAAa,IAAIhI,WAC1Btc,SAASskB,WAAWtH,gBAAgB,EACpChd,SAASskB,WAAW9O,aAAa,EAGb,CAChB,CAAC,kBAAmB7F,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAekD,OAAOkH,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkB1V,UAAU2V,aAWjC,GARA7N,kBAAkBC,IAAI,kBAAmBlH,KAAKC,OAAM,IAAIvC,MAAO8M,QAAQ,EAAI,GAAI,CAAC,EAChFvD,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,IACI+Y,EADgBwL,EAAatkB,GAAGukB,KAAK,EACVlf,MAAM,GAAG,EAAE,GACW,IAAhDyT,EAAW/V,QAAQ,uBAAuB,GAC3C8V,eAAeC,CAAU,CAEjC,CAER,CAGI,CAAA,CAACpY,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,kBAAkB0D,MAAM,YAAY,EACpC+J,EAAYrb,KAAK,CAAC,aAAc4N,kBAAkBiD,IAAI,YAAY,EAAE,EAEpEwK,EAAYrb,KAAK,CAAC,aAAc,EAAE,EAItCwO,8BAA8B,EAG9BrX,IAAI4kB,EAAmBnO,kBAAkBiD,IAAI,0BAA0B,EAqGnE1Y,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,CACb/O,WAAY,SAAS3I,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,kBAAkBiD,IAAI,0BAA0B,EAG1C,OAA9BsO,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,kBAAoBhQ,YAAY9W,kBAAkBsV,aAAe,mBAAmB,EACnGuR,EAAeE,wBAA0BjQ,YAAY9W,kBAAkBsV,aAAe,yBAAyB,EAC/GuR,EAAeG,WAAalQ,YAAY9W,kBAAkBsV,aAAe,YAAY,EACrFuR,EAAeI,iBAAmBnQ,YAAY9W,kBAAkBsV,aAAe,kBAAkB,EACjGuR,EAAeK,gBAAkBpQ,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EAC/FuR,EAAeM,gBAAkBrQ,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EAC/FuR,EAAeO,eAAiBtQ,YAAY9W,kBAAkBsV,aAAe,gBAAgB,EAC7FuR,EAAeQ,YAAcvQ,YAAY9W,kBAAkBsV,aAAe,aAAa,EAGvF,IAAMgS,EAA2B1S,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,gBAAgB,EAClGiS,EAA4B3S,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,iBAAiB,EACpGkS,EAA4B5S,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,iBAAiB,EACpGmS,EAAgB7S,kBAAkBiD,IAAI,iBAAiB,EACvD6P,EAAmBhP,oBAAoBb,IAAI,oBAAoB,EAC/D8P,EAAmBjP,oBAAoBb,IAAI,oBAAoB,EAC/D+P,EAAyBhT,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,cAAc,EAC9FuS,EAAajT,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,iBAAiB,EACrFwS,EAAgBlT,kBAAkBiD,IAAI7X,kBAAkBsV,aAAe,gBAAgB,EACvFyS,EAA+BnT,kBAAkBiD,IACnD7X,kBAAkBsV,aAAe,mCACrC,EAGM0S,EAAqBlR,YAAY9W,kBAAkBsV,aAAe,gBAAgB,EAClF2S,EAAsBnR,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EACpF4S,EAAsBpR,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EACpF6S,EAAoBrR,YAAY9W,kBAAkBsV,aAAe,iBAAiB,EAClF8S,EAAsB,CAAC,CAACtR,YAAY9W,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,EAAQyJ,GAC1D,GAA8D,EAAzDnZ,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,SAAS2Y,cACL,IAAIC,YAAa,qBAAsB,CACnCuC,QAAS,CAAA,EACTE,OAAQ,CAACvN,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,IAAI8a,EAAY,SACH,WAATtF,IACAsF,EAAY,UAEhB9a,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,OAAQkZ,CAAS,EACpCgC,EAAM/c,UAAUsB,IAAI,qBAAqB,EACzCyb,EAAM/c,UAAUsB,IAAI,2BAA2B,EACxCyb,CACX,CAOA,SAASmL,+BACLjoB,IAWQ+sB,EAXJC,EAAoBvW,kBAAkB6D,iBAAiB,EACvD2S,EAAsB1S,oBAAoBD,iBAAiB,EAE/Dta,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,kBAAkB6D,iBAAiB,EACvD2S,EAAsB1S,oBAAoBD,iBAAiB,EAC3DsL,EAAe,CAAC,GAAGoH,EAAmB,GAAGC,CAAmB,EAChErH,EAAetiB,KAAKC,UAAUqiB,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS5B,sCACL,IAAMqK,EAAqB9T,oBAAoBb,IAAI,4BAA4B,EAGrD,CAAA,IAAtB2U,GAA+BxuB,SAAS8C,SAASC,OAASyrB,GAC1D9T,oBAAoB7D,IAAI,qBAAsB2X,EAAoB,CAAA,CAAK,EAI3E9T,oBAAoB7D,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,kBAAkBiD,IAAI,0BAA0B,EAC5D8J,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,EAAQyJ,GAC3CwT,eAAe8B,QAAU,CAAA,EACzB9B,eAAeC,OAAS7oB,EACxB/D,SAAS2Y,cACL,IAAIC,YAAa,8BAA+B,CAC5CuC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAOrW,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,SAAS2Y,cACL,IAAIC,YAAa,uBAAwB,CACrCuC,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EA0LA,SAASqV,mBACLrwB,IAAIswB,EAAkBzwB,SAASuH,iBAAiB,gCAAgC,EACnD,EAAzBkpB,EAAgBpwB,QAChBowB,EAAgBprB,QAAQ,IACpBwB,EAAQ3G,UAAUiG,OAAO,SAAS,CACtC,CAAC,CAET,CA9LAnG,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,IAAIuwB,EAAgBrd,KAAAA,EAChBsd,EAA2B,CAAA,EAgB/B,GAdyB,aAApB,OAAO7vB,UAA0D,aAA9B,OAAO8vB,oBAKd,KAAA,KAHzBF,EADqB,aAApB,OAAO5vB,UAA4BA,SAAS+vB,cAC7B/vB,SAAS+vB,cAGlBH,IACuB,aAA9B,OAAOE,oBACPA,mBAAmBC,gBAEnBH,EAAgBE,mBAAmBC,cACnCF,EAA2B,CAAA,GAI5BD,EAAP,CAKAvwB,IAAI2wB,EAAyB,wCACxB9wB,SAAS2F,cAAc,iDAAiD,IAEzEmrB,EAAyB,8CAE7B3wB,IAEM4wB,EAAc/wB,SAASuH,iBACzBupB,EAF4B,uFAIH,EAED,IAAvBC,EAAY1wB,SAIjB0wB,EAAY1rB,QAAQ,CAAEwB,EAASmqB,KAE3B,IAQIC,EAGAC,EAIAC,EAGAC,EAIAC,EAGAC,EAKIC,EA7Bc,aAAlB,OAAOC,SACP3qB,EAAQ6F,cAAcvC,UAAUhH,QAAQ,OAAO,EAAI,GAChC,OAAnB0D,EAAQwF,WAKR4kB,EAAYjxB,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uBAAuB,GAEnDmvB,EAAWlxB,SAASC,cAAc,KAAK,GAClC8B,aAAa,MAAO2uB,EAAce,YAAY,EACvDP,EAASnvB,aAAa,QAAS,2BAA2B,GAEtDovB,EAAiBnxB,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,uBAAuB,GAExDqvB,EAAwBpxB,SAASC,cAAc,GAAG,GAChC8B,aAAa,QAAS,8BAA8B,EAC1EqvB,EAAsB5wB,OAAOkwB,EAAcgB,QAAQC,UAAU,GAEzDN,EAAwBrxB,SAASC,cAAc,KAAK,GAClC8B,aAAa,QAAS,mCAAmC,GAE3EuvB,EAA4BtxB,SAASC,cAAc,MAAM,GACnCO,OAAOkwB,EAAcgB,QAAQE,YAAc,GAAG,EACxEN,EAA0B9wB,OAAOkwB,EAAcgB,QAAQG,WAAW,EAE7DlB,KACGY,EAAgBvxB,SAASC,cAAc,GAAG,GAChC8B,aAAa,OAAQ2uB,EAAcoB,cAAc,EAC/DP,EAAcxvB,aAAa,SAAU,QAAQ,EAC7CwvB,EAAcQ,KAAOrB,EAAcgB,QAAQM,oBAC3CV,EAA0B9wB,OAAO,GAAG,EACpC8wB,EAA0B9wB,OAAO+wB,CAAa,GAGlDF,EAAsB7wB,OAAO8wB,CAAyB,EACtDH,EAAe3wB,OAAO4wB,EAAuBC,CAAqB,EAClEJ,EAAUzwB,OAAO0wB,CAAQ,EACzBrqB,EAAQrG,OAAOywB,CAAS,EACxBpqB,EAAQrG,OAAO2wB,CAAc,EACjC,CAAC,EAEcnxB,SAASuH,iBAAiB,wBAAwB,EAE1DlC,QAAQ,IACXlF,IAAI8xB,EAAc5e,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,EAED0B,EAAM3rB,iBAAiB,QAAS,WAC5B,IAAMrB,EAAQnE,KAAKoxB,mBACfjtB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUoK,OAAO,SAAS,CAExC,CAAC,EAED4nB,EAAM3rB,iBAAiB,aAAc,WACjCiqB,iBAAiB,EACjB,IAAMtrB,EAAQnE,KAAKoxB,mBACfjtB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUsB,IAAI,SAAS,CAErC,CAAC,EAED0wB,EAAM3rB,iBAAiB,aAAc,WACjC0rB,EAAchtB,WAAW,KACrB,IAAMC,EAAQnE,KAAKoxB,mBACfjtB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAEa+rB,EAAMC,oBACpBjtB,EAAMqB,iBAAiB,aAAc,WACjC6rB,aAAaH,CAAW,EACxB/sB,EAAMhF,UAAUsB,IAAI,SAAS,CACjC,CAAC,EAED0D,EAAMqB,iBAAiB,aAAc,WACjC0rB,EAAchtB,WAAW,KACjBC,EAAMhF,UAAUkmB,SAAS,uBAAuB,GAChDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAGD+rB,EAAM3rB,iBAAiB,WAAY,WAC/B0rB,EAAchtB,WAAW,KACrB,IAAMC,EAAQnE,KAAKoxB,mBACbE,EAAY9kB,OAAOmI,aAAa,EAElCxQ,GAASmtB,GAAantB,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACtC,IAAhCiM,EAAUne,SAAS,EAAE7T,OAErB6E,EAAMhF,UAAUiG,OAAO,SAAS,GAEhCisB,aAAaH,CAAW,EACxBjyB,SAASuG,iBAAiB,kBAAmB,SAAS+rB,IAClD,IAAMD,EAAY9kB,OAAOmI,aAAa,EAClC2c,GAA6C,IAAhCA,EAAUne,SAAS,EAAE7T,SAElC4xB,EAAchtB,WAAW,KACrB,IAAMC,EAAQgtB,EAAMC,mBAChBjtB,GAASA,EAAMhF,UAAUkmB,SAAS,uBAAuB,GACzDlhB,EAAMhF,UAAUiG,OAAO,SAAS,CAExC,EAAG,GAAI,EACPnG,SAASgB,oBAAoB,kBAAmBsxB,CAAiB,EAEzE,CAAC,EAET,EAAG,GAAI,CACX,CAAC,CACL,CAAC,EAlJD,CAmJJ,CAAC,EAcD,IAAMC,gBAAkBvyB,SAASC,cAAc,KAAK,EAoKpD,SAASuyB,qBACLxyB,SAAS2F,cAAc,yBAAyB,EAAEwb,YAAc,MAChEoR,gBAAgBlwB,MAAMkf,MAAQ,QAC9BgR,gBAAgBlwB,MAAMowB,WAAa,OACnCzyB,SAAS2F,cAAc,yBAAyB,EAAEtD,MAAMowB,WAAa,OACrEzyB,SAAS2F,cAAc,yBAAyB,EAAEtD,MAAMof,MAAQ,OAChEzhB,SAAS2F,cAAc,yBAAyB,EAAEtD,MAAMqwB,WAAa,OACzE,CAMA,SAASC,gBAAgBC,GAErB,IAAMC,EAAS,GACTC,EAAQF,EAASzqB,SACvBhI,IAAI8Q,EAEJ,IAAKA,KAAO6hB,EACgB,WAApBA,EAAM7hB,GAAK0E,MACUtC,KAAAA,IAArByf,EAAM7hB,GAAKzF,OACU,KAArBsnB,EAAM7hB,GAAKzF,QACXqnB,EAAOC,EAAM7hB,GAAKtF,MAAQinB,EAASzqB,SAAS8I,GAAKzF,OAGzDqnB,EAAOtuB,OAAS,oBAGhBC,sBACIquB,EACA,CACIjlB,IAAK5L,kBAAkByX,UACvB3V,SAAU,SAASpB,GACf,GAAqB,CAAA,IAAjBA,EAAKqC,QAIL,OADAguB,MAAMrwB,EAAKA,IAAI,EACR,CAAA,EAHPkwB,EAASI,WAAW,CAK5B,CACJ,CACJ,CACJ,CAoBA,SAASC,yBACL9yB,IAYkB+yB,EAZdC,EAAe,GACfC,EAAa,GAEjB,IAAMjzB,IAAIC,EAAI,EAAGA,EAAIJ,SAASuV,MAAMlV,OAAQD,CAAC,GACA,UAApC,OAAOJ,SAASuV,MAAMnV,GAAS,QAIU,QAAtC+yB,GAFWC,EADFpzB,SAASuV,MAAMnV,IACFmE,QAETpB,QAAQ,WAAW,GACwB,OAAxDgwB,EAAannB,MAAMlL,SAASuyB,UAAY,SAAU,GAChDC,8BAA8BH,CAAY,IAEtCD,EAAYE,EAAWG,UAAU,CAAA,CAAI,EAC3CH,EAAW9K,WAAWkL,aAAaN,EAAWE,CAAU,EAExDF,EAAUF,WAAaI,EAAW5K,OAClC0K,EAAU1K,OAAS,KAEnB0K,EAAU3sB,iBAAiB,SAAU,SAAS7F,GAK1C,OAJAA,EAAM0C,eAAe,EACrB1C,EAAMsK,gBAAgB,EACtBtK,EAAM+yB,yBAAyB,EAC/Bd,gBAAgBjyB,EAAMoH,MAAM,EACrB,CAAA,CACX,CAAC,EAIjB,CAOA,SAASwrB,8BAA8B/uB,GAOnC,MALmC,CAC/B,eACA,wBAG8BmvB,KAAK,GACmC,OAA/DnvB,EAAOyH,MAAM,IAAIgN,OAAOlY,SAASuyB,UAAY,KAAO1c,CAAI,CAAC,CACnE,CACL,CA/QA3W,SAASuG,iBAAiB,mBAAoB,WAC1CgsB,gBAAgBpoB,UAAY,6BAC5BhK,IAAIwzB,EAAY,KAwBhB,SAASC,IACLzzB,IAAI0zB,EAAU,CAAC,MAAO,SAClB9vB,EAAS8vB,EAAQlkB,KAAKC,MAAMD,KAAKE,OAAO,EAAIgkB,EAAQxzB,MAAM,GAE9DL,SAAS2F,cAAc,0BAA0B,EAAEQ,OAAO,EAC1DnG,SAAS2F,cAAc,+BAA+B,EAAEQ,OAAO,EAC/DnG,SAAS2F,cAAc,6BAA6B,EAAEtD,MAAM+e,OAAS,OAGrEjhB,IAAI4F,EAAQ,cACR+tB,EAAM,GACNC,EAAc,GAClB,OAAQhwB,GACJ,IAAK,MACDW,QAAQC,IAAI,KAAK,EAEjBmvB,EAAM,wOACN,MACJ,IAAK,QACDpvB,QAAQC,IAAI,OAAO,EACnBoB,EAAQ,kBACR+tB,EAAM,4LACNC,EAAc,4DAEtB,CACA/zB,SAAS2F,cAAc,yBAAyB,EAAEwb,YAAcpb,EAC1DiuB,EAAMh0B,SAASC,cAAc,KAAK,EACxC+zB,EAAI7pB,UAAY,yBAChB6pB,EAAI9xB;cACE4xB;wDAC0CC;UAEhDxB,gBAAgB1tB,YAAYmvB,CAAG,CACnC,CAtDAh0B,SAASuG,iBAAiB,qBAAsB,WAC5CgsB,gBAAgBlwB,MAAM2H,QAAU,QAChC2pB,EAAY,IAAItmB,IACpB,CAAC,EAEDrN,SAASuG,iBAAiB,mBAAoB,WAC1C7B,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3E,SAASuG,iBAAiB,sBAAuB,WACzCotB,GAAa,IAAItmB,KAASsmB,EAZR,IAalB1uB,WAAW,KACP2uB,EAAW,CACf,EAfkB,KAeQ,IAAIvmB,KAASsmB,EAAU,EAGrD1uB,WAAW,KACP2uB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EAsCD5zB,SAASuG,iBAAiB,qBAAsB,WAC5C7B,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtC,EAAQrC,SAASC,cAAc,OAAO,EAmEtC8F,GAlEN1D,EAAM8e;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNnhB,SAASi0B,KAAKpvB,YAAYxC,CAAK,EAG/BkwB,gBAAgBlwB,MAAM6xB;;;;;;;;;;;;;;;;;MAoBRl0B,SAASC,cAAc,KAAK,GASpCk0B,GARNpuB,EAAMoE,UAAY,yBAClBpE,EAAM1D,MAAM6xB;;MAGZnuB,EAAMob,YAAc,cACpBoR,gBAAgB1tB,YAAYkB,CAAK,EAGlB/F,SAASC,cAAc,KAAK,GAQrCm0B,GAPND,EAAOhqB,UAAY,0BAGnBooB,gBAAgB1tB,YAAYsvB,CAAM,EAClCn0B,SAASuB,KAAKsD,YAAY0tB,eAAe,EAGrBvyB,SAASC,cAAc,KAAK,GAChDm0B,EAAYjqB,UAAY,+BACxBiqB,EAAY/xB,MAAM6xB;;MAGlBE,EAAYjT,YAAc,gBAC1BoR,gBAAgB1tB,YAAYuvB,CAAW,CAC3C,CAAC,EA+CDp0B,SAASuG,iBAAiB,mBAAoB,WACnC,CAACzF,SAASuzB,kCAIjBpvB,WAAW,KACPguB,uBAAuB,CAC3B,EAAG,GAAG,EAENjzB,SAASuG,iBAAiB,8BAA+B,WACrD0sB,uBAAuB,CAC3B,CAAC,EACL,CAAC"} \ No newline at end of file diff --git a/js/src/apbct-public--1--functions.js b/js/src/apbct-public--1--functions.js index f7a958c23..0069726bb 100644 --- a/js/src/apbct-public--1--functions.js +++ b/js/src/apbct-public--1--functions.js @@ -142,6 +142,7 @@ function ctSetAlternativeCookie(cookies, params) { ) { cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); apbct_public_sendREST( 'alt_sessions', { @@ -151,7 +152,7 @@ function ctSetAlternativeCookie(cookies, params) { onErrorCallback: onErrorCallback, }, ); - + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); // Using AJAX request and handler } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { apbct_public_sendAJAX( diff --git a/js/src/apbct-public--8--browser-check.js b/js/src/apbct-public--8--browser-check.js new file mode 100644 index 000000000..94375b3b7 --- /dev/null +++ b/js/src/apbct-public--8--browser-check.js @@ -0,0 +1,172 @@ +const loaderContainer = document.createElement('div'); + +document.addEventListener('DOMContentLoaded', function() { + loaderContainer.className = 'ct-browser-check-container'; + let startTime = null; + let timeoutToShowResult = 3000; + + document.addEventListener('ctBotDetectorStart', function() { + loaderContainer.style.display = 'block'; + startTime = new Date(); + }); + + document.addEventListener('ctBotDetectorEnd', function() { + console.log('ctBotDetectorEnd'); + }); + + document.addEventListener('ctBotDetectorResult', function() { + if (startTime && new Date() - startTime < timeoutToShowResult) { + setTimeout(() => { + showResult(); + }, timeoutToShowResult - (new Date() - startTime)); + return; + } + setTimeout(() => { + showResult(); + }, timeoutToShowResult); + }); + + function showResult() { + let results = ['bot', 'human']; + let result = results[Math.floor(Math.random() * results.length)]; + + document.querySelector('.ct-browser-check-loader').remove(); + document.querySelector('.ct-browser-check-description').remove(); + document.querySelector('.ct-browser-check-container').style.height = '50px'; + + // prepare data + let title = 'botDetector'; + let svg = ''; + let arrowAction = ''; + switch (result) { + case 'bot': + console.log('bot'); + // red cross + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; + } + document.querySelector('.ct-browser-check-title').textContent = title; + const dev = document.createElement('div'); + dev.className = 'ct-browser-check-human'; + dev.innerHTML = ` + ${svg} + > + `; + loaderContainer.appendChild(dev); + } + + + document.addEventListener('ctBotDetectorError', function() { + console.log('ctBotDetectorError'); + }); + + console.log('DOMContentLoaded'); + + // Create and add styles + const style = document.createElement('style'); + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `; + document.head.appendChild(style); + + // Create loader container + loaderContainer.style.cssText = ` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `; + + // add div with title + const title = document.createElement('div'); + title.className = 'ct-browser-check-title'; + title.style.cssText = ` + border-bottom: 1px solid #bbbbbb; + `; + title.textContent = 'botDetector'; + loaderContainer.appendChild(title); + + // Create loader element + const loader = document.createElement('div'); + loader.className = 'ct-browser-check-loader'; + + // Add loader to container and container to body + loaderContainer.appendChild(loader); + document.body.appendChild(loaderContainer); + + // add div with description + const description = document.createElement('div'); + description.className = 'ct-browser-check-description'; + description.style.cssText = ` + border-top: 1px solid #bbbbbb; + `; + description.textContent = 'Browser check'; + loaderContainer.appendChild(description); +}); + +function ctBrowserCheckHide() { + document.querySelector('.ct-browser-check-title').textContent = 'TRP'; + loaderContainer.style.right = '-70px'; + loaderContainer.style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.width = '40px'; + document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +} diff --git a/js/src/apbct-public-bundle.js b/js/src/apbct-public-bundle.js index e37770cec..e5f07fe23 100644 --- a/js/src/apbct-public-bundle.js +++ b/js/src/apbct-public-bundle.js @@ -1433,6 +1433,7 @@ function ctSetAlternativeCookie(cookies, params) { ) { cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); apbct_public_sendREST( 'alt_sessions', { @@ -1442,7 +1443,7 @@ function ctSetAlternativeCookie(cookies, params) { onErrorCallback: onErrorCallback, }, ); - + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); // Using AJAX request and handler } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { apbct_public_sendAJAX( @@ -4251,6 +4252,179 @@ function closeAllPopupTRP() { } } +const loaderContainer = document.createElement('div'); + +document.addEventListener('DOMContentLoaded', function() { + loaderContainer.className = 'ct-browser-check-container'; + let startTime = null; + let timeoutToShowResult = 3000; + + document.addEventListener('ctBotDetectorStart', function() { + loaderContainer.style.display = 'block'; + startTime = new Date(); + }); + + document.addEventListener('ctBotDetectorEnd', function() { + console.log('ctBotDetectorEnd'); + }); + + document.addEventListener('ctBotDetectorResult', function() { + if (startTime && new Date() - startTime < timeoutToShowResult) { + setTimeout(() => { + showResult(); + }, timeoutToShowResult - (new Date() - startTime)); + return; + } + setTimeout(() => { + showResult(); + }, timeoutToShowResult); + }); + + function showResult() { + let results = ['bot', 'human']; + let result = results[Math.floor(Math.random() * results.length)]; + + document.querySelector('.ct-browser-check-loader').remove(); + document.querySelector('.ct-browser-check-description').remove(); + document.querySelector('.ct-browser-check-container').style.height = '50px'; + + // prepare data + let title = 'botDetector'; + let svg = ''; + let arrowAction = ''; + switch (result) { + case 'bot': + console.log('bot'); + // red cross + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; + } + document.querySelector('.ct-browser-check-title').textContent = title; + const dev = document.createElement('div'); + dev.className = 'ct-browser-check-human'; + dev.innerHTML = ` + ${svg} + > + `; + loaderContainer.appendChild(dev); + } + + + document.addEventListener('ctBotDetectorError', function() { + console.log('ctBotDetectorError'); + }); + + console.log('DOMContentLoaded'); + + // Create and add styles + const style = document.createElement('style'); + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `; + document.head.appendChild(style); + + // Create loader container + loaderContainer.style.cssText = ` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `; + + // add div with title + const title = document.createElement('div'); + title.className = 'ct-browser-check-title'; + title.style.cssText = ` + border-bottom: 1px solid #bbbbbb; + `; + title.textContent = 'botDetector'; + loaderContainer.appendChild(title); + + // Create loader element + const loader = document.createElement('div'); + loader.className = 'ct-browser-check-loader'; + + // Add loader to container and container to body + loaderContainer.appendChild(loader); + document.body.appendChild(loaderContainer); + + // add div with description + const description = document.createElement('div'); + description.className = 'ct-browser-check-description'; + description.style.cssText = ` + border-top: 1px solid #bbbbbb; + `; + description.textContent = 'Browser check'; + loaderContainer.appendChild(description); +}); + +function ctBrowserCheckHide() { + document.querySelector('.ct-browser-check-title').textContent = 'TRP'; + loaderContainer.style.right = '-70px'; + loaderContainer.style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.width = '40px'; + document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +} + /** * @return {HTMLElement} event */ diff --git a/js/src/apbct-public-bundle_ext-protection.js b/js/src/apbct-public-bundle_ext-protection.js index cae5bdec0..8b04579ec 100644 --- a/js/src/apbct-public-bundle_ext-protection.js +++ b/js/src/apbct-public-bundle_ext-protection.js @@ -1433,6 +1433,7 @@ function ctSetAlternativeCookie(cookies, params) { ) { cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); apbct_public_sendREST( 'alt_sessions', { @@ -1442,7 +1443,7 @@ function ctSetAlternativeCookie(cookies, params) { onErrorCallback: onErrorCallback, }, ); - + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); // Using AJAX request and handler } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { apbct_public_sendAJAX( @@ -4251,6 +4252,179 @@ function closeAllPopupTRP() { } } +const loaderContainer = document.createElement('div'); + +document.addEventListener('DOMContentLoaded', function() { + loaderContainer.className = 'ct-browser-check-container'; + let startTime = null; + let timeoutToShowResult = 3000; + + document.addEventListener('ctBotDetectorStart', function() { + loaderContainer.style.display = 'block'; + startTime = new Date(); + }); + + document.addEventListener('ctBotDetectorEnd', function() { + console.log('ctBotDetectorEnd'); + }); + + document.addEventListener('ctBotDetectorResult', function() { + if (startTime && new Date() - startTime < timeoutToShowResult) { + setTimeout(() => { + showResult(); + }, timeoutToShowResult - (new Date() - startTime)); + return; + } + setTimeout(() => { + showResult(); + }, timeoutToShowResult); + }); + + function showResult() { + let results = ['bot', 'human']; + let result = results[Math.floor(Math.random() * results.length)]; + + document.querySelector('.ct-browser-check-loader').remove(); + document.querySelector('.ct-browser-check-description').remove(); + document.querySelector('.ct-browser-check-container').style.height = '50px'; + + // prepare data + let title = 'botDetector'; + let svg = ''; + let arrowAction = ''; + switch (result) { + case 'bot': + console.log('bot'); + // red cross + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; + } + document.querySelector('.ct-browser-check-title').textContent = title; + const dev = document.createElement('div'); + dev.className = 'ct-browser-check-human'; + dev.innerHTML = ` + ${svg} + > + `; + loaderContainer.appendChild(dev); + } + + + document.addEventListener('ctBotDetectorError', function() { + console.log('ctBotDetectorError'); + }); + + console.log('DOMContentLoaded'); + + // Create and add styles + const style = document.createElement('style'); + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `; + document.head.appendChild(style); + + // Create loader container + loaderContainer.style.cssText = ` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `; + + // add div with title + const title = document.createElement('div'); + title.className = 'ct-browser-check-title'; + title.style.cssText = ` + border-bottom: 1px solid #bbbbbb; + `; + title.textContent = 'botDetector'; + loaderContainer.appendChild(title); + + // Create loader element + const loader = document.createElement('div'); + loader.className = 'ct-browser-check-loader'; + + // Add loader to container and container to body + loaderContainer.appendChild(loader); + document.body.appendChild(loaderContainer); + + // add div with description + const description = document.createElement('div'); + description.className = 'ct-browser-check-description'; + description.style.cssText = ` + border-top: 1px solid #bbbbbb; + `; + description.textContent = 'Browser check'; + loaderContainer.appendChild(description); +}); + +function ctBrowserCheckHide() { + document.querySelector('.ct-browser-check-title').textContent = 'TRP'; + loaderContainer.style.right = '-70px'; + loaderContainer.style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.width = '40px'; + document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +} + /** * Handle external forms */ diff --git a/js/src/apbct-public-bundle_full-protection.js b/js/src/apbct-public-bundle_full-protection.js index fb4315a8f..f237744a8 100644 --- a/js/src/apbct-public-bundle_full-protection.js +++ b/js/src/apbct-public-bundle_full-protection.js @@ -1874,6 +1874,7 @@ function ctSetAlternativeCookie(cookies, params) { ) { cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); apbct_public_sendREST( 'alt_sessions', { @@ -1883,7 +1884,7 @@ function ctSetAlternativeCookie(cookies, params) { onErrorCallback: onErrorCallback, }, ); - + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); // Using AJAX request and handler } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { apbct_public_sendAJAX( @@ -5849,3 +5850,176 @@ function ctCheckInternalIsExcludedForm(action) { return action.match(new RegExp(ctPublic.blog_home + '.*' + item)) !== null; }); } + +const loaderContainer = document.createElement('div'); + +document.addEventListener('DOMContentLoaded', function() { + loaderContainer.className = 'ct-browser-check-container'; + let startTime = null; + let timeoutToShowResult = 3000; + + document.addEventListener('ctBotDetectorStart', function() { + loaderContainer.style.display = 'block'; + startTime = new Date(); + }); + + document.addEventListener('ctBotDetectorEnd', function() { + console.log('ctBotDetectorEnd'); + }); + + document.addEventListener('ctBotDetectorResult', function() { + if (startTime && new Date() - startTime < timeoutToShowResult) { + setTimeout(() => { + showResult(); + }, timeoutToShowResult - (new Date() - startTime)); + return; + } + setTimeout(() => { + showResult(); + }, timeoutToShowResult); + }); + + function showResult() { + let results = ['bot', 'human']; + let result = results[Math.floor(Math.random() * results.length)]; + + document.querySelector('.ct-browser-check-loader').remove(); + document.querySelector('.ct-browser-check-description').remove(); + document.querySelector('.ct-browser-check-container').style.height = '50px'; + + // prepare data + let title = 'botDetector'; + let svg = ''; + let arrowAction = ''; + switch (result) { + case 'bot': + console.log('bot'); + // red cross + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; + } + document.querySelector('.ct-browser-check-title').textContent = title; + const dev = document.createElement('div'); + dev.className = 'ct-browser-check-human'; + dev.innerHTML = ` + ${svg} + > + `; + loaderContainer.appendChild(dev); + } + + + document.addEventListener('ctBotDetectorError', function() { + console.log('ctBotDetectorError'); + }); + + console.log('DOMContentLoaded'); + + // Create and add styles + const style = document.createElement('style'); + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `; + document.head.appendChild(style); + + // Create loader container + loaderContainer.style.cssText = ` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `; + + // add div with title + const title = document.createElement('div'); + title.className = 'ct-browser-check-title'; + title.style.cssText = ` + border-bottom: 1px solid #bbbbbb; + `; + title.textContent = 'botDetector'; + loaderContainer.appendChild(title); + + // Create loader element + const loader = document.createElement('div'); + loader.className = 'ct-browser-check-loader'; + + // Add loader to container and container to body + loaderContainer.appendChild(loader); + document.body.appendChild(loaderContainer); + + // add div with description + const description = document.createElement('div'); + description.className = 'ct-browser-check-description'; + description.style.cssText = ` + border-top: 1px solid #bbbbbb; + `; + description.textContent = 'Browser check'; + loaderContainer.appendChild(description); +}); + +function ctBrowserCheckHide() { + document.querySelector('.ct-browser-check-title').textContent = 'TRP'; + loaderContainer.style.right = '-70px'; + loaderContainer.style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.width = '40px'; + document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +} diff --git a/js/src/apbct-public-bundle_int-protection.js b/js/src/apbct-public-bundle_int-protection.js index 877bbb10b..ab0cdeb97 100644 --- a/js/src/apbct-public-bundle_int-protection.js +++ b/js/src/apbct-public-bundle_int-protection.js @@ -1874,6 +1874,7 @@ function ctSetAlternativeCookie(cookies, params) { ) { cookies.apbct_pixel_url = decodeURIComponent(cookies.apbct_pixel_url); } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); apbct_public_sendREST( 'alt_sessions', { @@ -1883,7 +1884,7 @@ function ctSetAlternativeCookie(cookies, params) { onErrorCallback: onErrorCallback, }, ); - + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); // Using AJAX request and handler } else if ( ctPublicFunctions.data__ajax_type === 'admin_ajax' ) { apbct_public_sendAJAX( @@ -4692,6 +4693,179 @@ function closeAllPopupTRP() { } } +const loaderContainer = document.createElement('div'); + +document.addEventListener('DOMContentLoaded', function() { + loaderContainer.className = 'ct-browser-check-container'; + let startTime = null; + let timeoutToShowResult = 3000; + + document.addEventListener('ctBotDetectorStart', function() { + loaderContainer.style.display = 'block'; + startTime = new Date(); + }); + + document.addEventListener('ctBotDetectorEnd', function() { + console.log('ctBotDetectorEnd'); + }); + + document.addEventListener('ctBotDetectorResult', function() { + if (startTime && new Date() - startTime < timeoutToShowResult) { + setTimeout(() => { + showResult(); + }, timeoutToShowResult - (new Date() - startTime)); + return; + } + setTimeout(() => { + showResult(); + }, timeoutToShowResult); + }); + + function showResult() { + let results = ['bot', 'human']; + let result = results[Math.floor(Math.random() * results.length)]; + + document.querySelector('.ct-browser-check-loader').remove(); + document.querySelector('.ct-browser-check-description').remove(); + document.querySelector('.ct-browser-check-container').style.height = '50px'; + + // prepare data + let title = 'botDetector'; + let svg = ''; + let arrowAction = ''; + switch (result) { + case 'bot': + console.log('bot'); + // red cross + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; + } + document.querySelector('.ct-browser-check-title').textContent = title; + const dev = document.createElement('div'); + dev.className = 'ct-browser-check-human'; + dev.innerHTML = ` + ${svg} + > + `; + loaderContainer.appendChild(dev); + } + + + document.addEventListener('ctBotDetectorError', function() { + console.log('ctBotDetectorError'); + }); + + console.log('DOMContentLoaded'); + + // Create and add styles + const style = document.createElement('style'); + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + .ct-browser-check-human { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + .ct-browser-check-human svg { + width: 20px; + height: 20px; + } + .ct-browser-check-human-arrow { + font-size: 20px; + font-weight: bold; + color: #777777; + padding-left: 15px; + margin-bottom: 2px; + } + `; + document.head.appendChild(style); + + // Create loader container + loaderContainer.style.cssText = ` + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 110px; + height: 80px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + `; + + // add div with title + const title = document.createElement('div'); + title.className = 'ct-browser-check-title'; + title.style.cssText = ` + border-bottom: 1px solid #bbbbbb; + `; + title.textContent = 'botDetector'; + loaderContainer.appendChild(title); + + // Create loader element + const loader = document.createElement('div'); + loader.className = 'ct-browser-check-loader'; + + // Add loader to container and container to body + loaderContainer.appendChild(loader); + document.body.appendChild(loaderContainer); + + // add div with description + const description = document.createElement('div'); + description.className = 'ct-browser-check-description'; + description.style.cssText = ` + border-top: 1px solid #bbbbbb; + `; + description.textContent = 'Browser check'; + loaderContainer.appendChild(description); +}); + +function ctBrowserCheckHide() { + document.querySelector('.ct-browser-check-title').textContent = 'TRP'; + loaderContainer.style.right = '-70px'; + loaderContainer.style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; + document.querySelector('.ct-browser-check-title').style.width = '40px'; + document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +} + /** * Check form as internal. * @param {int} currForm Current form. From e24ff2532c54f5881aed97082e04dd757250e134 Mon Sep 17 00:00:00 2001 From: svfcode Date: Mon, 5 May 2025 14:51:09 +0300 Subject: [PATCH 2/5] fix eslint --- js/apbct-public--8--browser-check.min.js.map | 2 +- ...ct-public-bundle_ext-protection.min.js.map | 2 +- ...t-public-bundle_full-protection.min.js.map | 2 +- ...ct-public-bundle_int-protection.min.js.map | 2 +- js/src/apbct-public--8--browser-check.js | 31 ++++++++++++------- js/src/apbct-public-bundle.js | 31 ++++++++++++------- js/src/apbct-public-bundle_ext-protection.js | 31 ++++++++++++------- js/src/apbct-public-bundle_full-protection.js | 31 ++++++++++++------- js/src/apbct-public-bundle_int-protection.js | 31 ++++++++++++------- 9 files changed, 104 insertions(+), 59 deletions(-) diff --git a/js/apbct-public--8--browser-check.min.js.map b/js/apbct-public--8--browser-check.min.js.map index 9e925436b..2e58d1096 100644 --- a/js/apbct-public--8--browser-check.min.js.map +++ b/js/apbct-public--8--browser-check.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EAoKpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAzKAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KAwBhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACJ,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBACRC,EAAM,4LACNC,EAAc,4DAEtB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CAtDA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EAsCDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file +{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EA6KpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAlLAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KA2BhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACR,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CA1DA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file diff --git a/js/apbct-public-bundle_ext-protection.min.js.map b/js/apbct-public-bundle_ext-protection.min.js.map index 49235d253..5f33c382e 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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":"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,IAAME,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,IAbKL,IAC3BM,EAAsBnE,SAASoE,cAAcP,CAAI,EAAErE,YAChD,CAAE6E,QAAS,CAAC,CAACC,YAAaC,oBAAoBC,QAAQL,CAAmB,CAAE,IAW/BJ,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,KACVC,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,KACVC,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,GAwBNC,GAvBAH,GAAOA,EAAII,QACXF,EAAIG,IAAM,CACNL,IAAOA,EAAII,QACXE,KAAUN,EAAIO,UAA0B,CAAA,EACxCC,GAAQR,EAAIS,YAAgCC,QAAkB,CAAA,EAC9DC,IAASX,EAAIY,cAAoCC,UAAsB,CAAA,EACvEC,WAAgBd,EAAIe,OAAoB,CAAA,EACxCC,MAAWf,CAAAA,CAAAA,GAAMgB,KAAKC,UAAUjB,CAAG,EACnCkB,SAAcC,OAAgB,CAAA,CAClC,GAEAlB,EAAIG,IAAM,CACNL,IAAOA,CACX,EAEMC,IACFC,EAAIG,IAAIC,KAAOL,IAIvBC,EAAID,IAAMN,OAAO0B,SAASC,KAC1BpB,EAAIqB,UAAY5B,OAAO6B,UAAUD,UAEhB,gBACjBtG,IAAIwG,EAAWC,aAAaC,QAAQxB,CAAU,EAC7B,OAAbsB,IAAmBA,EAAW,MAClCA,EAAWR,KAAKW,MAAMH,CAAQ,EAC9B,IAAKxG,IAAIC,EAAI,EAAGA,EAAIuG,EAAStG,OAAQD,CAAC,GAClC,GAAIuG,EAASvG,GAAGmF,IAAIL,MAAQE,EAAIG,IAAIL,IAChC,OAIRyB,EAASrH,KAAK8F,CAAG,EACjBwB,aAAaG,QAAQ1B,EAAYc,KAAKC,UAAUO,CAAQ,CAAC,CAC7D,CAoBA,SAASK,oBACL7G,IAAI8G,EAAe,GAEnB,OACIC,kBAAkBC,eAAe,cAAc,GACL,UAA1C,OAAOD,kBAAkBE,cACe,EAAxCF,kBAAkBE,aAAa/G,OAExB6G,kBAAkBE,cAIa,eAAtCF,kBAAkBG,iBAClBH,kBAAkBC,eAAe,aAAa,GACL,UAAzC,OAAOD,kBAAkBI,aACc,EAAvCJ,kBAAkBI,YAAYjH,SAE9B4G,EAAeC,kBAAkBI,aAQjCL,EALsC,SAAtCC,kBAAkBG,iBAClBH,kBAAkBC,eAAe,aAAa,GACL,UAAzC,OAAOD,kBAAkBK,aACc,EAAvCL,kBAAkBK,YAAYlH,OAEf6G,kBAAkBK,YAG9BN,EACX,CASA,SAASO,MAAMC,GACX,OAAO,IAAIxJ,WACNU,OAAO8I,CAAM,CACtB,CA3DwC,IAApCC,KAAKC,MAAsB,IAAhBD,KAAKE,OAAO,CAAO,IAC9B/C,OAAOgD,QAAU,SAASC,EAAW3C,GACjChF,IAAI4H,EAAc,CAAC,QAAS,YAC5B5H,IAAIE,EAAS0H,EAAY1H,OACzB,KAAOA,CAAM,IACsC,CAAC,IAA5CyH,EAAUrE,QAAQsE,EAAY1H,EAAO,GACrC4E,eAAe6C,EAAW3C,CAAG,EAIrC,MAAO,CAAA,CACX,SAqDE6C,SACFC,IAAM,IAAIC,eAGVC,OAAS,OACThD,IAAM,GACNiD,MAAQ,CAAA,EACRC,KAAO,KACPC,SAAW,KACXzF,KAAO,GAGP0F,OAAS,KACTC,QAAU,KACVC,YAAc,KACdC,QAAUhK,KACVyD,SAAW,KACXwG,gBAAkB,KAElBC,aAAe,OACfC,QAAU,GACVC,QAAU,KAEVC,+BAAiC,CAC7B,MACA,QAGJC,KAAO,KACPC,UAAY,EACZC,YAAc,GAGdzK,YAAY0K,GAER,IAAMhJ,IAAIiJ,KAAOD,EACa,KAAA,IAAdzK,KAAK0K,KACb1K,KAAK0K,GAAOD,EAAWC,IAa/B,GARA1K,KAAK2K,QAAQ,EAGRxJ,OAAOyJ,KAAK5K,KAAKmE,IAAI,EAAExC,SACxB3B,KAAK6K,yBAAyB7K,KAAKmE,IAAI,EACvCnE,KAAK8K,YAAY,GAGhB,CAAE9K,KAAKyG,IAGR,OAFAsE,QAAQrE,IAAI,2BACR,iCAAkC,mCAAmC,EAClE,CAAA,EAIX1G,KAAKuJ,IAAIyB,KAAKhL,KAAKyJ,OAAQzJ,KAAKyG,IAAKzG,KAAK0J,MAAO1J,KAAK2J,KAAM3J,KAAK4J,QAAQ,EACzE5J,KAAKiL,WAAW,EAEhBjL,KAAKuJ,IAAIW,aAAelK,KAAKkK,aAC7BlK,KAAKuJ,IAAIa,QAAUpK,KAAKoK,QAIxBpK,KAAKuJ,IAAI2B,mBAAqB,WACtBlL,KAAKmL,eAAe,EACpBnL,KAAKoL,yBAAyBX,CAAU,EAG5CzK,KAAKqL,mBAAmB,CAC5B,EAAEjI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAI+B,OAAS,WACdtL,KAAKuL,OAAO,CAChB,EAAEnI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIiC,WAAa,SAAS1L,GAC3BE,KAAKyL,WAAW3L,CAAK,CACzB,EAAEsD,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIJ,QAAU,WACfnJ,KAAK0L,QAAQ,CACjB,EAAEtI,KAAKpD,IAAI,EAEXA,KAAKuJ,IAAIoC,UAAY,WACjB3L,KAAK4L,UAAU,CACnB,EAAExI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIsC,KAAK7L,KAAKsK,IAAI,CAC3B,CAKAK,UAEQ3K,KAAK6J,SACL7J,KAAK6J,OAAOiC,aAAa,WAAY,UAAU,EAC/C9L,KAAK6J,OAAO7I,MAAM+K,OAAS,eAI3B/L,KAAK8J,UACL9J,KAAK8J,QAAQ9I,MAAMiB,QAAU,SAErC,CAKA+J,WACIhM,KAAKuK,UAAYvK,KAAKuJ,IAAI0C,OAC1BjM,KAAKwK,YAAcxK,KAAKuJ,IAAI2C,WAGxBlM,KAAK6J,SACL7J,KAAK6J,OAAOsC,gBAAgB,UAAU,EACtCnM,KAAK6J,OAAO7I,MAAM+K,OAAS,QAI3B/L,KAAK8J,UACL9J,KAAK8J,QAAQ9I,MAAMiB,QAAU,QAG5BjC,KAAK+J,aACN/J,KAAK+J,YAAYzD,QAAQ,MAAM,CAEvC,CAKA+E,qBACuC,OAA/BrL,KAAKoM,uBAAwE,YAAtC,OAAOpM,KAAKoM,uBACnDpM,KAAKoM,sBAAsB,CAEnC,CAKAX,WAAW3L,GACkB,OAArBE,KAAKqM,aAAoD,YAA5B,OAAOrM,KAAKqM,aACzCrM,KAAKqM,YAAY,CAEzB,CAKAX,UACIX,QAAQrE,IAAI,OAAO,EAEnB1G,KAAKgM,SAAS,EACdhM,KAAK4H,MACD5H,KAAKuK,UACLvK,KAAKwK,WACT,EAE6B,OAAzBxK,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgBjK,KAAKwK,WAAW,CAE7C,CAKAoB,YACI5L,KAAKgM,SAAS,EACdhM,KAAK4H,MACD,EACA,SACJ,EAE6B,OAAzB5H,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgB,SAAS,CAEtC,CAKAsB,SAGI,GAFAvL,KAAKgM,SAAS,EAEY,SAAtBhM,KAAKkK,aAA0B,CAC/B,GAA0B,OAAtBlK,KAAKuJ,IAAI+C,SAET,OADAtM,KAAK4H,MAAM5H,KAAKuK,UAAWvK,KAAKwK,YAAa,aAAa,EACnD,CAAA,EACJ,GAAwC,KAAA,IAA5BxK,KAAKuJ,IAAI+C,SAAS1E,MAEjC,OADA5H,KAAK4H,MAAM5H,KAAKuK,UAAWvK,KAAKwK,YAAaxK,KAAKuJ,IAAI+C,SAAS1E,KAAK,EAC7D,CAAA,CAEf,CAEsB,OAAlB5H,KAAKyD,UAA8C,YAAzB,OAAOzD,KAAKyD,UACtCzD,KAAKyD,SAASnD,KAAKN,KAAKgK,QAAShK,KAAKuJ,IAAI+C,SAAUtM,KAAKmE,IAAI,CAErE,CAMAgH,iBACI1J,IAAI8K,EAAa,CAAA,EACbC,EAAa,CAAA,EAYjB,OAV2B,GAAvBxM,KAAKuJ,IAAIkD,aACTF,EACiC,UAA7B,OAAOvM,KAAKuJ,IAAI+C,UAA+C,OAAtBtM,KAAKuJ,IAAI+C,UAClDtM,KAAKuJ,IAAI+C,SAAS7D,eAAe,MAAM,GACvCzI,KAAKuJ,IAAI+C,SAASnI,KAAKsE,eAAe,QAAQ,GACZ,MAAlCzI,KAAKuJ,IAAI+C,SAASnI,KAAK8H,OAE3BO,EAAmC,OAAtBxM,KAAKuJ,IAAI+C,UAAyC,MAApBtM,KAAKuJ,IAAI0C,QAGjDM,GAAcC,CACzB,CAMApB,yBAAyBsB,GACrBjL,IAAIkL,EAAY,GAmBhB,IAKI5D,EApBA2D,EAAqBjE,eAAe,SAAS,GAC7CiE,EAAqBvC,QAAQ1B,eAAe,YAAY,IAExDkE,EAAYD,EAA8B,QAAE,eAY7B,MAJfC,EAHAD,EAAqBjE,eAAe,MAAM,GAC1CiE,EAAqBvI,KAAKsE,eAAe,aAAa,EAE1CiE,EAA2B,KAAe,YAIrDC,MAKD5D,EAAS,CACbU,OAAgB,MADF,GAEPtF,KAAO,CACVyI,wBAA2B,oBAC3BC,YAAe,WACfC,WAAcH,EACdI,uBAA0BL,CAC9B,EACA3D,EAAOiE,QAAU,CAAA,EACjBjE,EAAOtC,IAAM+B,kBAAkByE,SAE/BlE,EAAOtF,SAAW,YAAYR,GAE1BxB,IAAIyL,EAAmBjK,EAAK,GAC5BxB,IAAI0L,EAAmB,CAAA,GAGnBA,EADYC,KAAAA,IAAZnK,EAAK,IAAoBA,EAAK,GAAGwF,eAAe,wBAAwB,EACrDxF,EAAK,GAAG8J,uBAE3BI,IAAoBD,EAAiBzE,eAAe,SAAS,IAC7DD,kBAAkBE,aAAewE,EAAiBG,QACR,SAAtC7E,kBAAkBG,iBAClB,IAAIpJ,WAAYuD,KAAKqK,CAAgB,GAErC,IAAI5N,WAAYoD,KAAKwK,CAAgB,EAGjD,EAEA,IAAI7D,SAASP,CAAM,EACvB,CAOAnB,MAAM0F,EAAUpB,EAAYqB,GACxB9L,IAAI+L,EAAc,GAEE,YAAftB,EACDsB,GAAe,0BACM,MAAbF,EACY,gBAAfpB,EACDsB,GAAe,6DAEfA,GAAe,6BAA+BtB,EAAa,IAC7B,KAAA,IAAlBqB,IACRC,GAAe,2BAA6BD,IAIpDC,GADoB,MAAbF,EACQ,yBAEA,4BAA8BA,EAGjDtN,KAAKyN,YAAaD,CAAY,EAED,OAAzBxN,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgBjK,KAAKwK,WAAW,CAE7C,CAKAiD,YAAYC,GACR3C,QAAQrE,IAAK,qBAAuBgH,EAAU,cAAe,cAAe,CAChF,CAKAzC,aAEI,IAAMxJ,IAAIkM,KAAc3N,KAAKmK,QACgB,KAAA,IAA7BnK,KAAKmK,QAAQwD,IACrB3N,KAAKuJ,IAAIqE,iBAAiBD,EAAY3N,KAAKmK,QAAQwD,EAAW,CAG1E,CAKA7C,cAEI,MAAK,CAAC9K,KAAKqK,+BAA+BtF,QAAS/E,KAAKyJ,MAAO,EACpDzJ,KAAK6N,iBAAiB,EAItB7N,KAAK8N,kBAAkB,CAEtC,CAKAD,mBACIpM,IAAIsM,EAAiB,IAAIC,gBAAgBhO,KAAKmE,IAAI,EAAE8J,SAAS,EACzDC,EAAelO,KAAKyG,IAAIhC,MAAM,8BAA8B,EAAI,IAAM,IAG1E,OAFAzE,KAAKyG,KAAOyH,EAAeH,EAEpB/N,KAAKyG,GAChB,CAKAqH,oBAEI,IAAKrM,IAAI0M,KADTnO,KAAKsK,KAAO,IAAI8D,SACIpO,KAAKmE,KACjBhD,OAAOC,OAAOpB,KAAKmE,KAAMgK,CAAO,GAChCnO,KAAKsK,KAAK1E,OACNuI,EAC8B,UAA9B,OAAOnO,KAAKmE,KAAKgK,GACb1G,KAAKC,UAAU1H,KAAKmE,KAAKgK,EAAQ,EACjCnO,KAAKmE,KAAKgK,EAClB,EAIR,OAAOnO,KAAKsK,IAChB,CAUAO,yBAAyBwD,GACrB,GAAuB,UAAlB,OAAOA,EACR,IAAK5M,IAAI6M,KAAaD,EAAQ,CAC1B,IAWYE,EAXRpN,OAAOC,OAAOiN,EAAQC,CAAS,IAEG,UAA7B,OAAOD,EAAOC,KACfD,EAAOC,GAAatO,KAAK6K,yBAAyBwD,EAAOC,EAAU,GAKtC,UAA7B,OAAOD,EAAOC,KACiC,OAA/CD,EAAOC,GAAW7J,MAAM,iBAAiB,GAGb,UAAvB,OADD8J,EAAc9G,KAAKW,MAAMiG,EAAOC,EAAU,KAE1CD,EAAOC,GAAaC,EAIpC,CAGJ,OAAOF,CACX,CACJ,OAEMxL,kBAAkByG,SAEpBvJ,eAAekD,IACXA,EAAOA,EAAK,IACPkB,KAAKyE,YAAcN,kBAAkB,EAC1CkG,MAAMvL,CAAI,CACd,CACJ,OAEMF,kBAAkBuG,SACpBmF,qBAAuBjG,kBAAkBkG,UAAY,yBACrDC,MAAQ,GAGR5O,eAAekD,GACXA,EAAOA,EAAK,GACZ,IAAM2L,EAAQtG,kBAAkB,EAChCrF,EAAKwD,IAAM1D,UAAU0L,cAAgBxL,EAAK0L,MAC1C1L,EAAKkH,QAAU,CACX0E,aAAcD,CAClB,EACAJ,MAAMvL,CAAI,CACd,CACJ,CAGK9B,OAAOf,UAAUgB,QAClBD,OAAO2N,eAAe3N,OAAOf,UAAW,SAAU,CAC9C4D,MAAO,SAAS+K,GACZ,OAAO5N,OAAOf,UAAUqI,eAAenI,KAAKN,KAAM+O,CAAQ,CAC9D,EACAC,WAAY,CAAA,EACZC,aAAc,CAAA,EACdC,SAAU,CAAA,CACd,CAAC,QAQCC,4BACFC,YAAc7O,SAAS+C,cAAc,MAAM,EAC3C+L,gBAAkB9O,SAAS+O,MAI3BvP,cACIC,KAAKuP,aAAa,CACtB,CAKAA,eACIvP,KAAKoP,YAAYlM,iBAAiB,QAAS,IACvClD,KAAKwP,oBAAoB1P,EAAO,WAAW,CAC/C,CAAC,EAEDE,KAAKoP,YAAYlM,iBAAiB,UAAW,IAErB,SADC3C,SAASkP,aAAa,EAAEC,KAAKzB,SAAS,GAEvDjO,KAAK2P,YAAY,CAEzB,CAAC,EAED3P,KAAKoP,YAAYlM,iBAAiB,YAAa,IAC3ClD,KAAKwP,oBAAoB1P,EAAO,oBAAoB,CACxD,CAAC,CACL,CAOA0P,oBAAoB1P,EAAO8P,GACvBnO,IAAIoO,EACJ,IAAKpO,IAAIC,EAAI,EAAGA,EAAI1B,KAAKqP,gBAAgB1N,OAAQD,CAAC,GAK1CmO,EAHgC,EAAhC/P,EAAMuD,OAAOyM,UAAUnO,QACoB,EAA3C3B,KAAKqP,gBAAgB3N,GAAGqO,UAAUpO,OAEpB3B,KAAKqP,gBAAgB3N,GAAGqO,UAAUhL,QAAQjF,EAAMuD,OAAOyM,SAAS,EAEhE,CAAC,EAIvB,OAAQF,GACR,IAAK,YACGC,EAAc,GACd7P,KAAKgQ,UAAU,EAEnB,MACJ,IAAK,qBACiB,CAAC,EAAfH,GACA7P,KAAKiQ,mBAAmB,CAKhC,CACJ,CAKAD,YACQzP,SAAS2P,6BACL3P,SAAS2P,6BAA6BC,OACtC5P,SAAS2P,6BAA6BC,MAAM,GAE5C5P,SAAS2P,6BAA6BC,OAAS,EAKvD5P,SAAS2P,6BAA+B,CAACC,OAAQ,CAAC,CACtD,CAKAR,cACQpP,SAAS2P,6BACL3P,SAAS2P,6BAA6BE,SACtC7P,SAAS2P,6BAA6BE,QAAQ,GAE9C7P,SAAS2P,6BAA6BE,SAAW,EAKzD7P,SAAS2P,6BAA+B,CAACE,SAAU,CAAC,CACxD,CAKAH,qBACS1P,SAAS2P,+BACV3P,SAAS2P,6BAA+B,IAEvC3P,SAAS2P,6BAA6BG,2BACvC9P,SAAS2P,6BAA6BG,yBAA2B,CAAA,GAGrE9P,SAAS2P,6BAA6BG,yBAA2B,CAAA,CACrE,CACJ,CAQA,SAASC,YAAaC,EAASvM,EAAOwM,GAClC/O,IAAIgP,EAA8B,CAC9B,kBACA,gBACA,0BACA,2BACA,2BACA,yBACA,8BAGAC,EAAU,CAAA,EAUd,GARwB,UAAnB,OAAOH,IACRG,EAAsB,oBAAZH,EACY,UAAjB,OAAOvM,GAAuC,UAAjB,OAAOA,IACrCuM,EAAU,CAAC,CAACA,EAASvM,EAAOwM,MAKU,SAAzChI,kBAAkBmI,mBAAgC,CACnDlP,IAAImP,EAAsB,GAC1BL,EAAQM,QAAS,SAASC,GAC+B,CAAC,IAAlDL,EAA4B1L,QAAQ+L,EAAK,EAAE,EAC3CF,EAAoBhQ,KAAKkQ,CAAI,EAE7BC,kBAAkBC,IAAIF,EAAK,GAAIA,EAAK,EAAE,CAE9C,CAAC,EAGiC,EAA7BF,EAAoBjP,QACrBsP,uBAAuBL,CAAmB,EAIzCM,SAASC,mBAAqB,CAACT,EAEhCO,uBAAuBV,EAAS,CAACa,gBAAiB,CAAA,CAAI,CAAC,EAEvDC,oCAAoC,CAI5C,KAAqD,WAAzC7I,kBAAkBmI,oBAErBO,SAASC,mBAAqB,CAACT,GAEhCO,uBAAuBV,EAAS,CAACa,gBAAiB,CAAA,CAAI,CAAC,EAE3Db,EAAQM,QAAS,SAASC,GACtB,IAAMQ,EAA8B,KAAA,IAAZR,EAAK,GAAqB,WAAaN,EAAU,KAAO,GAC5Ee,EAAiC,WAAtB1J,SAAS2J,SAAwB,WAAa,GAC7DjR,SAASkR,OAASjJ,kBAAkBkJ,aAChCZ,EAAK,GACL,IACAa,mBAAmBb,EAAK,EAAE,EAC1B,KACAQ,EACA,uBACAC,CACR,CAAC,GAGgD,gBAAzC/I,kBAAkBmI,oBAAyCD,GACnEO,uBAAuBV,CAAO,CAEtC,CAGA,SAASqB,gCACLnQ,IAAIoQ,EAAuE,EAAtDtR,SAASC,iBAAiB,iBAAiB,EAAEmB,OAC9DmQ,EAAwG,EAAtEvR,SAASC,iBAAiB,iCAAiC,EAAEmB,OAC/FoQ,EAAiF,EAAhExR,SAASC,iBAAiB,2BAA2B,EAAEmB,OACxEqQ,EAAkG,EAA5EzR,SAASC,iBAAiB,uCAAuC,EAAEmB,OACzFsQ,EAAkF,EAAjE1R,SAASC,iBAAiB,4BAA4B,EAAEmB,OACzEuQ,EAAkG,EAAxE3R,SAASC,iBAAiB,mCAAmC,EAAEmB,OACzFwQ,EAAqG,EAA1E5R,SAASC,iBAAiB,qCAAqC,EAAEmB,OAC5FyQ,EAA0F,EAAvE7R,SAASC,iBAAiB,kCAAkC,EAAEmB,OACjF0Q,EAAyF,EAA5E9R,SAASC,iBAAiB,uCAAuC,EAAEmB,OAChF2Q,EAAuF,EAA9D/R,SAASC,iBAAiB,yBAAyB,EAAEmB,OAC9E4Q,EAA4E,EAAhEhS,SAASC,iBAAiB,2BAA2B,EAAEmB,OACnE6Q,EAAgG,EAA7EjS,SAASC,iBAAiB,wCAAwC,EAAEmB,OAC3FuP,SAASC,kBAAoBY,GACzBF,GACAG,GACAF,GACAG,GACAC,GACAC,GACAC,GACAE,GACAD,GACAE,GACAC,EAEJnM,WAAW,WACP,IACQoM,EADHvB,SAASC,oBACNsB,EAA2F,EAA5ElS,SAASC,iBAAiB,uCAAuC,EAAEmB,OACtFuP,SAASC,kBAAoBsB,EAErC,EAAG,GAAI,CACX,CAGA,SAASxB,uBAAuBV,EAASxH,GACI,YAArC,OAAO,wBAEH5I,MAAMuS,QAAQnC,CAAO,IACrBA,EAAUoC,wBAAwBpC,CAAO,GAG7CxF,QAAQrE,IAAI,sDAAsD,EAGtE,IACI6J,EAAU9I,KAAKW,MAAMmI,CAAO,CAIhC,CAHE,MAAOqC,GAEL,OADA7H,KAAAA,QAAQrE,IAAI,iCAAmCkM,CAAC,CAEpD,CAEA,IAAMnP,EAAWsF,GAAUA,EAAOtF,UAAY,KACxCwG,EAAkBlB,GAAUA,EAAOkB,iBAAmB,KAEvDlB,GAAUA,EAAOqI,kBAClBb,EAAQsC,wBAA0B,CAAA,GAIK,SAAtCrK,kBAAkBG,iBAEoB,UAAnC,OAAO4H,EAAQuC,iBAC4B,CAAC,IAA5CvC,EAAQuC,gBAAgB/N,QAAQ,KAAK,IAErCwL,EAAQuC,gBAAkBC,mBAAmBxC,EAAQuC,eAAe,GAExEvS,SAASyS,cAAc,IAAIC,YAAY,oBAAoB,CAAC,EAC5DC,sBACI,eACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACoM,QAASA,CAAO,EACvB9M,SAAUA,EACVwG,gBAAiBA,CACrB,CACJ,EACA1J,SAASyS,cAAc,IAAIC,YAAY,qBAAqB,CAAC,GAEf,eAAtCzK,kBAAkBG,iBAC1BwK,sBACI,CACIC,OAAQ,gCACR7C,QAASA,CACb,EACA,CACIvD,QAAS,EACTvJ,SAAUA,EACVwG,gBAAiBA,EACjBoJ,WAAY,SAAS9J,GACjBA,EAAIqE,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAQA,SAAS0F,YAAYlP,GACbmP,EAAUhT,SAASkR,OAAOhN,MAAM,IAAI+O,OACpC,WAAapP,EAAK9C,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAOiS,EAAUR,mBAAmBQ,EAAQ,EAAE,EAAInG,KAAAA,CACtD,CAGA,SAASqG,eAAeC,GAEpB,IAKQnC,EALsC,SAAzC/I,kBAAkBmI,qBAI8B,WAAzCnI,kBAAkBmI,oBACtBY,EAAiC,WAAtB1J,SAAS2J,SAAwB,WAAa,GAC7DjR,SAASkR,OAASiC,EAAa,mEAAqEnC,GAG5F/I,kBAAkBmI,mBAGlC,CAGA,SAASwC,sBAAsBhP,EAAM4E,EAAQ4K,GAEzClS,IAAImS,EAAU,GAiBRhF,GAhBNgF,EAAkB,SAAI7K,EAAOtF,UAAY,KACzCmQ,EAAyB,gBAAI7K,EAAOkB,iBAAmB,KACvD2J,EAA0B,iBAAI7K,EAAO8K,kBAAoB,KACzDD,EAAyB,gBAAI7K,EAAO+K,iBAAmB,KACvDF,EAAe,MAAI7K,EAAOW,OAAS,CAAA,EACnCkK,EAAiB,QAAI7K,EAAOiE,SAAW,KACvC4G,EAAsB,aAAG7K,EAAOiE,QAAU,OAAS,OACnD4G,EAAiB,QAAI7K,EAAOqB,SAAW,KACvCwJ,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAI7K,EAAOc,QAAU,KACrC+J,EAAiB,QAAI7K,EAAOe,SAAW,KACvC8J,EAAqB,YAAI7K,EAAOgB,aAAe,KAC/C6J,EAAgB,OAAI7K,EAAOgL,QAAU,KACrCH,EAAkB,SAAI7K,EAAOiL,UAAY,KACzCJ,EAAc,KAAIzP,EAClByP,EAAa,IAAIpL,kBAAkByL,UACrB3L,kBAAkB,GAEV,UAAlB,OAAO,GACAsL,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBhF,GAE1DgF,EAAc,KAAIA,EAAc,KAAI,aAAe5K,KAAKE,OAAO,IAExD0K,EAAkB,WACrBA,EAAc,KAAEhL,YAAcgG,GAElCgF,EAAc,KAAEM,SAAWlL,KAAKE,OAAO,IAG3C,IAAI3J,WAAYoD,KAAKiR,CAAO,CAChC,CAGA,SAASV,sBAAuBvE,EAAO5F,GACnCtH,IAAImS,EAAU,GACdA,EAAe,MAAIjF,EACnBiF,EAAkB,SAAI7K,EAAOtF,UAAY,KACzCmQ,EAAyB,gBAAI7K,EAAOkB,iBAAmB,KACvD2J,EAAc,KAAI7K,EAAO5E,MAAQ,GACjCyP,EAAgB,OAAI7K,EAAOU,QAAU,QAErC,IAAIlK,WAAYuD,KAAK8Q,CAAO,CAChC,CAOA,SAASO,wBACL,OAAOnL,KAAKE,OAAO,EAAE+E,SAAS,EAAE,EAAE3M,QAAQ,WAAY,EAAE,EAAE8S,OAAO,EAAG,EAAE,CAC1E,CAEA3S,IAAIsP,kBAAoB,CACpBsD,IAAK,SAAS3J,EAAKqE,GACU,KAAA,IAAbA,IACRA,EAAW,SAETuF,EAAepM,aAAaC,QAAQuC,CAAG,EAC7C,GAAsB,OAAjB4J,EACD,IACI,IAAMC,EAAO9M,KAAKW,MAAMkM,CAAY,EACpC,GAAKC,CAAAA,EAAK9L,eAAesG,CAAQ,EAS7B,OAAOwF,EARP,IAEI,OAAO9M,KAAKW,MAAOmM,EAAKxF,EAAU,CAItC,CAHE,MAAO6D,GAEL,OAAO2B,EAAKxF,GAAUd,SAAS,CACnC,CAMR,CAFE,MAAO2E,GACL,OAAO0B,CACX,CAEJ,MAAO,CAAA,CACX,EACAtD,IAAK,SAAStG,EAAK1G,EAAOwQ,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzQ,MAASyD,KAAKC,UAAU1D,CAAK,EAAG0Q,UAAa1L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EACrGzM,aAAaG,QAAQqC,EAAKjD,KAAKC,UAAU+M,CAAS,CAAC,GAEnDvM,aAAaG,QAAQqC,EAAK1G,CAAK,CAEvC,EACA4Q,QAAS,SAASlK,EAAKmK,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEG7U,KAAKqU,IAAI3J,EAAK,WAAW,EACxBmK,EAAc7L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAASpK,GACZ,OAAqC,OAA9BxC,aAAaC,QAAQuC,CAAG,CACnC,EACAqK,OAAQ,SAASrK,GACbxC,aAAa8M,WAAWtK,CAAG,CAC/B,EACAuK,iBAAkB,WACdxT,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEwG,aAAavG,OAAQD,CAAC,GAAI,CACtCD,IAAIiJ,EAAMxC,aAAawC,IAAIhJ,CAAC,EACF,CAAC,IAAvBgJ,EAAI3F,QAAQ,KAAK,GAAoC,CAAC,IAA1B2F,EAAI3F,QAAQ,QAAQ,IAChDZ,EAAKuG,EAAIuD,SAAS,GAAK8C,kBAAkBsD,IAAI3J,CAAG,EAExD,CACA,OAAOvG,CACX,CAEJ,EAEI+Q,oBAAsB,CACtBb,IAAK,SAAS3J,EAAKqE,GACU,KAAA,IAAbA,IACRA,EAAW,SAETuF,EAAea,eAAehN,QAAQuC,CAAG,EAC/C,GAAsB,OAAjB4J,EACD,IACI,IAAMC,EAAO9M,KAAKW,MAAMkM,CAAY,EACpC,OAAOC,EAAK9L,eAAesG,CAAQ,EAAItH,KAAKW,MAAMmM,EAAKxF,EAAS,EAAIwF,CAGxE,CAFE,MAAO3B,GACL,OAAO0B,CACX,CAEJ,MAAO,CAAA,CACX,EACAtD,IAAK,SAAStG,EAAK1G,EAAOwQ,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzQ,MAASyD,KAAKC,UAAU1D,CAAK,EAAG0Q,UAAa1L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAe9M,QAAQqC,EAAKjD,KAAKC,UAAU+M,CAAS,CAAC,GAErDU,eAAe9M,QAAQqC,EAAK1G,CAAK,CAEzC,EACA8Q,MAAO,SAASpK,GACZ,OAAuC,OAAhCyK,eAAehN,QAAQuC,CAAG,CACrC,EACAqK,OAAQ,SAASrK,GACbyK,eAAeH,WAAWtK,CAAG,CACjC,EACAuK,iBAAkB,WACdxT,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEyT,eAAexT,OAAQD,CAAC,GAAI,CACxCD,IAAIiJ,EAAMyK,eAAezK,IAAIhJ,CAAC,EACJ,CAAC,IAAvBgJ,EAAI3F,QAAQ,KAAK,GAAoC,CAAC,IAA1B2F,EAAI3F,QAAQ,QAAQ,IAChDZ,EAAKuG,EAAIuD,SAAS,GAAKiH,oBAAoBb,IAAI3J,CAAG,EAE1D,CACA,OAAOvG,CACX,CACJ,EAUA,SAASiR,sBAAsBtV,IAC1B,oBAAsBA,EAAMuV,cACzBC,kBAAkCC,yBAAhBzV,EAAMuD,MAAM,CACtC,CAUA,SAASmS,aAAa1V,IACjB,0BAA4BA,EAAM2V,WAAe,SAAU3V,EACtByV,wBAAlCD,mBAA0DxV,EAAMuD,MAAM,CAC9E,CAWA,SAASiS,kBAAkBI,GACvB,IAGI5V,EAHA4V,EAAQC,aAAa,eAAe,IACxCD,EAAQ5J,aAAa,gBAAiB,EAAE,EAEpChM,EAAQ,IAAIqG,OAAO8M,YAAY,iBAAkB,CACjD2C,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIJ,EAAQ1C,cAAclT,CAAK,KAC5B4V,EAAQ1R,MAAQ,GAExB,CAWA,SAASuR,wBAAwBG,GACxBA,EAAQC,aAAa,eAAe,IACzCD,EAAQvJ,gBAAgB,eAAe,EAGvCuJ,EAAQ1C,cAAc,IAAI7M,OAAO8M,YAAY,iBAAkB,CAC3D2C,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAKMC,qBACFC,SAAW,GAKXjW,cACIC,KAAKgW,SAAWhW,KAAKiW,aAAa,EAE9BjW,KAAKgW,SAASrU,OAAS,GAI3B3B,KAAKkW,SAAS,CAClB,CAMAD,eACI,OAAO1V,SAASC,iBAAiB,6BAA6B,CAClE,CAMA0V,WACIzU,IAAI0C,EAAO,CACPgS,sBAAuBxD,wBAAwB,EAC/CyD,SAAU7V,SAASsH,SAASC,KAC5BuO,SAAU9V,SAAS8V,QACvB,EAE0C,SAAtC7N,kBAAkBG,gBAClBuK,sBAAsB,6BAA8B,CAChD/O,KAAAA,EACAsF,OAAQ,OACRhG,SAAU,GAAYzD,KAAKsW,iBAAiBC,CAAM,CACtD,CAAC,EAC4C,eAAtC/N,kBAAkBG,kBACzBxE,EAAKiP,OAAS,mCACdD,sBAAsBhP,EAAM,CAACV,SAAU,GAAYzD,KAAKsW,iBAAiBC,CAAM,CAAC,CAAC,EAEzF,CAOAD,iBAAiBC,GAEb,GAAIA,EAAOpS,MAAQoS,EAAOpS,KAAK8H,QAAiC,MAAvBsK,EAAOpS,KAAK8H,OACjDlB,QAAQrE,IAAI,gDAAgD,EAC5D1G,KAAKwW,YAAY,MAFrB,CAMA,GAAsB,UAAlB,OAAOD,EACP,IACIA,EAAS9O,KAAKW,MAAMmO,CAAM,CAK9B,CAJE,MAAO3D,GAGL,OAFA7H,QAAQrE,IAAI,yCAA0CkM,CAAC,EAAvD7H,KACA/K,KAAKwW,YAAY,CAErB,CAGkB,UAAlB,OAAOD,GAAuBA,EAAOE,OAA0B,IAAjBF,EAAOE,OACrDzW,KAAKwW,YAAY,EACjBjW,SAASyS,cAAc,IAAI0D,MAAM,6BAA6B,CAAC,GAE/D1W,KAAK2W,kBAAkBJ,EAAO3P,OAAO,CAhBzC,CAkBJ,CAMA4P,cACI/U,IAAImV,EAEJ5W,KAAKgW,SAASnF,QAAQ,IAClB+F,EAAOC,EAAQvT,cAAc,qBAAqB,EAAEwT,QAAQC,YAE5D,IACQH,GAAwB,UAAhB,OAAM,IACdC,EAAQ/G,UAAYkH,KAAKJ,CAAI,EAIrC,CAFE,MAAOhP,GACLmD,QAAQrE,IAAIkB,CAAK,CACrB,CACJ,CAAC,CACL,CAOA+O,kBAAkB/P,GACdnF,IAAImV,EAEJ5W,KAAKgW,SAASnF,QAAQ,KAClB+F,EAAOC,EAAQvT,cAAc,qBAAqB,EAAEwT,QAAQC,eAExDF,EAAQ/G,UAAY,0CAA4ClJ,EAAU,SAElF,CAAC,CACL,CACJ,CAKA,SAASqQ,oBACD/F,SAASgG,mCAAqE,KAAA,IAAzBnB,sBACrD,IAAIA,oBAEZ,CAEI7E,SAASiG,kBACmB,YAAxB5W,SAASkM,WACTwK,kBAAkB,EAElBG,2BAA2B7W,SAAU,mBAAoB0W,iBAAiB,SAoB5EI,WACFC,UAAY,CACRC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,WAAY,EACZC,kBAAmB,EACnBC,iBAAkB,EAClBC,UAAW,EACXC,WAAY,CAChB,EAEAC,OAASvX,SAASC,iBAAiB,wBAAwB,EAE3D2D,KAAO,GAKP4T,kBACmB5X,MAAMC,UAAUC,MAAMC,KAAKN,KAAK8X,MAAM,EAC5CjH,QAAQ,CAACmH,EAAOtW,KACrB1B,KAAKmE,KAAKvD,KAAKO,OAAO8W,OAAO,GAAIjY,KAAKsX,SAAS,CAAC,CACpD,CAAC,CACL,CAKA/H,eACIvP,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAG8V,YAAc,CAAA,CAC/B,CAAC,CACL,CAAC,EAEDxX,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,iBAAkB,KACrClD,KAAKmE,KAAKzC,GAAG6V,WAAa,CAAA,CAC9B,CAAC,CACL,CAAC,EAEDvX,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAGmW,UAAU,GACvBpW,IACIyW,EADApS,EAAO,CAAE,IAAIG,KAGe,IAA5BjG,KAAKmE,KAAKzC,GAAGmW,YACb7X,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGgW,kBAAoB5R,IAIrCoS,EAAepS,EAAO9F,KAAKmE,KAAKzC,GAAGiW,iBACH,IAA5B3X,KAAKmE,KAAKzC,GAAGmW,YACb7X,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGkW,UAAYM,GAIC,EAA1BlY,KAAKmE,KAAKzC,GAAGmW,aACb7X,KAAKmE,KAAKzC,GAAG+V,YAAczO,KAAKmP,IAAInY,KAAKmE,KAAKzC,GAAGkW,UAAYM,CAAY,EACzElY,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGkW,UAAYM,GAEjC,CAAC,CACL,CAAC,CACL,CACJ,CAGA,IAAME,OAAS,IAAInS,KACboS,UAAW,IAAIpS,MAAO0O,QAAQ,EAChC2D,sBAAwB,CAAA,EACxBC,YAAc,GACdC,mBAAqB,EACrBC,gBAAkB,GAClBC,qBAAuB,GACvBC,oBACAC,yBACAC,uBACAC,yBAA2B,EAC3BC,kCAAoC,GAGxC,SAAS3B,2BAA2BvW,EAAMf,EAAO2D,GACN,YAAnC,OAAO0C,OAAOjD,iBAAiCrC,EAAKqC,iBAAiBpD,EAAO2D,CAAQ,EACnF5C,EAAKmY,YAAYlZ,EAAO2D,CAAQ,CACzC,CAEA,SAASwV,2BAA2BpY,EAAMf,EAAO2D,GACH,YAAtC,OAAO0C,OAAO+S,oBAAoCrY,EAAKqY,oBAAoBpZ,EAAO2D,CAAQ,EACzF5C,EAAKsY,YAAYrZ,EAAO2D,CAAQ,CACzC,CAGA,IAAM2V,mBAAqB,SAAgBtZ,GAEvCwQ,YAAY,mBADOtH,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CACb,EAC5C0E,uBAAuB,CAC3B,EAmCMC,qBA7BNC,iBAAiB,GAAI,EAIjB/Q,kBAAkBC,eAAe,4BAA4B,GACb,GAAhDD,kBAAkBgR,4BAClBhR,kBAAkBC,eAAe,iCAAiC,GACb,GAArDD,kBAAkBiR,iCAElBC,gCAAgC,GAAI,EAOpCxI,SAASiG,kBAETwB,oBAAsBgB,YAAY,WAC9BrB,sBAAwB,CAAA,CAC5B,EAAG,GAAG,EAGNM,yBAA2Be,YAAY,WACnCrJ,YAAY,kBAAmB7I,KAAKC,UAAU6Q,WAAW,CAAC,CAC9D,EAAG,IAAI,GAIiB,SAAgBzY,GACxC8Z,gBAAgB,EACc,CAAA,IAA1BtB,wBACAC,YAAY3X,KAAK,CACboI,KAAK6Q,MAAM/Z,EAAMga,OAAO,EACxB9Q,KAAK6Q,MAAM/Z,EAAMia,OAAO,EACxB/Q,KAAK6Q,OAAM,IAAI5T,MAAO0O,QAAQ,EAAI0D,QAAQ,EAC7C,EAEDG,kBAAkB,GAClBF,sBAAwB,CAAA,EACE,IAAtBE,qBACAwB,gBAAgB,CAG5B,GAMA,SAAST,iBAAiBU,EAAmB,KACzC5T,WAAW,WACPsT,YAAY,WACRO,uBAAuB,EACvBC,mCAAmC,CACvC,EAAG,GAAI,CACX,EAAGF,CAAgB,CACvB,CAQA,SAASP,gCAAgCO,EAAmB,IAAMG,EAAW,KACzE/T,WAAW,WACPsT,YAAY,WACR,IAAMU,EAAatJ,kBAAkBsD,IAAI,mCAAmC,EACxEiG,0BAA0BD,CAAU,IACpCvB,yBAA2BuB,EAAWE,gBAEtCtJ,uBAAuB,GAAI,CAACG,gBAAiB,CAAA,CAAI,CAAC,EAE1D,EAAGgJ,CAAQ,CACf,EAAGH,CAAgB,CACvB,CAOA,SAASK,0BAA0BD,GAC/B,GACIA,GAAcA,EAAW5R,eAAe,iBAAiB,GACzDqQ,2BAA6BuB,EAAWE,gBAExC,IACI,IAAK9Y,IAAIC,EAAI,EAAGA,EAAI2Y,EAAWG,QAAQ7Y,OAAQD,CAAC,GAAI,CAChD,IAAM+Y,EAAcJ,EAAWG,QAAQ9Y,GAAGgZ,cAAcC,SAExD,GAAoBvN,KAAAA,IAAhBqN,GAA6B1B,CAAAA,kCAAkC6B,SAASH,CAAW,EAKvF,OADA1B,kCAAkCnY,KAAK6Z,CAAW,EAC3C,CAAA,CACX,CAGJ,CAFE,MAAO7H,GACL7H,QAAQrE,IAAI,6CAA+CkM,EAAE3E,SAAS,CAAC,CAC3E,CAEJ,MAAO,CAAA,CACX,CAKA,SAASkM,qCAIL,IAScU,EATRC,EACyD,EAA3Dva,SAASwa,uBAAuB,gBAAgB,EAAEpZ,QACqB,EAAvEpB,SAASwa,uBAAuB,4BAA4B,EAAEpZ,QACd,OAAhDpB,SAASya,eAAe,kBAAkB,EAG9C,IACSF,IAEKD,EAAQ9J,kBAAkBsD,IAAI,0BAA0B,EAC5B,YAA9B,OAAO4G,qBAA+C7N,KAAAA,IAAVyN,GAAwC,KAAjBA,EAAMlZ,QACzEsZ,mBAAmBJ,CAAK,CAMpC,CAFE,MAAOjI,GACL7H,QAAQrE,IAAIkM,EAAE3E,SAAS,CAAC,CAC5B,CACJ,CAKA,SAAS+L,kBACLf,2BAA2B1Y,SAAU,YAAa+Y,mBAAmB,EACrE4B,cAAcvC,mBAAmB,EACjCuC,cAActC,wBAAwB,CAC1C,CAKA,SAASS,yBACLJ,2BAA2B1Y,SAAU,YAAa6Y,kBAAkB,EACpEH,2BAA2B1Y,SAAU,UAAW6Y,kBAAkB,CACtE,CAKA,SAAS+B,WAAWvI,GAChBnR,IAAI2Z,EAAexI,EAAEvP,OAAOW,MAEtB,CAAA,6BAA6BqX,KAAKD,CAAY,GAIhDA,CAAAA,GAAkBA,KAAgB3C,kBAES,SAAtCjQ,kBAAkBG,gBACnBuK,sBACI,0BACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACmX,MAASF,CAAY,EAC5B3X,SAAU,SAAS8S,GACXA,EAAOA,SACPkC,gBAAgB2C,GAAgB,CAC5B7E,OAAUA,EAAOA,OACjB7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EACAjL,YAAY,oBAAqB7I,KAAKC,UAAU+Q,eAAe,CAAC,EAExE,CACJ,CACJ,EAE8C,eAAtCjQ,kBAAkBG,iBAC1BwK,sBACI,CACIC,OAAQ,gCACRkI,MAAOF,CACX,EACA,CACI3X,SAAU,SAAS8S,GACXA,EAAOA,SACPkC,gBAAgB2C,GAAgB,CAC5B7E,OAAUA,EAAOA,OACjB7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EACAjL,YAAY,oBAAqB7I,KAAKC,UAAU+Q,eAAe,CAAC,EAExE,CACJ,CACJ,EAGZ,CAKA,SAAS+C,gBAAgB5I,GACrBnR,IAAI2Z,EAAexI,EAAEvP,OAAOW,MAC5BvC,IAOQga,EALHL,GAAiBA,EAAazZ,OAY7B,6BAA6B0Z,KAAKD,CAAY,IAIhDA,KAAgB1C,sBAChBnC,EAASmC,qBAAqB0C,GAC9BM,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,IAKpDO,oBAAoB/I,EAAG,MAAM,GAG7BpK,kBAAkBG,gBAAkB,UAChCH,kBAAkBG,gBAClBuK,sBACI,yBACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACmX,MAASF,CAAY,EAC5B3X,SAAU,SAAS8S,GACfmF,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,CACpD,CACJ,CACJ,EAKsC,eAAtC5S,kBAAkBG,iBAClBwK,sBACI,CACIC,OAAQ,+BACRkI,MAAOF,CACX,EACA,CACI3X,SAAU,SAAS8S,GACfmF,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,CACpD,CACJ,CACJ,MApDIQ,EAAWrb,SAASya,eAAe,+BAA+B,IAElEY,EAASpZ,OAAO,GAEhBiZ,EAAOlb,SAASya,eAAe,2CAA2C,IAE1ES,EAAKjZ,OAAO,EAgDxB,CAOA,SAASkZ,yBAAyB9I,EAAG2D,EAAQ6E,GACpC7E,GAAWA,EAAOA,SAIvBA,EAASA,EAAOA,OAEhBmC,qBAAqB0C,GAAgB,CACjC7E,OAAUA,EACV7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EAEqB,UAAjBhF,EAAOA,OACPoF,oBAAoB/I,EAAG,aAAc2D,EAAOsF,WAAW,EAEvDF,oBAAoB/I,EAAG,YAAa2D,EAAOsF,WAAW,EAG1DvL,YAAY,0BAA2B7I,KAAKC,UAAUgR,oBAAoB,CAAC,EAC/E,CAOA,SAASiD,oBAAoB/I,EAAGkJ,EAAOC,GAC/B1W,EAAgBuN,EAAEvP,OAAOgC,cAC7B5D,IAAIua,EAAa3W,EAAc/B,cAAc,iBAAiB,EAE9D,GAAK0Y,EAAL,CAIAva,IAAIma,EACAH,EAmCJ,OAhCIlb,SAASya,eAAe,+BAA+B,EACvDY,EAAWrb,SAASya,eAAe,+BAA+B,IAElEY,EAAWrb,SAASoE,cAAc,KAAK,GAC9BmH,aAAa,QAAS,+BAA+B,EAC9D8P,EAAS9P,aAAa,KAAM,+BAA+B,EAC3D3F,OAAOjD,iBAAiB,SAAU,WAC9B0Y,EAAS5a,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,IAClE,CAAC,EACD5W,EAAcK,MAAMkW,CAAQ,GAI5Brb,SAASya,eAAe,2CAA2C,EACnES,EAAOlb,SAASya,eAAe,2CAA2C,IAE1ES,EAAOlb,SAASoE,cAAc,KAAK,GAC9BmH,aAAa,QAAS,2CAA2C,EACtE2P,EAAK3P,aAAa,KAAM,2CAA2C,EACnE3F,OAAOjD,iBAAiB,SAAU,WAC9BuY,EAAKza,MAAMib,IAAML,EAASM,sBAAsB,EAAED,IAAM,IAC5D,CAAC,EAEDL,EAASlW,MAAM+V,CAAI,GAGvBU,iCAAiC,EAEjChW,OAAOjD,iBAAiB,SAAU,SAASpD,GACvCqc,iCAAiC,CACrC,CAAC,EAEOL,GACR,IAAK,OACDF,EAASxZ,UAAUI,OAAO,qCAAsC,mCAAmC,EACnGoZ,EAASxZ,UAAUC,IAAI,8BAA8B,EACrD,MAEJ,IAAK,aACDuZ,EAASxZ,UAAUI,OAAO,+BAAgC,mCAAmC,EAC7FoZ,EAASxZ,UAAUC,IAAI,oCAAoC,EAE3DuZ,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKza,MAAMiB,QAAU,QACrBwZ,EAAKza,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKza,MAAMub,MAAQ,SACvB,EAEAX,EAASY,WAAa,WAClBf,EAAKza,MAAMiB,QAAU,MACzB,EAEA,MAEJ,IAAK,YACD2Z,EAASxZ,UAAUI,OAAO,+BAAgC,oCAAoC,EAC9FoZ,EAASxZ,UAAUC,IAAI,mCAAmC,EAE1DuZ,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKza,MAAMiB,QAAU,QACrBwZ,EAAKza,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKza,MAAMub,MAAQ,SACvB,EAEAX,EAASY,WAAa,WAClBf,EAAKza,MAAMiB,QAAU,MACzB,CAMJ,CAhFA,CAiFJ,CAOA,SAASka,mCACL,IAaMV,EAZAO,EAAazb,SAAS+C,cAAc,gDAAgD,EACrF0Y,KAGCJ,EAAWrb,SAASya,eAAe,+BAA+B,KAEpEY,EAAS5a,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,KAC9DL,EAAS5a,MAAMyb,KAAOT,EAAWE,sBAAsB,EAAEQ,MARvC,GAQ+D,GAAK,KACtFd,EAAS5a,MAAMsb,OAASN,EAAWW,aAAe,KAClDf,EAAS5a,MAAM4b,MAAQC,QAGrBpB,EAAOlb,SAASya,eAAe,2CAA2C,KAE5ES,EAAKza,MAAM4b,MAAQZ,EAAWc,YAAc,KAC5CrB,EAAKza,MAAMyb,KAAOT,EAAWE,sBAAsB,EAAEO,KAAO,KAEpE,CAKA,SAASM,gBACL,OAA+B,KAA3B7L,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,wCAIxC,CAAC/L,SAASgM,gBACoB,SAAhChM,SAASP,oBAAyF,IAAxDpQ,SAASC,iBAAiB,iBAAiB,EAAEmB,QACvD,gBAAhCuP,SAASP,oBAAgG,IAAxDpQ,SAASC,iBAAiB,iBAAiB,EAAEmB,OACvG,CAMA,SAASwb,cAAcC,GACnB,GAA+B,KAA3BlM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAGX,IAEYI,EAHZ/M,YAAY,kBAAmB8M,CAAQ,EAClCL,cAAc,GACRxc,CAAAA,SAASya,eAAe,aAAa,KACpCqC,EAAc9c,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAO,iBAAiB,EACjDuR,EAAYvR,aAAa,QAAS,iBAAiB,EACnDuR,EAAYvR,aAAa,KAAM,aAAa,EAC5CuR,EAAYvR,aAAa,QAAS,+BAA+B,EACjEuR,EAAYvR,aAAa,MAAOsR,CAAQ,EACxCtU,MAAM,MAAM,EAAElD,OAAOyX,CAAW,EAG5C,CAMA,SAASC,8BAA8BF,GACnC,GAA+B,KAA3BlM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAEX,IAEYI,EAFPN,cAAc,GACRxc,CAAAA,SAASya,eAAe,aAAa,KACpCqC,EAAc9c,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAO,iBAAiB,EACjDuR,EAAYvR,aAAa,QAAS,iBAAiB,EACnDuR,EAAYvR,aAAa,KAAM,aAAa,EAC5CuR,EAAYvR,aAAa,QAAS,+BAA+B,EACjEuR,EAAYvR,aAAa,MAAOiH,mBAAmBqK,CAAQ,CAAC,EAC5DtU,MAAM,MAAM,EAAElD,OAAOyX,CAAW,EAG5C,CAMA,SAASE,gBACL,GAA+B,KAA3BrM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAIXxb,IAAI+b,EAAuBzM,kBAAkBsD,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzBmJ,EAAiC,CAClC,GAAOzM,kBAAkB6D,QAAQ,kBAAmB,KAAQ,EAKxD,OADA0I,KAAAA,8BAA8BE,CAAoB,EAHlDzM,kBAAkBgE,OAAO,iBAAiB,CAMlD,CAE2C,SAAtCvM,kBAAkBG,gBACnBuK,sBACI,sBACA,CACIzJ,OAAQ,OACRhG,SAAU,SAAS8S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBkH,SAAuC,IAA5BlH,EAAOxR,QAAQ,OAAO,IAE3EgM,kBAAkBsD,IAAI,iBAAiB,IAE1CtD,kBAAkBC,IAAI,kBAAmBuF,CAAM,EAE/ClF,oCAAoC,GAGxC8L,cAAc5G,CAAM,EAE5B,CACJ,CACJ,EAGApD,sBACI,CACIC,OAAQ,qBACZ,EACA,CACIpG,QAAS,CAAA,EACTvJ,SAAU,SAAS8S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBkH,SAAuC,IAA5BlH,EAAOxR,QAAQ,OAAO,IAE3EgM,kBAAkBsD,IAAI,iBAAiB,IAE1CtD,kBAAkBC,IAAI,kBAAmBuF,CAAM,EAE/ClF,oCAAoC,GAGxC8L,cAAc5G,CAAM,EAE5B,EACAlD,WAAY,SAAS9J,GACjBA,EAAIqE,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAKA,SAAS8P,mBACE3M,kBAAkB+D,MAAM,iBAAiB,GAAO/D,kBAAkBsD,IAAI,iBAAiB,IAC1F/D,YAAY,kBAAmB,MAAM,EACrCS,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhCE,SAASP,oBAC0BvD,KAAAA,IAAnCkG,YAAY,iBAAiB,GAE7BhD,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAASsJ,kBACE7I,kBAAkB+D,MAAM,gBAAgB,GAAO/D,kBAAkBsD,IAAI,gBAAgB,IACxF/D,YAAY,iBAAkB,MAAM,EACpCS,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhCE,SAASP,oBACyBvD,KAAAA,IAAlCkG,YAAY,gBAAgB,GAE5BhD,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAAS4J,yBACAnJ,kBAAkB+D,MAAM,sBAAsB,GAAM/D,kBAAkB+D,MAAM,eAAe,GAC5F6I,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACK5M,CAAAA,kBAAkB+D,MAAM,eAAe,GAAK/D,CAAAA,kBAAkBsD,IAAI,eAAe,GACjFtD,CAAAA,kBAAkB+D,MAAM,sBAAsB,GAAK/D,CAAAA,kBAAkBsD,IAAI,sBAAsB,GAE5D,WAAhCnD,SAASP,oBAC+BvD,KAAAA,IAAxCkG,YAAY,sBAAsB,GACDlG,KAAAA,IAAjCkG,YAAY,eAAe,EANnC,CAaA7R,IAAI6N,EAAQsO,eAAe,EAG3B,GAFA1M,SAAS2M,eAAiB,GAEP,EAAfvO,EAAM3N,OACN,IAAKF,IAAIC,EAAI,EAAGA,EAAI4N,EAAM3N,OAAQD,CAAC,GAAI,CAEnC,IAAMoc,EAAoBxO,EAAM5N,GAAGlB,iBAAiB,gBAAgB,EACpE,IAAKiB,IAAIC,EAAI,EAAGA,EAAIoc,EAAkBnc,OAAQD,CAAC,GACT,WAA9Boc,EAAkBpc,GAAGgO,OAErBwB,SAAS2M,eAAejd,KAAKkd,EAAkBpc,EAAE,EAEjD0V,2BAA2B0G,EAAkBpc,GAAI,QAASqc,yBAAyB,EACnF3G,2BAA2B0G,EAAkBpc,GAAI,QAASsc,kBAAkB,EAGxF,CAlBJ,CAoBJ,CAOA,SAASC,sBAAsBC,EAAWC,GACtC,GAAuC,KAAA,IAA5BjN,SAAS2M,gBAAmE,EAAjC3M,SAAS2M,eAAelc,OAC1E,IAAKF,IAAIC,EAAI,EAAGA,EAAIwP,SAAS2M,eAAelc,OAAQD,CAAC,GACjDuX,2BAA2B/H,SAAS2M,eAAenc,GAAIwc,EAAWC,CAAY,CAG1F,CAEA1c,IAAIsc,0BAA4B,SAAgBje,GAC5Cse,qBAAqB,EACrBH,sBAAsB,QAASF,yBAAyB,CAC5D,EAEIC,mBAAqB,SAAgBle,GACrCue,cAAc,EACdJ,sBAAsB,QAASD,kBAAkB,CACrD,EAKA,SAASI,uBACErN,kBAAkB+D,MAAM,sBAAsB,GAAO/D,kBAAkBsD,IAAI,sBAAsB,GACpGtD,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhCE,SAASP,oBAC+BvD,KAAAA,IAAxCkG,YAAY,sBAAsB,GAEN,gBAAhCpC,SAASP,oBAGuB,SAAhCO,SAASP,qBAEiC,KAAA,IAA/BO,SAASC,mBACgB/D,KAAAA,IAA/B8D,SAASC,mBAAmCD,SAASC,qBAI9Db,YAAY,uBAAwB,MAAM,CAElD,CAKA,SAAS+N,gBACEtN,kBAAkB+D,MAAM,eAAe,GAAO/D,kBAAkBsD,IAAI,eAAe,GACtFtD,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhCE,SAASP,oBACwBvD,KAAAA,IAAjCkG,YAAY,eAAe,GAEC,gBAAhCpC,SAASP,oBAGuB,SAAhCO,SAASP,qBAEiC,KAAA,IAA/BO,SAASC,mBACgB/D,KAAAA,IAA/B8D,SAASC,mBAAmCD,SAASC,qBAI9Db,YAAY,gBAAiB,MAAM,CAE3C,CAYA,SAASgO,gCAEL,SAASC,EAAsBhV,GAC3B,GAAIA,EAAIiV,cACmC,CAAC,IAAxCjV,EAAIiV,aAAazZ,QAAQ,QAAQ,GACO,CAAC,IAAzCwE,EAAIiV,aAAazZ,QAAQ,SAAS,EAElC,IACI0Z,oBAAoBhX,KAAKW,MAAMmB,EAAIiV,YAAY,CAAC,CAGpD,CAFE,MAAO5L,GACL7H,QAAQrE,IAAIkM,EAAE3E,SAAS,CAAC,CAC5B,CAER,CAEsB,aAAlB,OAAOyQ,OAEwC,YAA3C,OAAOA,OAAOne,QAAQ,EAAEoe,aAAa,EACrCD,OAAOne,QAAQ,EAAEyC,GAAG,eAAgB,SAASlD,EAAOyJ,EAAKqV,GACrDL,EAAsBhV,CAAG,CAC7B,CAAC,EAEDmV,OAAOne,QAAQ,EAAEoe,aAAc,SAAS7e,EAAOyJ,EAAKqV,GAChDL,EAAsBhV,CAAG,CAC7B,CAAC,EAIyB,aAA1B,OAAOC,gBAEPjJ,SAAS2C,iBAAiB,mBAAoB,SAASpD,GACnB,IAA5BA,EAAMuD,OAAOoJ,YACb8R,EAAsBze,EAAMuD,MAAM,CAE1C,CAAC,CAGb,CAMA,SAASwb,kCACLhG,uBAAyBc,YAAa,WAClC,IAIImF,EAJoD,MAApD/N,kBAAkBsD,IAAI,wBAAwB,EAC9C6G,cAAcrC,sBAAsB,GAGpCiG,EAAa/N,kBAAkBsD,IAAI,0BAA0B,KAE7DpD,uBAAuB,CAAC,CAAC,8BAA+B6N,IAAc,CAAC1N,gBAAiB,CAAA,CAAI,CAAC,EAC7FL,kBAAkBC,IAAI,yBAA0B,GAAG,EACnDkK,cAAcrC,sBAAsB,EAG5C,EAAG,GAAI,CACX,CAOA,SAASkG,cACLxe,SAAS2C,iBAAiB,oBAAqB,WAED,KAAA,IAA/BgO,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,qBAEzDE,oCAAoC,EACF,YAA9B,OAAO4J,qBAAwE,YAAnC,OAAO+D,yBACnD/D,mBAAmB+D,wBAAwB3K,IAAI,0BAA0B,CAAC,CAGtF,CAAC,EACMnD,SAAS+N,qBACZC,yBAAyB,EAG7BZ,8BAA8B,EAGzBpJ,oBAAoBJ,MAAM,kBAAkB,EAW7C/D,kBAAkBC,IAAI,kBAAmBlP,OAAOiP,kBAAkBsD,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvF8K,EAAYhL,sBAAsB,EACxCe,oBAAoBlE,IAAI,mBAAoBmO,EAAW,CAAA,CAAK,EAC5DpO,kBAAkBC,IAAI,kBAAmB,CAAC,EACtCzQ,SAAS8V,UACQ,IAAI+I,IAAI7e,SAAS8V,QAAQ,EAC3BgJ,OAASxX,SAASwX,MAC7BnK,oBAAoBlE,IAAI,qBAAsBzQ,SAAS8V,SAAU,CAAA,CAAK,GAOlFiJ,oCAAoC,EAdpC,IAgBMC,EAAcxO,kBAAkBsD,IAAI,iBAAiB,EAoBrDmL,GAnBCD,GAAeA,IAAgBrO,SAASP,qBAC3CI,kBAAkBC,IAAI,kBAAmBE,SAASP,kBAAkB,EACpEI,kBAAkBgE,OAAO,gBAAgB,EACzChE,kBAAkBgE,OAAO,iBAAiB,GAGV,gBAAhC7D,SAASP,qBACTgN,uBAAuB,EAEvBtX,WAAWsX,uBAAwB,GAAI,GAG3CxX,OAAOjD,iBAAiB,iBAAkBkS,sBAAuB,CAAA,CAAI,EACrEjP,OAAOjD,iBAAiB,QAASsS,aAAc,CAAA,CAAI,EACnDjV,SAASkf,WAAa,IAAIpI,WAC1B9W,SAASkf,WAAW1H,gBAAgB,EACpCxX,SAASkf,WAAWlQ,aAAa,EAGb,CAChB,CAAC,kBAAmBvG,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAeyD,OAAOsH,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkB3X,UAAU4X,aAWjC,GARA7O,kBAAkBC,IAAI,kBAAmBhI,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EAChF5D,kBAAkBC,IAAI,mBAAoB,GAAG,EAC7CD,kBAAkBC,IAAI,kBAAmB,GAAG,EAE5CD,kBAAkBC,IAAI,cAAeoH,OAAOsH,kBAAkB,EAAE,GAAG,CAAE,CAAG,EACxE3O,kBAAkBC,IAAI,iBAAkB2O,mBAAmB,CAAC,EAC5D5O,kBAAkBC,IAAI,iBAAkBhJ,UAAU4X,SAAS,EAEtB,WAAhC1O,SAASP,mBACV6O,EAAY5e,KAAK,CAAC,uBAAwB,IAAI,MAC3C,CAEHa,IAAIoe,EAAetf,SAASkR,OAAOqO,MAAM,GAAG,EAC5C,GAA6B,IAAxBD,EAAale,OACd,IAAMF,IAAIC,EAAI,EAAGA,EAAIme,EAAale,OAAQD,CAAC,GAAK,CAC5CD,IACIiS,EADgBmM,EAAane,GAAGqe,KAAK,EACVD,MAAM,GAAG,EAAE,GACW,IAAhDpM,EAAW3O,QAAQ,uBAAuB,GAC3C0O,eAAeC,CAAU,CAEjC,CAER,CAGI,CAAA,CAACxC,SAAS8L,gBACoB,GAA5B,CAAC9L,SAAS8L,gBAAwE,GAAjD9L,SAAS+L,uCAEvCF,cAAc,EACfQ,cAAc,EAEdiC,EAAY5e,KAAK,CAAC,kBAAmBsQ,SAAS8O,WAAW,GAI5D,CAAC9O,SAAS+O,gCACXT,EAAY5e,KAAK,CAAC,oBAAqB,IAAI,EAC3CkI,MAAM,+BAAiC,EAAE9F,GAAG,OAAQmY,UAAU,GAG7D,CAACjK,SAASgP,+BACXV,EAAY5e,KAAK,CAAC,0BAA2B,IAAI,EACjDkI,MAAM,iDAAmD,EAAE9F,GAAG,OAAQwY,eAAe,GAGrFzK,kBAAkB+D,MAAM,YAAY,EACpC0K,EAAY5e,KAAK,CAAC,aAAcmQ,kBAAkBsD,IAAI,YAAY,EAAE,EAEpEmL,EAAY5e,KAAK,CAAC,aAAc,EAAE,EAItCgR,8BAA8B,EAG9BnQ,IAAI0e,EAAmBpP,kBAAkBsD,IAAI,0BAA0B,EAqGnE+L,GApGsC,KAAA,IAA/BlP,SAASC,mBAChBD,SAASC,mBACTD,SAAS+L,uCAETlM,kBAAkBC,IAAI,yBAA0B,GAAG,EAC/CmP,GACAX,EAAY5e,KAAK,CAAC,8BAA+Buf,EAAiB,EAClEpP,kBAAkBC,IAAI,yBAA0B,GAAG,GAEnD6N,gCAAgC,GAIxCvO,YAAYkP,CAAW,EAEvBnZ,WAAW,WAEkC,KAAA,IAA9B6K,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,oBAEzDE,oCAAoC,EAIG,KAAA,IAAhCH,SAASP,oBACgB,SAAhCO,SAASP,qBAET0P,0CAA0C,EAC1CC,mBAAmB,GAGvB,IAAK7e,IAAIC,EAAI,EAAGA,EAAInB,SAAS+O,MAAM3N,OAAQD,CAAC,GAAI,CAC5CD,IA0BI8e,EAIAC,EA9BA5J,EAAOrW,SAAS+O,MAAM5N,GAGtB+e,8BAA8BlgB,SAAS+O,MAAM5N,GAAI,gBAAgB,GAGjEkV,EAAKtT,cAAc,qCAAqC,GACxDsT,EAAKtT,cAAc,8CAA8C,GACjEsT,EAAKtT,cAAc,8CAA8C,GAOb8J,KAAAA,IAApD7M,SAAS+O,MAAM5N,GAAG/B,SAAS+gB,sBAC8B,EAAzDngB,SAAS+O,MAAM5N,GAAG/B,SAAS+gB,qBAAqB/e,SAKhDiV,EAAKtT,cAAc,oCAAoC,IACnDqd,EAAgB/J,EAAKtT,cAAc,oCAAoC,EAC3EsT,EAAKgK,YAAYD,CAAa,IAG9BJ,EAAchgB,SAASoE,cAAe,OAAQ,GACtCmH,aAAc,OAAQ,QAAS,EAC3CyU,EAAYzU,aAAc,KAAM,wBAA0BpK,CAAE,EAC5D6e,EAAYzU,aAAc,OAAQ,sBAAsB,GACpD0U,EAAuB,IACN,GAAKK,6BAA6BjK,CAAI,EAC3D2J,EAAYvc,MAAQ8c,KAAKrZ,KAAKC,UAAU8Y,CAAoB,CAAC,EAC7D5J,EAAKhR,OAAQ2a,CAAY,EAEzB3J,EAAKmK,cAAgBnK,EAAKoK,SAE1BpK,EAAKqK,YAAcvf,EACnBkV,EAAKoK,SAAW,SAASlhB,GACgB,WAAhCoR,SAASP,oBAAuE,KAAA,IAA7B7Q,EAAMuD,OAAO4d,aACjEC,gCAAiCL,6BAA6B7gB,IAAI,EAAGF,EAAMuD,OAAO4d,WAAY,EAG9D,SAAhC/P,SAASP,oBAAiCwQ,uBAAuBrhB,EAAMuD,MAAM,IAC7E8C,OAAOqD,eAAepJ,UAAUyL,KAAO,SAAS1H,GAC5C1C,IACA2f,EAAe,uCADIC,gBAAgB,EACoC,IACvEC,YAAYhhB,KAAKN,KAAMohB,EAAejd,CAAI,EAC1CkC,WAAW,KACPF,OAAOqD,eAAepJ,UAAUyL,KAAOyV,WAC3C,EAAG,CAAC,CACR,GAIAxhB,EAAMuD,OAAO0d,yBAAyBQ,UAAY,CAACC,0BAA0B1hB,EAAMuD,MAAM,IAC1D+J,KAAAA,IAA3BtN,EAAMuD,OAAOjB,WAA2BtC,EAAMuD,OAAOjB,UAAUqf,SAAS,iBAAiB,GACzF3hB,EAAM4hB,eAAe,EAEzBrb,WAAW,WACPvG,EAAMuD,OAAO0d,cAAczgB,KAAKR,EAAMuD,OAAQvD,CAAK,CACvD,EAAG,CAAC,EAEZ,EACJ,CACJ,EAAG,GAAI,EAGiBS,SAASC,iBAAiB,wBAAwB,GAE1E,IADA0Q,SAASkP,kBAAoBA,GACPze,OAClB,IAAKF,IAAIC,EAAI,EAAGA,EAAI0e,EAAkBze,OAAQ,EAAED,EAC5C0e,EAAkB1e,GAAGwB,iBAAiB,QAASye,yBAAyB,EAKhF,IAAK,IAAMC,KAASrhB,SAAS+O,MAED,aAApB,OAAO4B,UACqC,GAA5C,CAAEA,SAAS2Q,8BACX,EACiC,eAA7BD,EAAM9d,aAAa,IAAI,GACU,OAAhC8d,EAAM9d,aAAa,OAAO,GAAqE,CAAC,IAAxD8d,EAAM9d,aAAa,OAAO,EAAEiB,QAAQ,aAAa,GAC1D,OAA/B6c,EAAM9d,aAAa,MAAM,GAA+D,CAAC,IAAlD8d,EAAM9d,aAAa,MAAM,EAAEiB,QAAQ,QAAQ,IAInF6c,EAAMte,cAAc,8BAA8B,GAKrB,qBAA7Bse,EAAM9d,aAAa,IAAI,GACS,2BAAhC8d,EAAM9d,aAAa,OAAO,IAM9B8d,EAAME,wBAA0BF,EAAMZ,SACtCY,EAAMZ,SAAW,GAAOe,4BAA4BnP,EAAGgP,CAAK,GAKpEI,yBAAyB,EAGzB,IAAI7S,4BAOA+B,SAAS+Q,6BACTC,sBAAsB,CAE9B,CAKA,SAASA,wBACL,GAAIhR,SAAS+L,qCAAsC,CAC/C,IAAMkF,EAA4BxI,YAAY,KACdzR,CAAAA,aAAaka,2BAGrC9R,YAAY,2BAA4B,IAAK,MAAM,EACnD4K,cAAciH,CAAyB,EAE/C,EAAG,GAAG,CACV,CACJ,CAKA,SAAS7B,qBA2BDna,OAAOsC,eAAe,IAAI,GAC1BtC,OAAOkc,GAAG5Z,eAAe,UAAU,GACD,YAAlC,OAAOtC,OAAOkc,GAAGC,SAASC,KAE1Bpc,OAAOkc,GAAGC,SAASC,IA9BI,CAACC,EAASC,KACV,UAAnB,OAAOD,GAAoC,OAAZA,GAC9BA,EAAQ/Z,eAAe,MAAM,GAAM+Z,EAAQ/Z,eAAe,MAAM,IAMjE+Z,EAAQre,KAAKsE,eAAe,UAAU,GACP,EAA/B+Z,EAAQre,KAAKue,SAAS/gB,QACtB6gB,EAAQre,KAAKue,SAAS,GAAGja,eAAe,MAAM,GACZ,+BAAlC+Z,EAAQre,KAAKue,SAAS,GAAGC,OAEzBH,EAAQre,KAAKue,SAAS,GAAGve,KAAKye,0BAA4BvB,gBAAgB,EAC1EmB,EAAQre,KAAKue,SAAS,GAAGve,KAAK0e,YAAc3a,aAAaC,QAAQ,0BAA0B,GAI1E,0BAAjBqa,EAAQG,QACRH,EAAQre,KAAKye,0BAA4BvB,gBAAgB,EACzDmB,EAAQre,KAAK0e,YAAc3a,aAAaC,QAAQ,0BAA0B,GAGvEsa,EAAKD,CAAO,EAOsB,CAEjD,CAKA,SAASR,2BAEL,GAAqD,OAAhDzhB,SAAS+C,cAAc,mBAAmB,EAAa,CACxD,IAAMwf,EAAetZ,eAAepJ,UAAUyL,KAC9CrC,eAAepJ,UAAUyL,KAAO,SAASvB,GAErC,GACIA,GACgB,UAAhB,OAAOA,GAEmD,CAAC,IAAvDA,EAAKvF,QAAQ,mCAAmC,EAEtD,CACEtD,IAAIshB,EAA0B,GAC1BjE,EAAa5W,aAAaC,QAAQ,0BAA0B,EAChE,IACI2W,EAAarX,KAAKW,MAAM0W,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CAEmB,OAAfA,GACe,CAAA,IAAfA,GACAA,EAAWrW,eAAe,OAAO,GACZ,KAArBqW,EAAW9a,QAEX8a,EAAaA,EAAW9a,MACxB+e,GAA2B,0CAAiDjE,GAGhFrd,IAAI2f,EAAeC,gBAAgB,EAGnC/W,GAFAyY,GAA2B,wCAA+C3B,CAK9E,CACA,OAAO0B,EAAaE,MAAMhjB,KAAM,CAACsK,EAAK,CAC1C,CACJ,CACJ,CAMA,SAAS2Y,4CAA4CC,GAE5CA,IAC0C,SAAtC1a,kBAAkBG,gBACnBuK,sBAAsB,iCAAkC,EAAE,EACZ,eAAtC1K,kBAAkBG,iBAC1BwK,sBAAsB,CAACC,OAAQ,gCAAgC,EAAG,EAAE,EAGhF,CAUA,SAASiN,4CAIL5e,IAAIqd,EAAa,CAAA,EACM,aAAlB,OAAOJ,QAAsD,YAA5B,OAAOA,OAAOyE,WAChDzE,OAAOyE,UAAU,CACb9P,WAAY,SAAS9J,EAAKqV,GACtBnd,IAAI2hB,EAAa,CAAA,EA0BjB,GAxB8B,UAAzB,OAAOxE,EAASza,OAC8B,CAAC,IAA5Cya,EAASza,KAAKY,QAAQ,eAAe,IACrCqe,EAAa,iBAGgC,CAAC,IAA9CxE,EAASza,KAAKY,QAAQ,iBAAiB,IACvCqe,EAAa,mBAIyC,CAAC,IAAvDxE,EAASza,KAAKY,QAAQ,0BAA0B,GACI,CAAC,IAArD6Z,EAASza,KAAKY,QAAQ,wBAAwB,IAE9Cqe,EAAa,4BAG0C,CAAC,IAAxDxE,EAASza,KAAKY,QAAQ,2BAA2B,IACjDqe,EAAa,6BAG4C,CAAC,IAA1DxE,EAASza,KAAKY,QAAQ,6BAA6B,KACnDqe,EAAa,+BAGQ,UAAxB,OAAOxE,EAASnY,KACmC,CAAC,IAAjDmY,EAASnY,IAAI1B,QAAQ,qBAAqB,IAC1Cqe,EAAa,sBAC4C,OAArDlb,aAAaC,QAAQ,0BAA0B,GAAY,CAC3D2W,EAAa5W,aAAaC,QAAQ,0BAA0B,EAC5D,IACI2W,EAAarX,KAAKW,MAAM0W,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CACmB,CAAA,IAAfA,GAAwBA,EAAWrW,eAAe,OAAO,GAA0B,KAArBqW,EAAW9a,QACzE8a,EAAaA,EAAW9a,MAEhC,CAIR,IACQod,EADJgC,IACIhC,EAAeC,gBAAgB,EAE/BvC,EADsB,UAAtB,OAAOA,EACM,yCAA2CA,EAAa,IAExD,GAIjBF,EAASza,MAFTid,EAAe,uCAAyCA,EAAe,KAExCtC,EAAaF,EAASza,KAE7D,CACJ,CAAC,CAET,CAGA,SAASqd,0BAA0B5K,GAC/B,MAAIA,CAAAA,CAAAA,EAAKxU,UAAUqf,SAAS,wBAAwB,CAKxD,CAgBA,SAASM,4BAA4BnP,EAAGyQ,GACpC,IAEI,IAAMC,EAAgBD,EAAW/f,cAAc,4BAA4B,EACvEigB,EAAU,KAEQ,OAAlBD,GACwB,OAAxBA,EAActf,QAEduf,EAAUD,EAActf,OAI5BvC,IAQU+hB,EAWF3D,EAmBE4D,EAtCNC,EAA4BC,6BAA6B,EAGzDC,EAAyB7S,kBAAkBsD,IAAI,0BAA0B,EAG1C,OAA9BqP,GAAwD,OAAlBJ,GAAqD,OAA3BM,IACjEhR,EAAE8O,eAAe,EACX8B,EAAW,KACS,OAAlBF,GACAA,EAAcO,WAAWjD,YAAY0C,CAAa,EAEJ,YAA9C,OAAOD,EAAWvB,wBAClBuB,EAAWvB,wBAAwB,EAEnCgC,gBAAgB1jB,UAAU2jB,OAAOzjB,KAAK+iB,CAAU,CAExD,EAEIxD,EAAe6D,EAGF,OAAZH,IACD1D,EAAamE,kCAAoCT,GAIrD1D,EAAaoE,4BAA8BL,EAIC,UAAxC,OAAO/D,EAAa/M,iBAC4B,CAAC,IAAjD+M,EAAa/M,gBAAgB/N,QAAQ,KAAK,IAE1C8a,EAAa/M,gBAAkBC,mBAAmB8M,EAAa/M,eAAe,GAOpD,KAAA,KAHxB2Q,EAAgBhc,KAAKC,UAAUmY,CAAY,IAGqB,IAAzB4D,EAAc9hB,OACvDsP,uBACIwS,EACA,CAAChgB,SAAU+f,EAAUvZ,gBAAiBuZ,EAAUpS,gBAAiB,CAAA,CAAI,CACzE,EAEAoS,EAAS,EAKrB,CAFE,MAAO5b,GACLmD,QAAQmZ,KAAK,6CAA+Ctc,CAAK,CACrE,CACJ,CAMA,SAAS+K,wBAAwBwR,EAAgB,IAC7C1iB,IAAI2iB,EAAiB,GAErBA,EAAeC,kBAAoB/Q,YAAY9K,kBAAkBkJ,aAAe,mBAAmB,EACnG0S,EAAeE,wBAA0BhR,YAAY9K,kBAAkBkJ,aAAe,yBAAyB,EAC/G0S,EAAeG,WAAajR,YAAY9K,kBAAkBkJ,aAAe,YAAY,EACrF0S,EAAeI,iBAAmBlR,YAAY9K,kBAAkBkJ,aAAe,kBAAkB,EACjG0S,EAAeK,gBAAkBnR,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAC/F0S,EAAeM,gBAAkBpR,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAC/F0S,EAAeO,eAAiBrR,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EAC7F0S,EAAeQ,YAActR,YAAY9K,kBAAkBkJ,aAAe,aAAa,EAGvF,IAAMmT,EAA2B9T,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,gBAAgB,EAClGoT,EAA4B/T,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACpGqT,EAA4BhU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACpGsT,EAAgBjU,kBAAkBsD,IAAI,iBAAiB,EACvD4Q,EAAmB/P,oBAAoBb,IAAI,oBAAoB,EAC/D6Q,EAAmBhQ,oBAAoBb,IAAI,oBAAoB,EAC/D8Q,EAAyBpU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,cAAc,EAC9F0T,EAAarU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACrF2T,EAAgBtU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,gBAAgB,EACvF4T,EAA+BvU,kBAAkBsD,IACnD7L,kBAAkBkJ,aAAe,mCACrC,EAGM6T,EAAqBjS,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EAClF8T,EAAsBlS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EACpF+T,EAAsBnS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EACpFgU,EAAoBpS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAClFiU,EAAsB,CAAC,CAACrS,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EA8B3F,GA3BA0S,EAAewB,eAA8CxY,KAAAA,IAA7ByX,EAC5BA,EAA2BU,EAC/BnB,EAAeyB,gBAAgDzY,KAAAA,IAA9B0X,EAC7BA,EAA4BU,EAChCpB,EAAe0B,gBAAgD1Y,KAAAA,IAA9B2X,EAC7BA,EAA4BU,EAChCrB,EAAetR,gBAAiC1F,KAAAA,IAAfgY,EAC7BA,EAAaM,EACjBtB,EAAe2B,eAAmC3Y,KAAAA,IAAlBiY,EAC5BA,EAAgBM,EACpBvB,EAAe4B,kCAAqE5Y,KAAAA,IAAjCkY,EAC/CA,EAA+B,GAC/BlB,EAAetR,iBAA6D,UAA1C,OAAOsR,EAA8B,iBACnEA,EAAetR,gBAAgB/N,QAAQ,QAAQ,IAC/Cqf,EAAetR,gBAAkBC,mBAAmBqR,EAAetR,eAAe,GAI1FsR,EAAe6B,gBAAkBjB,EACjCZ,EAAe8B,mBAAqBjB,EACpCb,EAAe+B,mBAAqBjB,EACpCd,EAAegC,mBAAqBjB,EAE/Bf,EAAetR,kBAChBsR,EAAetR,gBAAkB5B,SAAS8O,YAGd,UAA3B,OAAO,EACR,IAAKve,IAAIC,EAAI,EAAGA,EAAIyiB,EAAcxiB,OAAQ,EAAED,EACF,UAAjC,OAAQyiB,EAAcziB,GAAG,GAE1B0iB,EAAeD,EAAcziB,GAAG,GAAG,IAAMyiB,EAAcziB,GAAG,GAAG,GAE7D0iB,EAAeD,EAAcziB,GAAG,IAAMyiB,EAAcziB,GAAG,QAI/DqJ,QAAQrE,IAAI,+CAA+C,EAO/D,OAHA0d,EAAiBiC,yBAAyBjC,CAAc,EAGjD3c,KAAKC,UAAU0c,CAAc,CACxC,CAUA,SAASiC,yBAAyBhY,GAC9B,GAAuB,UAAlB,OAAOA,EAER,IAAK5M,IAAI6M,KAAaD,EAAQ,CAO1B,IAIUE,EATwB,UAA7B,OAAOF,EAAOC,KACfD,EAAOC,GAAa+X,yBAAyBhY,EAAOC,EAAU,GAKjC,UAA7B,OAAOD,EAAOC,IACiC,OAA/CD,EAAOC,GAAW7J,MAAM,iBAAiB,GAGb,UAAvB,OADC8J,EAAc9G,KAAKW,MAAMiG,EAAOC,EAAU,KAE5CD,EAAOC,GAAaC,EAGhC,CAGJ,OAAOF,CACX,CAGA,SAASwS,6BAA8BjK,GAEnCnV,IAAI6kB,EAAS,GACTC,EAAgB,GAChBC,EAAqB,EACrBC,EAAkB,GAClBC,EAAuB,EACvBC,EAA2B,GAE/B,IAAKllB,IAAIiJ,KAAOkM,EAAKjX,SACZinB,MAAM,CAAClc,CAAG,IACX4b,EAAO5b,GAAOkM,EAAKjX,SAAS+K,IAsDpC,OAjDA4b,EAASA,EAAOhiB,OAAO,SAASzD,GAE5B,MAAuE,CAAC,IAAnE8lB,EAAyB5hB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IAI5D,CAAC,IAAM,CAAC,QAAS,YAAYiB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IACjE6iB,EAAyB/lB,KAAMC,EAAKiD,aAAa,MAAM,CAAE,EAClD,CAAA,GAGf,CAAC,GAGM+M,QAAQ,SAAShQ,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,EAAEgmB,YACY,MAAnChlB,iBAAiBhB,CAAI,EAAEkF,SACO,WAA9BlF,EAAKiD,aAAa,MAAM,GAEnBjD,EAAKuB,UAAUqf,SAAS,gBAAgB,GAW7C8E,GAAiB,IAAM1lB,EAAKiD,aAAa,MAAM,EAC/C0iB,CAAkB,KARdC,GAAmB,IAAM5lB,EAAKiD,aAAa,MAAM,EACjD4iB,CAAoB,IAShC,CAAC,EAEDD,EAAkBA,EAAgB1G,KAAK,EAGhC,CACH+G,eAHJP,EAAgBA,EAAcxG,KAAK,EAI/BgH,qBAAsBP,EACtBQ,iBAAkBP,EAClBQ,uBAAwBP,CAC5B,CACJ,CAGA,SAASxF,gCAAiCgG,EAAyBC,GAC/D1lB,IAAI2lB,EAAgD,UAAnC,OAAOF,GAAoE,OAA5BA,EAC5DA,EAA0B,GAE9B,GAAqC,WAAhChW,SAASP,mBAEV,IAAMlP,IAAIC,KAAK0lB,EAAa,CACxB,GAAS,GAAJ1lB,EAED,OAGJ4O,YAAY,yBADqBlD,KAAAA,IAAX+Z,EAAuBA,EAASzlB,GACC+F,KAAKC,UAAW0f,EAAW1lB,EAAG,CAAE,CAC3F,MAEA4O,YAAY,uBAAwB7I,KAAKC,UAAW0f,CAAW,CAAE,CAEzE,CAGA,SAASC,+BAA+B9Q,EAAQpS,EAAM4E,EAAQ4K,GAC1D,GAA8D,EAAzDpT,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,MAAQuS,EAAO+Q,MAEnC,CACJ,CAKA,SAAS3H,qBACL,OAAOlY,KAAKC,UAAU,CAClB6f,UAAWhnB,SAASinB,gBAAgBC,YACpCC,WAAY1e,KAAK2e,IACbpnB,SAAS+J,KAAKsd,aAAcrnB,SAASinB,gBAAgBI,aACrDrnB,SAAS+J,KAAKqS,aAAcpc,SAASinB,gBAAgB7K,aACrDpc,SAAS+J,KAAKud,aAActnB,SAASinB,gBAAgBK,YACzD,EACAC,aAAcvnB,SAASinB,gBAAgBO,YACvCC,cAAeznB,SAASinB,gBAAgBK,YAC5C,CAAC,CACL,CAGA,SAASpJ,oBAAoBnS,GACzB7K,IAAI+E,EAAM,GACoB,KAAA,IAAnB8F,EAASxD,QAChBwD,EAAWA,EAASxD,OACPmf,UACTzhB,EAAM8F,EAAS4b,UAMf1hB,EAHqB,KAAA,IAAlB8F,EAASnI,MAESiJ,KAAAA,KADzBd,EAAWA,EAASnI,MACPyC,QACH0F,EAAS1F,QAInBJ,KACAjG,SAASyS,cACL,IAAIC,YAAa,qBAAsB,CACnC2C,QAAS,CAAA,EACTE,OAAQ,CAAClP,QAASJ,CAAG,CACzB,CAAE,CACN,EAGA2hB,eAAeC,OAAS5hB,EACxB2hB,eAAend,KAAK,EAEU,GAA1B,CAACsB,EAAS+b,cACVliB,OAAOmiB,KAAK,CAGxB,CAGA,SAASC,0BAA0BC,GAE/BlY,YAAY,kBAAmBkY,CAAY,CAC/C,CAGA,SAASC,+BAA+B/Y,GACpCjO,IAAIgU,EAAY,SACH,WAAT/F,IACA+F,EAAY,UAEhBhU,IAAIuW,EAAQ,GAERoJ,EAAeuC,6BAA6B,EAChDvC,EAAe3Z,KAAKC,UAAU0Z,CAAY,EAQ1C,OAPAA,EAAe,sBAAwBN,KAAKM,CAAY,GACxDpJ,EAAQzX,SAASoE,cAAc,OAAO,GAChCmH,aAAa,OAAQ,2BAA2B,EACtDkM,EAAMlM,aAAa,QAASsV,CAAY,EACxCpJ,EAAMlM,aAAa,OAAQ2J,CAAS,EACpCuC,EAAM5V,UAAUC,IAAI,qBAAqB,EACzC2V,EAAM5V,UAAUC,IAAI,2BAA2B,EACxC2V,CACX,CAOA,SAAS2L,+BACLliB,IAWQinB,EAXJC,EAAoB5X,kBAAkBkE,iBAAiB,EACvD2T,EAAsB1T,oBAAoBD,iBAAiB,EAE/DxT,IAAIonB,EAAmB,CAACC,KAAM,EAAE,EAK5BC,GAJAxoB,SAASkf,YAAclf,SAASkf,WAAWtb,OAC3C0kB,EAAmB,CAACC,KAAMvoB,SAASkf,WAAWtb,IAAI,GAGnB,CAAC6kB,8BAA+B,EAAE,GAOrE,OALIzoB,SAAS2P,+BACLwY,EAA6BjhB,KAAKW,MAAMX,KAAKC,UAAUnH,SAAS2P,4BAA4B,CAAC,EACjG6Y,EAA+B,CAACC,8BAA+BN,CAA0B,GAGtF,CAAC,GAAGC,EAAmB,GAAGC,EAAqB,GAAGC,EAAkB,GAAGE,CAA4B,CAC9G,CAKA,SAASnL,iBACLnc,IAAI6N,EAAQ/O,SAAS+O,MACrB,OAAIA,GAGG,CAAA,CACX,CAOA,SAAS2Z,+BAA+BrS,GAEpCnV,IAAI8U,EAAS,CAAC2S,UAAa,EAAGpC,eAAkB,CAAC,EAkC7CqC,IAhC4C,GAA5C,CAACjY,SAASkY,+BACgC,QAAzCxS,EAAKnN,OAAOwE,SAAS,EAAEhJ,YAAY,GACiB,IAArD2R,EAAKpW,iBAAiB,kBAAkB,EAAEmB,QAC9B,kBAAZiV,EAAKyS,IACLzS,EAAKxU,UAAUqf,SAAS,iBAAiB,GACzC7K,EAAKvR,cAAcjD,UAAUqf,SAAS,aAAa,GACI,CAAC,IAAxD7K,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,kBAAkB,GAChD6R,EAAKyS,IAAkB,eAAZzS,EAAKyS,IAChBzS,EAAKxU,WAAawU,EAAKxU,UAAUqf,SAAS,eAAe,GACzD7K,EAAKxU,WAAawU,EAAKxU,UAAUqf,SAAS,WAAW,GACrD7K,EAAKyS,IAAkB,6BAAZzS,EAAKyS,IAChBzS,EAAKyS,IAAyD,CAAC,IAApDzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,kBAAkB,GACxD6R,EAAKyS,IAAiD,CAAC,IAA5CzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,UAAU,GAChD6R,EAAKyS,IACuD,CAAC,IAA1DzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,wBAAwB,GACtD6R,EAAKxS,MACyD,CAAC,IAA5DwS,EAAKxS,KAAK6J,SAAS,EAAElJ,QAAQ,wBAAwB,GAC9B,iDAA3B6R,EAAKxD,OAAOnF,SAAS,GACpB2I,EAAKxS,MAA2D,CAAC,IAApDwS,EAAKxS,KAAK6J,SAAS,EAAElJ,QAAQ,gBAAgB,GAC1D6R,EAAKyS,IAAkB,mBAAZzS,EAAKyS,IAChBzS,EAAKyS,IACU,mBAAZzS,EAAKyS,IACmD,CAAC,IAAzDzS,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,mBAAmB,GACrD6R,EAAKyS,IAAkB,yBAAZzS,EAAKyS,IAChBzS,EAAKyS,IAAkB,YAAZzS,EAAKyS,IACmE,CAAC,IAArFzS,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,+CAA+C,GACpC,OAA1C6R,EAAKtT,cAAc,iBAAiB,KAEpCiT,EAAOuQ,eAAiB,GAIAlQ,EAAKiN,YAgBjC,OAdIsF,GAAyBA,EAAsB/mB,UAAUqf,SAAS,UAAU,GAC7D,YAAd7K,EAAKxS,MAAsBwS,EAAKxU,UAAUqf,SAAS,cAAc,KAElElL,EAAO2S,UAAY,GAKnBtS,GAAQA,EAAKxU,UAAUqf,SAAS,wBAAwB,IAExDlL,EAAOuQ,eAAiB,EACxBvQ,EAAO2S,UAAY,GAGhB3S,CACX,CAUA,SAASkK,8BAA8B7J,EAAM0S,GACzC,IAAMC,EAAoC,UAAvB,OAAO3S,EAAW,OAAgBA,EAAKxD,OAAS,GAEnE,MAAIxO,CAAAA,CAAAA,QAAQgS,EAAKtT,cAAc,0BAA0B,CAAC,GAItDsT,CAAAA,CAAAA,EAAKxU,UAAUqf,SAAS,wBAAwB,GAIN,CAAC,IAA3C8H,EAAWxkB,QAAQ,iBAAiB,GAIF,CAAC,IAAnCwkB,EAAWxkB,QAAQ,SAAS,GAIC,UAA7B,OAAO,GACsD,CAAC,IAA9D,CAAC,iBAAkB,aAAaA,QAAQukB,CAAe,GAEhB,IADpBL,+BAA+BrS,CAAI,EACpC0S,EAI1B,CAKA,SAASjY,sCACL,GAAoC,SAAhCH,SAASP,mBAAb,CAIAlP,IAAI6N,EAAQsO,eAAe,EAE3B,GAAItO,EACA,IAAM7N,IAAIC,EAAI,EAAGA,EAAI4N,EAAM3N,OAAQD,CAAC,GAChC,GAAK+e,CAAAA,8BAA8BlgB,SAAS+O,MAAM5N,GAAI,WAAW,IAKhB,OAA7CnB,SAAS+O,MAAM5N,GAAGoC,aAAa,QAAQ,GACoB,SAA3DvD,SAAS+O,MAAM5N,GAAGoC,aAAa,QAAQ,EAAEmB,YAAY,GAAc,CAEnExD,IAAIqW,EAASxI,EAAM5N,GAAGlB,iBAAiB,4BAA4B,EACnE,IAAMiB,IAAI+nB,EAAI,EAAGA,EAAI1R,EAAOnW,OAAQ6nB,CAAC,GACjC1R,EAAO0R,GAAG1Z,UAAY,GAG1BvP,SAAS+O,MAAM5N,GAAGkE,OAAO6iB,+BAA+B,CAAC,CAC7D,CApBR,CAuBJ,CA9jCIvX,SAASiG,kBACTC,2BAA2B7W,SAAU,YAAa+Y,mBAAmB,EACrElC,2BAA2B7W,SAAU,YAAa6Y,kBAAkB,EACpEhC,2BAA2B7W,SAAU,UAAW6Y,kBAAkB,EAClEhC,2BAA2B7W,SAAU,SAAUmd,gBAAgB,GA8hB/DxM,SAASiG,kBACmB,YAAxB5W,SAASkM,WACTsS,YAAY,EAEZ3H,2BAA2B7W,SAAU,mBAAoBwe,WAAW,EAGxEhO,kBAAkBC,IAAI,aAAcE,SAASuY,eAAgB,CAAA,CAAK,GAuhBtE,IAAMC,aAAevjB,OAAOwjB,MACtBrI,YAAc9X,eAAepJ,UAAUyL,KAW7C,SAAS+d,6BACLvjB,WAAW,WACHwjB,oBAAoB,IACpB1jB,OAAOwjB,MAAQ,YAAY1mB,GACvB,IAKQme,EAOR,OAZIne,GACAA,EAAK,IACuB,YAA5B,OAAOA,EAAK,GAAG2X,UACf3X,EAAK,GAAG2X,SAAS,mBAAmB,IAEhCwG,EAAeC,gBAAgB,EAE/Bpe,IAAQA,EAAK,IAAMA,EAAK,GAAGqH,MAC3BrH,EAAK,GAAGqH,KAAK1E,OAAO,4BAA6Bwb,CAAY,EAI9DsI,aAAa1G,MAAM7c,OAAQlD,CAAI,CAC1C,EAER,EAAG,GAAI,CACX,CAKA,SAAS4mB,sBACL,IAAMC,EAAc,CAChB,wBAEJroB,IAAIsoB,EAAc,CAAA,EAGlB,IAAKtoB,IAAImV,KADKrW,SAAS+O,MAEnBwa,EAAYjZ,QAAQ,SAASmZ,GACrBpT,EAAKxU,UAAUqf,SAASuI,CAAS,IACjCD,EAAc,CAAA,EAEtB,CAAC,EAGL,OAAOA,CACX,CAMA,SAAS5I,uBAAuBvK,GAC5B,OAA8E,MAA1ErW,SAAS+C,cAAc,4CAA8C,GAGrEsT,EAAAA,CAAAA,GAAQA,CAAAA,EAAKxD,QAA2E,CAAC,IAAlEwD,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,4BAA4B,EAK1F,CAKA,SAASsc,kBACL5f,IAAIknB,EAAoB5X,kBAAkBkE,iBAAiB,EACvD2T,EAAsB1T,oBAAoBD,iBAAiB,EAC3DmM,EAAe,CAAC,GAAGuH,EAAmB,GAAGC,CAAmB,EAChExH,EAAe3Z,KAAKC,UAAU0Z,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS9B,sCACL,IAAM2K,EAAqB/U,oBAAoBb,IAAI,4BAA4B,EAGrD,CAAA,IAAtB4V,GAA+B1pB,SAASsH,SAASC,OAASmiB,GAC1D/U,oBAAoBlE,IAAI,qBAAsBiZ,EAAoB,CAAA,CAAK,EAI3E/U,oBAAoBlE,IAAI,6BAA8BzQ,SAASsH,SAASC,KAAM,CAAA,CAAK,CACvF,CAKA,SAASoX,2BAEL3e,SAASC,iBAAiB,uEAAuE,EAAEqQ,QAAQ,IACvGqZ,EAAGhnB,iBAAiB,QAAS,SAAS0P,GAClCnR,IAAIqG,EAAOoiB,EAAGpmB,aAAa,MAAM,EAEjCrC,IAAIqd,EAAa/N,kBAAkBsD,IAAI,0BAA0B,EAC5DyK,IAC0B,CAAC,IAAvBhX,EAAK/C,QAAQ,GAAG,EACjB+C,GAAQ,IAERA,GAAQ,IAEZA,GAAQ,+BAAiCgX,EACzCoL,EAAGpe,aAAa,OAAQhE,CAAI,EAEpC,CAAC,CACL,CAAC,CACL,CApH4B,YAAxBvH,SAASkM,WACTmd,2BAA2B,EAE3BxS,2BAA2B7W,SAAU,mBAAoBqpB,0BAA0B,EAoHvFnoB,IAAI0mB,eAAiB,CAGjBC,OAAQ,CAAA,EACR+B,QAAS,CAAA,EACTC,OAAQ,CAAA,EACRC,QAAS,CAAA,EACTC,iBAAkB,CAAA,EAGlBC,KAAM,SAAUnX,GACZ,IAEQ3P,EAFDzD,KAAKooB,SACRpoB,KAAKmqB,QAAU,CAAA,EACX1mB,EAAW,SAAU8S,EAAQpS,EAAM4E,EAAQ4K,GAC3CwU,eAAegC,QAAU,CAAA,EACzBhC,eAAeC,OAAS7R,EACxBhW,SAASyS,cACL,IAAIC,YAAa,8BAA+B,CAC5C2C,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAO4U,qBACRA,qBAEArX,uBAFsB,CAACC,OAAUA,CAAM,EAAG,CAAC3P,SAAYA,EAAUuJ,QAAW,CAAA,CAAI,CAAE,EAK9F,EAEAhC,KAAM,WAEc,SAAZyf,IACAhpB,IAAIipB,EAAS,GAEb,IAAM,IAAMhgB,KAAO1K,KAAK2qB,OACpBD,GAAUhgB,EAAM,IAAM1K,KAAK2qB,OAAOjgB,GAAO,IAE7C,OAAOggB,CACX,CAPAjpB,IAQImpB,EAAa,CACbD,OAAQ,CACJE,UAAW,aACXC,SAAY,QACZ7O,IAAO,IACPQ,KAAQ,IACRG,MAAS,OACTN,OAAU,OACVyO,WAAc,kBACd9oB,QAAW,OACX+oB,kBAAmB,SACnBC,cAAe,QACnB,EACAhd,SAAUwc,CACd,EACIS,EAAW,CACXP,OAAQ,CACJG,SAAY,WACZK,QAAW,OACXJ,WAAc,OACdK,OAAU,6BACVC,gBAAiB,MACjBC,aAAc,qCAClB,EACArd,SAAUwc,CACd,EACIc,EAAW,CACXZ,OAAQ,CACJG,SAAY,WACZC,WAAc,OACdnO,MAAS,OACTN,OAAU,OACV8O,OAAU,6BACVC,gBAAiB,OACjBtf,OAAU,UACVkQ,IAAO,OACPS,MAAS,OACT8O,aAAc,aAClB,EACAvd,SAAUwc,CACd,EACIgB,EAAiB,CACjBd,OAAQ,CACJhlB,QAAW,KACX1D,QAAW,QACX6oB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBzO,MAAS,MACTN,OAAU,OACVL,IAAO,MACPQ,KAAQ,MACRiP,UAAa,eACjB,EACAzd,SAAUwc,CACd,EACIkB,EAAgB,CAChBhB,OAAQ,CACJhlB,QAAW,KACX1D,QAAW,QACX6oB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBzO,MAAS,MACTN,OAAU,OACVL,IAAO,MACPQ,KAAQ,MACRiP,UAAa,gBACjB,EACAzd,SAAUwc,CACd,EACImB,EAAU,CACVjB,OAAQ,CACJkB,SAAY,QAChB,EACA5d,SAAUwc,CACd,EACIqB,EAAsBvrB,SAASoE,cAAe,OAAQ,EAUtDonB,GATJD,EAAoBhgB,aAAc,KAAM,wBAAyB,EACjEggB,EAAoB/b,UAAY,+BAAiC6b,EAAU,IAC3EE,EAAoB/b,WAAa,4BAA8B6a,EAAa,IAC5EkB,EAAoB/b,WAAa,0BAA4Bwb,EAAW,IACxEO,EAAoB/b,WAAa,iCAAmC0b,EAAiB,IACrFK,EAAoB/b,WAAa,gCAAkC4b,EAAgB,IACnFprB,SAAS+J,KAAK1E,OAAQkmB,CAAoB,EAG5BvrB,SAASoE,cAAe,KAAM,GAMxCqnB,GALJD,EAAQjgB,aAAc,KAAM,yBAA0B,EACtDvL,SAAS+J,KAAK1E,OAAQmmB,CAAQ,EAE9BxrB,SAAS+J,KAAKlI,UAAUC,IAAK,wBAAyB,EAE1C9B,SAASoE,cAAe,KAAM,GAKtCsnB,GAJJD,EAAMlgB,aAAc,KAAM,uBAAwB,EAClDkgB,EAAMlgB,aAAc,QAASof,CAAS,EACtCa,EAAQnmB,OAAQomB,CAAM,EAEVzrB,SAASoE,cAAe,KAAM,GAItCgB,GAHJsmB,EAAMngB,aAAc,KAAM,uBAAwB,EAClDkgB,EAAMpmB,OAAQqmB,CAAM,EAEN1rB,SAASoE,cAAe,KAAM,GACvC3E,KAAKooB,QACA8D,EAAW,uBACW,WACJ7Q,KAAKrb,KAAKooB,MAAM,GAAKpoB,KAAKsqB,iBAC9C3kB,EAAQoK,UAAY/P,KAAKooB,OAEzBziB,EAAQoK,UAAY/P,KAAKooB,OAAO9mB,QAAQ4qB,EAAU,qCAAqC,IAG3FvmB,EAAQoK,UAAY,aAEpB/P,KAAKuqB,KAAM,sBAAuB,GAEtC5kB,EAAQmG,aAAc,KAAM,yBAA0B,EACtDkgB,EAAMpmB,OAAQD,CAAQ,EAEtB3F,KAAKoqB,OAAS,CAAA,CAClB,EAEA6B,MAAO,WACH1rB,SAAS+J,KAAKlI,UAAUI,OAAQ,wBAAyB,EACzDjC,SAASya,eAAgB,yBAA0B,EAAExY,OAAO,EAC5DjC,SAASya,eAAgB,wBAAyB,EAAExY,OAAO,EAC3DjC,SAASyS,cACL,IAAIC,YAAa,uBAAwB,CACrC2C,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EA0LA,SAASuW,mBACL1qB,IAAI2qB,EAAkB7rB,SAASC,iBAAiB,gCAAgC,EACnD,EAAzB4rB,EAAgBzqB,QAChByqB,EAAgBvb,QAAQ,IACpB6E,EAAQtT,UAAUI,OAAO,SAAS,CACtC,CAAC,CAET,CA9LAjC,SAAS2C,iBAAiB,QAAS,SAAU0P,GACpCA,CAAAA,EAAEvP,QAA2B,4BAAhBuP,EAAEvP,OAAOgmB,IAAoD,0BAAhBzW,EAAEvP,OAAOgmB,IACpElB,eAAe8D,MAAM,CAE7B,CAAC,EACD1rB,SAAS2C,iBAAiB,8BAA+B,SAAU0P,GAC1DuV,eAAeiC,QAAUjC,eAAeC,SACzC7nB,SAASya,eAAgB,yBAA0B,EAAEjL,UAAYoY,eAAeC,OAExF,CAAC,EAED7nB,SAAS2C,iBAAiB,mBAAoB,WAC1CzB,IAAI4qB,EAAgBjf,KAAAA,EAChBkf,EAA2B,CAAA,EAgB/B,GAdyB,aAApB,OAAOpb,UAA0D,aAA9B,OAAOqb,oBAKd,KAAA,KAHzBF,EADqB,aAApB,OAAOnb,UAA4BA,SAASsb,cAC7Btb,SAASsb,cAGlBH,IACuB,aAA9B,OAAOE,oBACPA,mBAAmBC,gBAEnBH,EAAgBE,mBAAmBC,cACnCF,EAA2B,CAAA,GAI5BD,EAAP,CAKA5qB,IAAIgrB,EAAyB,wCACxBlsB,SAAS+C,cAAc,iDAAiD,IAEzEmpB,EAAyB,8CAE7BhrB,IAEMirB,EAAcnsB,SAASC,iBACzBisB,EAF4B,uFAIH,EAED,IAAvBC,EAAY/qB,SAIjB+qB,EAAY7b,QAAQ,CAAE6E,EAASiX,KAE3B,IAQIC,EAGAC,EAIAC,EAGAC,EAIAC,EAGAC,EAKIC,EA7Bc,aAAlB,OAAOC,SACPzX,EAAQrQ,cAAc/C,UAAUyC,QAAQ,OAAO,EAAI,GAChC,OAAnB2Q,EAAQ1Q,WAKR4nB,EAAYrsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uBAAuB,GAEnD+gB,EAAWtsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAOugB,EAAce,YAAY,EACvDP,EAAS/gB,aAAa,QAAS,2BAA2B,GAEtDghB,EAAiBvsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uBAAuB,GAExDihB,EAAwBxsB,SAASoE,cAAc,GAAG,GAChCmH,aAAa,QAAS,8BAA8B,EAC1EihB,EAAsBnnB,OAAOymB,EAAcgB,QAAQC,UAAU,GAEzDN,EAAwBzsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,mCAAmC,GAE3EmhB,EAA4B1sB,SAASoE,cAAc,MAAM,GACnCiB,OAAOymB,EAAcgB,QAAQE,YAAc,GAAG,EACxEN,EAA0BrnB,OAAOymB,EAAcgB,QAAQG,WAAW,EAE7DlB,KACGY,EAAgB3sB,SAASoE,cAAc,GAAG,GAChCmH,aAAa,OAAQugB,EAAcoB,cAAc,EAC/DP,EAAcphB,aAAa,SAAU,QAAQ,EAC7CohB,EAAcQ,KAAOrB,EAAcgB,QAAQM,oBAC3CV,EAA0BrnB,OAAO,GAAG,EACpCqnB,EAA0BrnB,OAAOsnB,CAAa,GAGlDF,EAAsBpnB,OAAOqnB,CAAyB,EACtDH,EAAelnB,OAAOmnB,EAAuBC,CAAqB,EAClEJ,EAAUhnB,OAAOinB,CAAQ,EACzBnX,EAAQ9P,OAAOgnB,CAAS,EACxBlX,EAAQ9P,OAAOknB,CAAc,EACjC,CAAC,EAEcvsB,SAASC,iBAAiB,wBAAwB,EAE1DqQ,QAAQ,IACXpP,IAAImsB,EAAcxgB,KAAAA,EAmCZygB,GAjCN7tB,KAAKsK,KAAKpH,iBAAiB,QAAS,SAAS0P,GAEY,CAAC,GAAlDA,EAAEvP,OAAOf,UAAUyC,QAAQ,iBAAiB,GACmB,CAAC,GAAhE6N,EAAEvP,OAAOgC,cAAc/C,UAAUyC,QAAQ,iBAAiB,GAE1DonB,iBAAiB,CAEzB,CAAC,EAED2B,EAAM5qB,iBAAiB,QAAS,WAC5B,IAAM2qB,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUM,OAAO,SAAS,CAExC,CAAC,EAEDorB,EAAM5qB,iBAAiB,aAAc,WACjCipB,iBAAiB,EACjB,IAAM0B,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUC,IAAI,SAAS,CAErC,CAAC,EAEDyrB,EAAM5qB,iBAAiB,aAAc,WACjC0qB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAEasrB,EAAMC,oBACpBF,EAAM3qB,iBAAiB,aAAc,WACjC8qB,aAAaJ,CAAW,EACxBC,EAAMzrB,UAAUC,IAAI,SAAS,CACjC,CAAC,EAEDwrB,EAAM3qB,iBAAiB,aAAc,WACjC0qB,EAAcvnB,WAAW,KACjBwnB,EAAMzrB,UAAUqf,SAAS,uBAAuB,GAChDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAGDsrB,EAAM5qB,iBAAiB,WAAY,WAC/B0qB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQ7tB,KAAK+tB,mBACbE,EAAY9nB,OAAOsJ,aAAa,EAElCoe,GAASI,GAAaJ,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACtC,IAAhCwM,EAAUhgB,SAAS,EAAEtM,OAErBksB,EAAMzrB,UAAUI,OAAO,SAAS,GAEhCwrB,aAAaJ,CAAW,EACxBrtB,SAAS2C,iBAAiB,kBAAmB,SAASgrB,IAClD,IAAMD,EAAY9nB,OAAOsJ,aAAa,EAClCwe,GAA6C,IAAhCA,EAAUhgB,SAAS,EAAEtM,SAElCisB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQC,EAAMC,mBAChBF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,EACPjC,SAAS2Y,oBAAoB,kBAAmBgV,CAAiB,EAEzE,CAAC,EAET,EAAG,GAAI,CACX,CAAC,CACL,CAAC,EAlJD,CAmJJ,CAAC,EAcD,IAAMC,gBAAkB5tB,SAASoE,cAAc,KAAK,EA6KpD,SAASypB,qBACL7tB,SAAS+C,cAAc,yBAAyB,EAAE+Y,YAAc,MAChE8R,gBAAgBntB,MAAM0b,MAAQ,QAC9ByR,gBAAgBntB,MAAMqtB,WAAa,OACnC9tB,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAMqtB,WAAa,OACrE9tB,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAM4b,MAAQ,OAChErc,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAMstB,WAAa,OACzE,CAKA,SAASC,oBACL,IAAK9sB,IAAIC,EAAI,EAAGA,EAAInB,SAAS+O,MAAM3N,OAAQD,CAAC,GACxC,GAAkD0L,KAAAA,IAA9C7M,SAAS+O,MAAM5N,GAAG8sB,yBAC4BphB,KAAAA,IAA9C7M,SAAS+O,MAAM5N,GAAG+sB,wBAAuC,CAEzD,IA2CcC,EA3CRC,EAAcpuB,SAAS+O,MAAM5N,GAGnC,GAAKktB,CAAAA,gBAAgBD,CAAW,EAKhC,GAAKE,iBAAiBF,CAAW,EAC7BG,yBAAyBH,EAAajtB,EAAGnB,QAAQ,OAG9C,GAEmC6M,KAAAA,IAAtCuhB,EAAY7X,QAAQiY,eACW,UAA9B,OAAOJ,EAAkB,QACkC,CAAC,IAAxDA,EAAYvb,OAAOrO,QAAQ,sBAAsB,GACvB,UAA9B,OAAO4pB,EAAkB,QAC1BA,EAAYrrB,cAAc,0BAA0B,GAElB,UAA9B,OAAOqrB,EAAkB,QACqB,CAAC,IAA/CA,EAAYvb,OAAOrO,QAAQ,aAAa,GACxC4pB,EAAY7qB,aAAa,kBAAkB,EAG/CkrB,qCAAqCL,EAAajtB,EAAGnB,QAAQ,OAE1D,GAC2B,UAA9B,OAAOouB,EAAkB,SACmB,CAAC,IAA3CA,EAAYvb,OAAOrO,QAAQ,SAAS,GACS,CAAC,IAA5C4pB,EAAYvb,OAAOrO,QAAQ,UAAU,GAC3C,CACEtD,IAAIwtB,EAAMN,EAAYvb,OAAO0M,MAAM,IAAI,GACvCmP,EAAMA,EAAI,GAAGnP,MAAM,GAAG,GACL,GAAG7a,YAAY,IAEnB4C,SAASqnB,SAASjqB,YAAY,KACjCkqB,EAAW5uB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChB+qB,EAASnrB,MAAQ2qB,EAAYvb,OAC7B+b,EAASzf,KAAO,SAChBif,EAAYS,YAAYD,CAAQ,GAE1BT,EAAWnuB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChBsqB,EAAS1qB,MAAQ2qB,EAAYllB,OAC7BilB,EAAShf,KAAO,SAEhBif,EAAYllB,OAAS,OAErBklB,EAAYS,YAAYV,CAAQ,EAEhCC,EAAYvb,OAAS7S,SAASsH,SAEtC,CACJ,CAGJwnB,oBAAoB,EAEpB1R,uBAAuB,CAC3B,CAOA,SAASiR,gBAAgBD,GA0BrBltB,IAAI8U,EAAS,CAAA,EAEb,IAEQoY,EAAYtpB,eACiC,EAA7CspB,EAAYtpB,cAAcjD,UAAUT,QACyB,CAAC,IAA9DgtB,EAAYtpB,cAAcjD,UAAU,GAAG2C,QAAQ,QAAQ,IACvDwR,EAAS,CAAA,GAG8B,OAAvCoY,EAAY7qB,aAAa,QAAQ,GAdd,CACvB,6BAcuB+M,QAAQ,SAASye,GACoC,CAAC,IAAjEX,EAAY7qB,aAAa,QAAQ,EAAEiB,QAAQuqB,CAAe,IAC1D/Y,EAAS,CAAA,EAEjB,CAAC,EAxCc,CACnB,YACA,UACA,2BACA,WAuCe1F,QAAQ,SAAS0e,GAC5B,IAAMpI,EAASwH,EAAY7qB,aAAa,IAAI,EACvCqjB,MAAAA,GAAsF,CAAC,IAAjCA,EAAOpiB,QAAQwqB,CAAW,IACjFhZ,EAAS,CAAA,EAEjB,CAAC,EArCqB,CACtB,cACA,UACA,uBACA,kBACA,iBACA,UACA,oBAgCkB1F,QAAQ,SAAS2e,GAC/B/tB,IAAIguB,EAAa,GAMjB,IAAMC,EAJFD,EADAd,EAAY7qB,aAAa,OAAO,EACnB6qB,EAAY7qB,aAAa,OAAO,EAEhC6rB,kBAAkBhB,EAAaa,CAAc,EAGzDE,MAAAA,GAAgG,CAAC,IAAvCA,EAAU3qB,QAAQyqB,CAAc,IAEvFjZ,EADAoY,CAAAA,EAAY7qB,aAAa,kBAAkB,EAMvD,CAAC,EA1DoB,CACrB,UA2DiB+M,QAAQ,SAAS+e,GAC9B,IAAMC,EAAWlB,EAAY7qB,aAAa,IAAI,EACzC+rB,MAAAA,GAA2F,CAAC,IAArCA,EAAS9qB,QAAQ6qB,CAAa,IACtFrZ,EAAS,CAAA,EAEjB,CAAC,CAGL,CAFE,MAAO3D,GACL7H,QAAQ+kB,MAAM,oCAAqCld,CAAC,CACxD,CAEA,OAAO2D,CACX,CAQA,SAASoZ,kBAAkBhB,EAAaa,GACpC,GAA2B,UAAvB,OAAM,GAA6Bb,EAAYrrB,cAAc,IAAMksB,CAAc,EACjF,OAAOA,CAEf,CAKA,SAASH,sBACL,IAAMU,EAASxvB,SAASyvB,qBAAqB,QAAQ,EAErD,GAAqB,EAAhBD,EAAOpuB,OACR,IAAMF,IAAI+nB,EAAI,EAAGA,EAAIuG,EAAOpuB,OAAQ6nB,CAAC,GACjC,GAAkC,MAA7BuG,EAAOvG,GAAGyG,gBAAf,CAIA,IAAMC,EAAcH,EAAOvG,GAAGyG,gBAAgB3gB,MAC9C,GAA4B,IAAvB4gB,EAAYvuB,OAIjB,IAAMF,IAAI0uB,EAAI,EAAGA,EAAID,EAAYvuB,OAAQwuB,CAAC,GAAK,CAC3C,IAAMxB,EAAcuB,EAAYC,GAC3BvB,gBAAgBD,CAAW,GAGhCG,yBAAyBH,EAAawB,EAAGJ,EAAOvG,GAAGyG,eAAe,CACtE,CAbA,CAgBZ,CAQA,SAASnB,yBAAyBH,EAAayB,EAAUC,GACrD,IAAMC,EAAuB/vB,SAASoE,cAAc,GAAG,EAOjD4rB,GANND,EAAqBhuB,UAAY,wBACjCguB,EAAqBtvB,MAAQ,gBAE7B2tB,EAAYtpB,cAAcmrB,aAAaF,EAAsB3B,CAAW,EAG3DA,EAAY8B,iBACnBC,EAAW/B,EAAY7e,UACvB6gB,EAAehC,EAMfiC,GAHNjC,EAAYtpB,cAAcub,YAAY+N,CAAW,EAG7BpuB,SAASoE,cAAc,KAAK,GAI1CksB,GAHND,EAAY7gB,UAAY2gB,EACxBH,EAAK7qB,MAAMkrB,EAAYE,iBAAiB,EAEpBvwB,SAASoE,cAAc,OAAO,GAClDksB,EAAYzsB,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SAEnB,IAAMqhB,EAAmBV,EAAe/gB,MAAM8gB,GAO1CY,GALJD,EAAiB3B,YAAYyB,CAAW,EACxCE,EAAiBE,UAAYV,EAC7BQ,EAAiBG,kBAAoBP,EAGP,CAAA,GACKvjB,KAAAA,IAA/B2jB,EAAiB3uB,WAES,CAAC,iBAAkB,iBAC3ByO,QAAQ,SAASsgB,GAC3BJ,EAAiB3uB,UAAUqf,SAAS0P,CAAe,IACnDH,EAA0BG,EAElC,CAAC,EAGDC,EAAyB,KACxBJ,EAEII,OADLA,EAAyBL,EAAiBztB,cAAc,uBAAuB,IAE3E8tB,EAAuBluB,iBAAiB,QAAS,SAASpD,GACtDA,EAAM4hB,eAAe,EACrB2P,yBAAyBN,CAAgB,CAC7C,CAAC,EAKTV,EAAe/gB,MAAM8gB,GAAUpP,SAAW,SAASlhB,GAC/CA,EAAM4hB,eAAe,EACrB2P,yBAAyBvxB,EAAMwxB,aAAa,CAChD,CACJ,CAQA,SAAStC,qCAAqCL,EAAayB,EAAUC,GACjE,IAOMjrB,EAWAyrB,EAKAE,EAvBAQ,EAAuB5C,EAAYrrB,cAAc,iBAAiB,EAClEkuB,EAAmB7C,EAAYrrB,cAAc,iBAAiB,EAAEsT,KAAKoK,SAEpEuQ,IAIDnsB,EAASmsB,EAAqBlsB,cAC9BosB,EAAmBF,EAAqBzhB,UAG9CyhB,EAAqB/uB,OAAO,GAGtBouB,EAAcrwB,SAASoE,cAAc,KAAK,GACpCoL,UAAY0hB,EACxBrsB,EAAOgqB,YAAYwB,EAAYE,iBAAiB,GAE1CD,EAActwB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,UAEbqhB,EAAmBV,EAAe/gB,MAAM8gB,IAE7BhB,YAAYyB,CAAW,EACxCE,EAAiBW,YAActsB,EAC/B2rB,EAAiBQ,qBAAuBA,EACxCR,EAAiBS,iBAAmBA,EAEpCnB,EAAe/gB,MAAM8gB,GAAUpP,SAAW,SAASlhB,GAC/CA,EAAM4hB,eAAe,EAGrBiQ,0BAA0B7xB,EAAMwxB,aAAa,EAE7CD,yBAAyBvxB,EAAMwxB,aAAa,CAChD,EACJ,CAMA,SAASK,0BAA0B/a,GAC/B,IAEU9M,EAFJ8nB,EAAgBhb,EAAKtT,cAAc,uBAAuB,EAC3DsuB,IACK9nB,EAAU8nB,EAActuB,cAAc,GAAG,EACzCuuB,EAAaD,EAActuB,cAAc,MAAM,EACjDwG,IAAW+nB,IACkB,GAAxB/nB,EAAQ9I,MAAM8wB,QACfD,EAAW7wB,MAAM+E,QAAU,EAC3B+D,EAAQ9I,MAAM8wB,OAAS,CAAC,EACxBhoB,EAAQ9I,MAAM+E,QAAU,IAExB8rB,EAAW7wB,MAAM+E,QAAU,EAC3B+D,EAAQ9I,MAAM8wB,OAAS,EACvBhoB,EAAQ9I,MAAM+E,QAAU,GAIxC,CAOA,SAASgsB,sCAAsCC,EAAYC,GACvD,IAAMC,EAAeF,EAAWxxB,iBAAiB,iCAAiC,EAClF,IAAM2xB,EAAeF,EAAWzxB,iBAAiB,iCAAiC,EAEV,CAAC,IAArEwxB,EAAWliB,UAAU/K,QAAQ,iCAAiC,GAC9DqtB,sBAAsBJ,CAAU,GAC8B,CAAC,IAA/DA,EAAWliB,UAAU/K,QAAQ,2BAA2B,GACQ,CAAC,IAAjEitB,EAAWliB,UAAU/K,QAAQ,6BAA6B,GACL,CAAC,IAAtDitB,EAAWliB,UAAU/K,QAAQ,kBAAkB,GACkB,CAAC,IAAlEitB,EAAWliB,UAAU/K,QAAQ,8BAA8B,EAE3DmtB,EAAarhB,QAAQ,IACjBshB,EAAathB,QAAQ,IACbwhB,EAAWjuB,OAASkuB,EAAWluB,OACP,aAApBkuB,EAAW5iB,MAA2C,UAApB4iB,EAAW5iB,KAC7C4iB,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWtuB,MAAQwuB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,EAKLH,EAAarhB,QAAQ,IACjBshB,EAAathB,QAAQ,IACbwhB,EAAWviB,YAAcwiB,EAAWxiB,YACZ,aAApBwiB,EAAW5iB,MAA2C,UAApB4iB,EAAW5iB,KAC7C4iB,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWtuB,MAAQwuB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,CACL,CAqBA,SAASI,uBACL,GAAKlyB,SAAS+C,cAAc,uDAAuD,EAAnF,CAIA7B,IAAIC,EAAIiY,YAAY,KAChB,IAAM+Y,EAAenyB,SAASC,iBAAiB,mBAAmB,EAC9DkyB,EAAa/wB,SACbuZ,cAAcxZ,CAAC,EACfgxB,EAAa7hB,QAAQ,CAAC+F,EAAM+V,KACxBgG,gCAAgC/b,EAAM+V,EAAOpsB,QAAQ,CACzD,CAAC,EAET,EAAG,GAAG,CAVN,CAWJ,CAQA,SAASoyB,gCAAgC/b,EAAMwZ,EAAUC,GACrD,IAYIuC,EAZEC,EAAMjc,EAAKtT,cAAc,kCAAkC,EAC5DuvB,IAGLA,EAAIC,SAAW,CAAA,GAETjC,EAActwB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SACnBkH,EAAKwY,YAAYyB,CAAW,GAExB+B,EAAQryB,SAASoE,cAAc,KAAK,GAClC0kB,GAAK,sBACXuJ,EAAM5xB,MAAM4b,MAAQ,OACpBgW,EAAM5xB,MAAMsb,OAAS,OACrBsW,EAAM5xB,MAAM+pB,WAAa,QACzB6H,EAAM5xB,MAAM+E,QAAU,EACtB6sB,EAAM5xB,MAAM8pB,SAAW,WACvB8H,EAAM5xB,MAAMib,IAAM,EAClB2W,EAAM5xB,MAAM+K,OAAS,UACrB6mB,EAAMG,QAAU,SAASngB,GACrBye,yBAAyBza,CAAI,CACjC,EACAic,EAAIhP,WAAW7iB,MAAM8pB,SAAW,WAChC+H,EAAIhP,WAAWuL,YAAYwD,CAAK,EACpC,CAKA,SAASI,yBACLvxB,IAAIwxB,EAAU1yB,SAASC,iBAAiB,QAAQ,EAC3B,EAAjByyB,EAAQtxB,QACRsxB,EAAQpiB,QAAQ,SAASqiB,GACjBA,EAA4C,CAAC,IAA7CA,EAAOC,IAAIpuB,QAAQ,mBAAmB,GACS,CAAC,IAAhDmuB,EAAOC,IAAIpuB,QAAQ,sBAAsB,GACU,CAAC,IAApDmuB,EAAOC,IAAIpuB,QAAQ,0BAA0B,GACD,CAAC,IAA7CmuB,EAAOC,IAAIpuB,QAAQ,mBAAmB,GACtCmuB,EAAO9wB,UAAUqf,SAAS,gBAAgB,GACD,CAAC,IAAxCyR,EAAOC,IAAIpuB,QAAQ,cAAc,GAA2D,CAAC,IAAhDmuB,EAAOC,IAAIpuB,QAAQ,sBAAsB,IAGpF,CAAA,IAAUgM,kBAAkBsD,IAAI,yBAAyB,GACC,EAA1DtD,kBAAkBsD,IAAI,yBAAyB,EAAE1S,QAC5B,KAAA,IAAduxB,EAAO7J,IAC0D,CAAC,IAAzEtY,kBAAkBsD,IAAI,yBAAyB,EAAEtP,QAAQmuB,EAAO7J,KAIpE+J,8BAA8BF,CAAM,CAE5C,CAAC,CAET,CA9oBA3yB,SAAS2C,iBAAiB,mBAAoB,WAC1CirB,gBAAgB7rB,UAAY,6BAC5Bb,IAAI4xB,EAAY,KA2BhB,SAASC,IACL7xB,IAAI8xB,EAAU,CAAC,MAAO,SAClBhd,EAASgd,EAAQvqB,KAAKC,MAAMD,KAAKE,OAAO,EAAIqqB,EAAQ5xB,MAAM,GAE9DpB,SAAS+C,cAAc,0BAA0B,EAAEd,OAAO,EAC1DjC,SAAS+C,cAAc,+BAA+B,EAAEd,OAAO,EAC/DjC,SAAS+C,cAAc,6BAA6B,EAAEtC,MAAMsb,OAAS,OAGrE7a,IAAI+xB,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQnd,GACR,IAAK,MACDxL,QAAQrE,IAAI,KAAK,EAEjB+sB,EAAM,wOACN,MACJ,IAAK,QACD1oB,QAAQrE,IAAI,OAAO,EACnB8sB,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAnzB,SAAS+C,cAAc,yBAAyB,EAAE+Y,YAAcmX,EAC1DG,EAAMpzB,SAASoE,cAAc,KAAK,EACxCgvB,EAAIrxB,UAAY,yBAChBqxB,EAAI5jB;cACE0jB;wDAC0CC;UAEhDvF,gBAAgBiB,YAAYuE,CAAG,CACnC,CA1DApzB,SAAS2C,iBAAiB,qBAAsB,WAC5CirB,gBAAgBntB,MAAMiB,QAAU,QAChCoxB,EAAY,IAAIptB,IACpB,CAAC,EAED1F,SAAS2C,iBAAiB,mBAAoB,WAC1C6H,QAAQrE,IAAI,kBAAkB,CAClC,CAAC,EAEDnG,SAAS2C,iBAAiB,sBAAuB,WACzCmwB,GAAa,IAAIptB,KAASotB,EAZR,IAalBhtB,WAAW,KACPitB,EAAW,CACf,EAfkB,KAeQ,IAAIrtB,KAASotB,EAAU,EAGrDhtB,WAAW,KACPitB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CD/yB,SAAS2C,iBAAiB,qBAAsB,WAC5C6H,QAAQrE,IAAI,oBAAoB,CACpC,CAAC,EAEDqE,QAAQrE,IAAI,kBAAkB,EAG9B,IAAM1F,EAAQT,SAASoE,cAAc,OAAO,EAmEtC6uB,GAlENxyB,EAAMqb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CN9b,SAASqzB,KAAKxE,YAAYpuB,CAAK,EAG/BmtB,gBAAgBntB,MAAM6yB;;;;;;;;;;;;;;;;;MAoBRtzB,SAASoE,cAAc,KAAK,GASpCmvB,GARNN,EAAMlxB,UAAY,yBAClBkxB,EAAMxyB,MAAM6yB;;MAGZL,EAAMnX,YAAc,cACpB8R,gBAAgBiB,YAAYoE,CAAK,EAGlBjzB,SAASoE,cAAc,KAAK,GAQrCovB,GAPND,EAAOxxB,UAAY,0BAGnB6rB,gBAAgBiB,YAAY0E,CAAM,EAClCvzB,SAAS+J,KAAK8kB,YAAYjB,eAAe,EAGrB5tB,SAASoE,cAAc,KAAK,GAChDovB,EAAYzxB,UAAY,+BACxByxB,EAAY/yB,MAAM6yB;;MAGlBE,EAAY1X,YAAc,gBAC1B8R,gBAAgBiB,YAAY2E,CAAW,CAC3C,CAAC,EA0YDhjB,kBAAkBC,IAAI,0BAA2B,EAAE,EACnD7K,OAAOjD,iBAAiB,OAAQ,WACrB,CAACgO,SAAS8iB,kCAIjB3tB,WAAW,WACPkoB,kBAAkB,EAClB0F,yBAAyB,EACzBC,4BAA4B,EAC5BlB,uBAAuB,CAC3B,EAAG,GAAI,EAEPP,qBAAqB,EACzB,CAAC,EAoFDhxB,IAAI0yB,4BAKJ,SAASf,8BAA8BF,GACnCzxB,IAAImxB,EAAQryB,SAASoE,cAAc,KAAK,EACxCiuB,EAAM5xB,MAAM4b,MAAQ,OACpBgW,EAAM5xB,MAAMsb,OAAS,OACrBsW,EAAM5xB,MAAM+pB,WAAa,QACzB6H,EAAM5xB,MAAM+E,QAAU,EACtB6sB,EAAM5xB,MAAM8pB,SAAW,WACvB8H,EAAM5xB,MAAMib,IAAM,EAClB2W,EAAMG,QAAU,SAASngB,GACrB,GAAoCxF,KAAAA,IAAhC+mB,4BAA2C,CAC3C1yB,IAAI2yB,EAAaxhB,EAAE0e,cAEf+C,GADJD,EAAWpzB,MAAM+E,QAAU,GACXxF,SAASoE,cAAc,KAAK,GAC5C0vB,EAAU/xB,UAAY,yBACtB8xB,EAAWhF,YAAYiF,CAAS,EAChC5yB,IAAI6yB,EAAmB,GACnB/zB,SAAS+C,cAAc,uCAAuC,IAC9DgxB,EAAmB/zB,SAAS+C,cAAc,uCAAuC,EAAEU,OASvFmP,sBANW,CACPC,OAAU,sCACVwP,0BAA6BvB,gBAAgB,EAC7C4C,4BAA+BqQ,CACnC,EAII,CACI5qB,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GAEc,EAD7B4d,4BAA8B,CAAA,KAC1B5d,EAAOzN,MAAMmf,QACb1nB,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,SAASqZ,GACrEA,EAAGrG,WAAWrhB,OAAO,CACzB,CAAC,GAEDjC,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,IAC5DqZ,EAAGrG,WAAW7iB,MAAMub,MAAQ,QAC5B2N,EAAGrG,WAAW9T,WAAawG,EAAOzN,MAAMof,OAC5C,CAAC,EACD3nB,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,IAC5DqZ,EAAG1nB,OAAO,CACd,CAAC,EAET,CACJ,CACJ,CACJ,CACJ,EACA0wB,EAAOrP,WAAW7iB,MAAM8pB,SAAW,WACnCoI,EAAOrP,WAAWuL,YAAYwD,CAAK,EACnCnxB,IAAIwxB,EAAUliB,kBAAkBsD,IAAI,yBAAyB,EACzD,CAAA,IAAU4e,IACVA,EAAU,IAEW,KAAA,IAAdC,EAAO7J,KACd4J,EAAQryB,KAAKsyB,EAAO7J,EAAE,EACtBtY,kBAAkBC,IAAI,0BAA2BiiB,CAAO,EAEhE,CAKA,SAASiB,8BACLzyB,IAAI8yB,EAAWh0B,SAASya,eAAe,4BAA4B,EAC/DuZ,GACAC,2BAA2BD,CAAQ,CAE3C,CAMA,SAASC,2BAA2BD,GAChC9yB,IAAIgzB,EAAgBF,EAAS/zB,iBAAiB,0BAA0B,EACpEk0B,EAAeH,EAAS/zB,iBAAiB,kCAAkC,EAC/Ei0B,EAAc5jB,QAAQ,IAClBqZ,EAAGpe,aAAa,2BAA4B,MAAM,EAClDoe,EAAGhnB,iBAAiB,QAAS,IACzBpD,EAAM4hB,eAAe,CACzB,CAAC,CACL,CAAC,EACDgT,EAAa7jB,QAAQ,IACjBqZ,EAAGhnB,iBAAiB,QAAS,IACzBpD,EAAM4hB,eAAe,EACrB5hB,EAAMyD,gBAAgB,EACtBoxB,YAAYzK,CAAE,CAClB,CAAC,CACL,CAAC,CACL,CAMA,SAAS0K,4BAA4BC,GACjCA,EAASxvB,cAAcyG,aAAa,2BAA4B,OAAO,EACvE+oB,EAASxvB,cAAcyvB,MAAM,CACjC,CAOA,SAASC,gCAAgCF,EAAUruB,GAC/C/E,IAKQuzB,EALJ3vB,EAAgBwvB,EAASxvB,cACiC,SAA1DA,EAAcvB,aAAa,0BAA0B,GACrDuB,EAAcyG,aAAa,2BAA4B,MAAM,EAE5DvL,SAAS+C,cAAc,mBAAmB,KACvC0xB,EAAaz0B,SAASoE,cAAc,KAAK,GAClCrC,UAAY,mBACvB0yB,EAAWh0B,MAAM+pB,WAAa,MAC9BiK,EAAWh0B,MAAMub,MAAQ,QACzByY,EAAWh0B,MAAMmqB,QAAU,MAC3B6J,EAAWjlB,UAAYvJ,EACvBnB,EAAc4vB,sBAAsB,cAAeD,CAAU,EAErE,CAMA,SAASL,YAAY9zB,GAMjBsS,sBALW,CACPC,OAAU,2BACVwP,0BAA6BriB,SAAS20B,kBAAkB,2BAA2B,EAAE,GAAGlxB,KAC5F,EAII,CACI0F,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GACc,CAAA,IAAzBA,EAAOzN,MAAMmf,QACb2M,4BAA4B/zB,CAAI,EAEhCk0B,gCAAgCl0B,EAAM0V,EAAOzN,MAAMof,OAAO,CAElE,CACJ,CACJ,CACJ,CAOA,SAAS2G,iBAAiBsG,GACtB,IAAM5L,EAAuC,UAA1B,OAAO4L,EAAc,OAAgBA,EAAQ/hB,OAAS,GACnE+T,EAAwC,OAA/BgO,EAAQrxB,aAAa,IAAI,EAAaqxB,EAAQrxB,aAAa,IAAI,EAAI,GAC5EsxB,EAA6C,UAA7B,OAAOD,EAAiB,UAAgBA,EAAQ7yB,UAAY,GAElF,MACI,CAAA,EACiD,CAAC,IAA9CinB,EAAWxkB,QAAQ,oBAAoB,GACD,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACM,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GAEDqI,KAAAA,IAAjC+nB,EAAQE,WAAWjzB,WACjB+yB,EAAQE,WAAWjzB,UAAUqf,SAAS,eAAe,GAChB,CAAC,IAA1C8H,EAAWxkB,QAAQ,gBAAgB,GACQ,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACA,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACY,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACQ,CAAC,IAA9CwkB,EAAWxkB,QAAQ,oBAAoB,GACJ,CAAC,IAApCwkB,EAAWxkB,QAAQ,UAAU,GACU,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACE,CAAC,IAApCwkB,EAAWxkB,QAAQ,UAAU,GACS,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACM,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACK,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACW,CAAC,IAA3CwkB,EAAWxkB,QAAQ,iBAAiB,GACH,CAAC,IAAlCwkB,EAAWxkB,QAAQ,QAAQ,GAA8C,CAAC,IAAnCoiB,EAAOpiB,QAAQ,aAAa,GACpB,CAAC,IAAhDoiB,EAAOpiB,QAAQ,0BAA0B,GACF,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACW,CAAC,IAA7CoiB,EAAOpiB,QAAQ,uBAAuB,GAMD,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACO,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GAChCqtB,sBAAsB+C,CAAO,GACa,CAAC,IAA3C5L,EAAWxkB,QAAQ,iBAAiB,GACA,CAAC,IAArCwkB,EAAWxkB,QAAQ,WAAW,GACa,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACa,CAAC,IAAnDwkB,EAAWxkB,QAAQ,yBAAyB,GAED,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACE,CAAC,IAApCqwB,EAAcrwB,QAAQ,OAAO,GAGPqI,KAAAA,IAAtB+nB,EAAQ/yB,WACR+yB,EAAQ/yB,UAAUqf,SAAS,sBAAsB,GAErD6T,iBAAiBH,EAAS,UAAU,EAM5C,CAOA,SAAS/C,sBAAsB+C,GAC3B1zB,IAAI8U,EAAS,CAAA,EACb,IAAMgf,EAAwBh1B,SAAS+C,cAAc,+BAA+B,EAUpF,OAFIiT,EANmB,UAAnB,OAAO4e,GAAoC,OAAZA,GACL,OAA1BI,GACAA,EAAsB5f,aAAa,mBAAmB,GACM,KAA5D4f,EAAsBzxB,aAAa,mBAAmB,GACuB,OAA7EyxB,EAAsBjyB,cAAc,mCAAmC,EAE9D6xB,IAAYI,EAAsBjyB,cAAc,mCAAmC,EAEzFiT,CACX,CAQA,SAAS8a,yBAAyBza,GAE9B,IAAM+J,EAAgB,GACtBA,EAAc,GAAKE,6BAA6BjK,CAAI,EACpDsK,gCAAiCP,CAAc,EAE/C,IAAMxc,EAAO,CACT8f,4BAA+BlT,kBAAkBsD,IAAI,0BAA0B,CACnF,EACImhB,EAAQ5e,EAAKjX,UAGjB61B,EAFQr1B,MAAMC,UAAUC,MAAMC,KAAKk1B,CAAK,GAElC3kB,QAAS,SAAUhQ,EAAMsvB,GACR,KAAdtvB,EAAKuD,KACND,EAAK,SAAWgsB,GAAKtvB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAEDmP,sBACIhP,EACA,CACIuF,MAAO,CAAA,EACPjG,SAAU,SAAU8S,EAAQpS,EAAM4E,EAAQ4K,GAEtCge,0BAA0B/a,CAAI,EAE9B,IAAM6e,EACF7e,EAAKjB,aAAa,QAAQ,GACyB,CAAC,IAApDiB,EAAK9S,aAAa,QAAQ,EAAEiB,QAAQ,SAAS,EAEjD,GAAsBqI,KAAAA,IAAjBmJ,EAAOzN,OAAuCsE,KAAAA,IAAhBmJ,EAAOpS,MACpBiJ,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAAE,CAACyN,EAAOzN,MAAMmf,QACjD,CAEE,IAAK,IAAMiC,KAAMtT,EAAKpW,iBAAiB,oCAAoC,EACvE0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,2CAA2C,EAC9E0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,yCAAyC,EAC5E0pB,EAAG1nB,OAAO,EAId,GAAuB4K,KAAAA,IAAnBwJ,EAAKxU,WAA2BwU,EAAKxU,UAAUqf,SAAS,cAAc,EAUtE,OATMmR,EAAQryB,SAASya,eAAe,qBAAqB,IAEvD4X,EAAMpwB,OAAO,EAGjB,MADMqwB,EAAMjc,EAAKtT,cAAc,kCAAkC,KAE7DuvB,EAAIC,SAAW,CAAA,EACfD,EAAIiC,MAAM,IAMlB,GAAoC1nB,KAAAA,IAA/BwJ,EAAKE,QAAQiY,cAA8B,CAC5CttB,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAMvD,OALAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAA5CnsB,KACAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAGA,GAAIle,EAAKjB,aAAa,QAAQ,GACuC,CAAC,IAAjEiB,EAAK9S,aAAa,QAAQ,EAAEiB,QAAQ,sBAAsB,EAC7D,CACEtD,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAOvD,OANAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAC5C3a,EAAKoK,SAAWpK,EAAK4a,iBADrBpsB,KAEAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAGA,GAAIW,EAAoB,CACpBh0B,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAOvD,OANAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAC5C3a,EAAKoK,SAAWpK,EAAK4a,iBADrBpsB,KAEAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAEA,IAmBW5K,EAIAA,EAvBLyL,EAAU/e,EAEV2Z,GADN3Z,EAAKvR,cAAcub,YAAYhK,CAAI,EACtBA,EAAKqa,WACZN,EAAe/Z,EAAKsa,kBAC1BzvB,IAAIm0B,EAAoB,CAAA,EAExB7D,sCAAsC4D,EAAShF,CAAY,EAGvDA,GAC2B,UAA3B,OAAOA,EAAatH,IACkB,CAAC,IAAvCsH,EAAatH,GAAGtkB,QAAQ,QAAQ,IAEhC6wB,EAAoB,CAAA,GAGxBrF,EAAK7qB,MAAOirB,CAAa,EAGzB,IAAWzG,KAAMyG,EAAanwB,iBAAiB,oCAAoC,EAC/E0pB,EAAG1nB,OAAO,EAGd,IAAW0nB,KAAMyG,EAAanwB,iBAAiB,2CAA2C,EACtF0pB,EAAG1nB,OAAO,EAIdf,IAAIo0B,EAAalF,EAAanwB,iBAAiB,qBAAqB,EACpE,GAA2B,IAAtBq1B,EAAWl0B,OAOZ,OANAk0B,EAAW,GAAGf,MAAM,EAApBe,KACID,GACAvvB,WAAW,WACPkoB,kBAAkB,CACtB,EAAG,IAAI,GAMf,GAA2B,KAD3BsH,EAAalF,EAAanwB,iBAAiB,oBAAoB,GAC/CmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAMxB,GAA2B,KAD3Be,EAAalF,EAAanwB,iBAAiB,+BAA+B,GAC1DmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAIxB,GAA2B,KAD3Be,EAAalF,EAAanwB,iBAAiB,4BAA4B,GACvDmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAMG,KAD3Be,EAAalF,EAAanwB,iBAAiB,oCAAoC,GAC/DmB,QACZk0B,EAAW,GAAGf,MAAM,CAE5B,EACsB1nB,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAACyN,EAAOzN,MAAMmf,SAC5B7a,KAAAA,IAAhBmJ,EAAOpS,MAA8CiJ,KAAAA,IAAxBmJ,EAAOpS,KAAKyC,WAE1C6X,oBAAoBlI,CAAM,EAEtBkf,IACApvB,WAAW,WACP9F,SAASsH,SAASiuB,OAAO,CAC7B,EAAG,GAAI,CAGnB,CACJ,CAAC,CACT,CAKA,SAAS7B,2BAGL8B,gCAFcx1B,SAASyvB,qBAAqB,MAAM,CAEb,EAFrC,IAIMD,EAASxvB,SAASyvB,qBAAqB,QAAQ,EACrD,GAAqB,EAAhBD,EAAOpuB,OACR,IAAMF,IAAI+nB,EAAI,EAAGA,EAAIuG,EAAOpuB,OAAQ6nB,CAAC,GACjC,GAAkC,MAA7BuG,EAAOvG,GAAGyG,gBAAf,CAIA,IAAMC,EAAcH,EAAOvG,GAAGyG,gBAAgB3gB,MAE9C,GAA4B,IAAvB4gB,EAAYvuB,OACb,OAGJo0B,gCAAgC7F,EAAaH,EAAOvG,GAAGyG,eAAe,CARtE,CAWZ,CAQA,SAAS8F,gCAAgCzmB,EAAO+gB,EAAiB9vB,UAC7D,IACWqW,EAYAuQ,EAbL6O,EAAgB,GACtB,IAAWpf,KAAQtH,EAAO,CACtB,IAAM2mB,EAAarf,EAAK9S,aAAa,IAAI,EACrCmyB,GAA+C,CAAC,IAAlCA,EAAWlxB,QAAQ,QAAQ,GACzCixB,EAAcp1B,KAAKq1B,CAAU,EAE7BA,GAAmD,CAAC,IAAtCA,EAAWlxB,QAAQ,YAAY,GACzBqI,KAAAA,IAAnBwJ,EAAKxU,WAA2BwU,EAAKxU,UAAUqf,SAAS,sBAAsB,GAE/EuU,EAAcp1B,KAAKq1B,CAAU,CAErC,CAEA,IAAW9O,KAAU6O,EAAe,CAChC,IAAMpf,EAAOyZ,EAAerV,eAAemM,CAAM,EACjDvQ,EAAKsf,6BAA+Btf,EAAKoK,SACzCpK,EAAKoK,SAAWmV,+BACpB,CACJ,CAMA,SAASA,gCAAgCvf,GACrCA,EAAK8K,eAAe,EACpB9K,EAAKwf,yBAAyB,EAC9B,IAAMC,EAAYzf,EAClBA,EAAOA,EAAKvT,OAEZ,IAAMwtB,EAActwB,SAASoE,cAAc,OAAO,EAO5Cgc,GANNkQ,EAAYzsB,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SACnBkH,EAAKwY,YAAYyB,CAAW,EAGN,IACtBlQ,EAAc,GAAKE,6BAA6BjK,CAAI,EACpDsK,gCAAgCP,CAAa,EAC7C/J,EAAKhR,OAAO6iB,+BAA+B,QAAQ,CAAC,EAEpD,IAAMtkB,EAAO,GACTqxB,EAAQ5e,EAAKjX,UAGjB61B,EAFQr1B,MAAMC,UAAUC,MAAMC,KAAKk1B,CAAK,GAElC3kB,QAAS,SAAUhQ,EAAMsvB,GACR,KAAdtvB,EAAKuD,KACND,EAAK,SAAWgsB,GAAKtvB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAEDmP,sBACIhP,EACA,CACIuF,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GACf,GAAsBnJ,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAAE,CAACyN,EAAOzN,MAAMmf,QAAU,CACzDrR,EAAKoK,SAAW,KAGhB,IAAK,IAAMkJ,KAAMtT,EAAKpW,iBAAiB,oCAAoC,EACvE0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,2CAA2C,EAC9E0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,yCAAyC,EAC5E0pB,EAAG1nB,OAAO,EAIVoU,EAAKsf,wCAAwC3U,WACzC+U,EAAUjwB,WAAW,WACrBuQ,EAAKsf,6BAA6B51B,KAAKsW,EAAMyf,CAAS,CAC1D,EAAG,GAAG,EACNrI,aAAasI,CAAO,GAJxB,IAOMT,EAAajf,EAAKtT,cAAc,sBAAsB,EAC5D,GAAIuyB,EAEA,OADAA,KAAAA,EAAWf,MAAM,CAGzB,CAEqB1nB,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAACyN,EAAOzN,MAAMmf,SAC5CxJ,oBAAoBlI,CAAM,CAElC,CACJ,CAAC,CACT,CAOA,SAASic,SAAStI,GACd,OAAIA,EAAG1H,SAAW0H,EAAGqM,SACVrM,EAAG1H,QACLle,OAAO,GAAYkyB,EAAOpmB,QAAQ,EAClCqmB,IAAI,GAAYD,EAAOxyB,KAAK,EACd,aAAZkmB,EAAGxa,MAAmC,UAAZwa,EAAGxa,KAC7Bwa,EAAGqI,SAAuB,KAE1BrI,EAAGlmB,KAElB,CASA,SAASsxB,iBAAiBH,EAASuB,GAC/Bj1B,IAAI2D,EAAS+vB,EAAQ9vB,cACrB,KAAOD,GAAQ,CACX,GAAIA,EAAOhD,UAAUqf,SAASiV,CAAY,EACtC,MAAO,CAAA,EAEXtxB,EAASA,EAAOC,aACpB,CACA,MAAO,CAAA,CACX,CAKA,SAASsxB,qCACL,IAAMC,EAAoB,CAAC,gBAAiB,gBAAiB,mBACvDC,EAAmBt2B,SAASoE,cAAc,KAAK,EACrDkyB,EAAiBz0B,UAAY,6BAC7B,IAAKX,IAAIC,EAAI,EAAGA,EAAIk1B,EAAkBj1B,OAAQD,CAAC,GAAI,CAC/C,IAAMo1B,EAAyBv2B,SAASoE,cAAc,MAAM,EAC5DmyB,EAAuB10B,UAAY,aAAew0B,EAAkBl1B,GACpEo1B,EAAuBC,UAAY,IACnCF,EAAiBjxB,OAAOkxB,CAAsB,CAClD,CACA,OAAOD,CACX,CAKA,SAASlV,0BAA0B7hB,EAAQ,CAAA,GACvC2B,IAAIu1B,EAAc,CAAA,EACdC,EAAgB,GAChBC,EAAe,GACK,aAApB,OAAOhmB,UACPlR,KAAKkZ,oBAAoB,QAASyI,yBAAyB,EAE3DqV,EAAch3B,KAEdkR,SAASimB,yBAA2B,CAAA,EACpCF,EAAgB/lB,SAASkmB,aACzBF,EAAehmB,SAASkP,mBACQ,aAAzB,OAAOiX,gBACdJ,EAAgBI,cAAcxqB,YAC9BqqB,EAAeG,cAAcC,kBAIjC/2B,SAAS+J,KAAKlI,UAAUC,IAAI,kBAAkB,EAE9CZ,IAQQ81B,EAQAC,EAOAC,EAWAC,EAlCJC,EAAep3B,SAASya,eAAe,aAAa,EACnD2c,GAiDDA,EAAa7rB,aAAa,QAAS,kBAAkB,EACpB,aAA7B,OAAOtD,mBAAqCA,kBAAkBovB,2BAC9Dr3B,SAASya,eAAe,kBAAkB,EAAEjL,UAAYvH,kBAAkBovB,2BAE1Er3B,SAASya,eAAe,kBAAkB,EAAEjL,UAAYsnB,cAAcO,8BAnDtEC,EAAet3B,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uCAAuC,EAC1E+rB,EAAa/rB,aAAa,KAAM,aAAa,GAGzCyrB,EAAqBh3B,SAASoE,cAAc,MAAM,GACnCvC,UAAY,uCAC3B01B,EAAcv3B,SAASoE,cAAc,GAAG,GAChCoyB,UAAYE,EACxBa,EAAYhsB,aAAa,QAAS,mCAAmC,EACrEyrB,EAAmB3xB,OAAOkyB,CAAW,GAGjCN,EAAmBj3B,SAASoE,cAAc,KAAK,GAClCmH,aAAa,KAAM,kBAAkB,EACtD0rB,EAAiB1rB,aAAa,QAAS,qCAAqC,EAC5E0rB,EAAiBx2B,MAAMub,MAAQ,SAI3Bkb,EAAmBl3B,SAASoE,cAAc,GAAG,GAChC0kB,GAAK,4CACW,aAA7B,OAAO7gB,mBAAqCA,kBAAkBovB,2BAC9DH,EAAiBV,UAAYvuB,kBAAkBovB,2BAE/CH,EAAiBV,UAAYM,cAAcO,2BAE/CH,EAAiB3rB,aAAa,QAAS,qCAAqC,GAIxE4rB,EAAoBn3B,SAASoE,cAAc,GAAG,GAChC0kB,GAAK,6CACU,aAA7B,OAAO7gB,mBAAqCA,kBAAkBuvB,0BAC9DL,EAAkBX,UAAYvuB,kBAAkBuvB,0BAEhDL,EAAkBX,UAAYM,cAAcU,0BAIhDP,EAAiB5xB,OAAO6xB,CAAgB,EACxCD,EAAiB5xB,OAAO8xB,CAAiB,EACzCG,EAAajyB,OAAO2xB,CAAkB,EACtCM,EAAajyB,OAAO4xB,CAAgB,EACpCK,EAAajyB,OAAO+wB,mCAAmC,CAAC,EACxDp2B,SAAS+J,KAAK1E,OAAOiyB,CAAY,GAUrCG,yBAAyBl4B,EAAOo3B,EAAcF,CAAW,CAC7D,CAOA,SAASgB,yBAAyBl4B,EAAOsgB,EAAmB4W,GACxD,GAAIl3B,GAASk3B,EAAa,CAEtB,IACI7yB,EAAO,CACPgS,sBAFyBxD,wBAAwB,EAGjDyD,SAAU7V,SAASsH,SAASC,KAC5BuO,SAAU9V,SAAS8V,SACnB4hB,cAAe,EACnB,EACIC,EAA0B,GAC9B,IAAKz2B,IAAIC,EAAI,EAAGA,EAAI0e,EAAkBze,OAAQD,CAAC,GAAI,CAGN,KAAA,IAA9B0e,EAAkB1e,GAAGoG,MACqB,IAAjDsY,EAAkB1e,GAAGoG,KAAK/C,QAAQ,SAAS,IAE3CjF,EAAM4hB,eAAe,EACrBxQ,SAASimB,yBAA2B,CAAA,GAIxC11B,IAAI02B,EAAe53B,SAASoE,cAAc,KAAK,EAC/CwzB,EAAarsB,aAAa,QAAS,eAAe,EAClDhD,MAAMsX,EAAkB1e,EAAE,EAAEkE,OAAOuyB,CAAY,EAG/CD,EAAwBx2B,GAAK0e,EAAkB1e,GAAGoV,QAAQshB,cAC9D,CAGAj0B,EAAK8zB,cAAgBxwB,KAAKC,UAAUwwB,CAAuB,EAGhB,SAAtC1vB,kBAAkBG,gBACnBuK,sBACI,qBACA,CACI/O,KAAMA,EACNsF,OAAQ,OACRhG,SAAU,SAAS8S,GAEfjG,YAAY,6BAA8BY,SAASmnB,oBAAqB,EAAE,EAC1EC,8BAA8B/hB,EAAQ6J,EAAmB4W,CAAW,CACxE,EACA/sB,gBAAiB,SAASsuB,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,GAIAp0B,EAAKiP,OAAS,qBACdD,sBACIhP,EACA,CACI6I,QAAS,CAAA,EACTvJ,SAAU,SAAS8S,GACfxL,QAAQrE,IAAI,QAAQ,EACpBqE,QAAQrE,IAAI6P,CAAM,EAGlBjG,YAAY,6BAA8BY,SAASmnB,oBAAqB,EAAE,EAC1EC,8BAA8B/hB,EAAQ6J,EAAmB4W,CAAW,CACxE,EACA/sB,gBAAiB,SAASsuB,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,EAER,KAAO,CACH,IAAMrB,EAAe9W,EAAkBtJ,QAAQshB,eAC3Cj0B,EAAO,CACP8zB,cAAexwB,KAAKC,UAAU,CAACgxB,EAAGxB,CAAY,CAAC,CACnD,EAGIiB,EAAe53B,SAASoE,cAAc,KAAK,EAC/CwzB,EAAarsB,aAAa,QAAS,eAAe,EAClDsU,EAAkBgP,YAAY+I,CAAY,EAE1C3N,qBACI,CACIpX,OAAU,qBACV6kB,cAAiB9zB,EAAK8zB,aAC1B,EACA,CACIx0B,SAAY,SAAS8S,GACjB+hB,8BAA8B/hB,EAAQ6J,EAAmB,CAAA,CAAK,CAClE,EACApT,QAAW,CAAA,CACf,CACJ,CACJ,CACJ,CAOA,SAASsrB,8BAA8B/hB,EAAQ6J,EAAmB4W,EAAc,CAAA,GACxEzgB,EAAOoiB,SAAyC,CAAA,IAA9BpiB,EAAOpS,KAAK,GAAGy0B,WAEjCvyB,WAAW,WAEP5E,IAAIosB,EAAQttB,SAASya,eAAe,aAAa,EACjD,GAAc,OAAV6S,EAAgB,CAChBpsB,IAAI6Z,EAAQ,GACZ,GAAI0b,EAAa,CACbv1B,IAAIo3B,EACJtiB,EAAOpS,KAAK0M,QAAQ,IACZioB,EAAIC,gBAAkB/B,EAAYlgB,QAAQshB,iBAC1CS,EAAoBC,EAE5B,CAAC,EAEDxd,EAAQud,EAAkBG,cAAclZ,MAAM,MAAM,EAAE,EAC1D,MACIxE,EAAQ/E,EAAOpS,KAAK,GAAG60B,cAG3Bv3B,IAAIw3B,EAAYpL,EAAMvqB,cAAc,4CAA4C,EAE5E41B,EAAkB34B,SAASoE,cAAc,GAAG,EAqB5CkS,GApBJqiB,EAAgBptB,aAAa,QAAS,wCAAwC,EAC9EotB,EAAgBnC,UAAYzb,EACK,aAA7B,OAAO9S,mBAAqCA,kBAAkB2wB,yBAC9DD,EAAgB1F,MAAQhrB,kBAAkB2wB,yBAE1CD,EAAgB1F,MAAQ6D,cAAc8B,yBAGtCF,IACiC,aAA7B,OAAOzwB,mBAAqCA,kBAAkB4wB,wBAC9DH,EAAUlpB,UAAYvH,kBAAkB4wB,wBACpC,SAAWF,EAAgBppB,UAE/BmpB,EAAUlpB,UAAYsnB,cAAc+B,wBAChC,SAAWF,EAAgBppB,UAGnCmpB,EAAUntB,aAAa,QAAS,sBAAsB,GAG5C+hB,EAAMvqB,cAAc,6BAA6B,GAK3D+1B,GAJAxiB,GACAA,EAAQrU,OAAO,EAGFqrB,EAAMvqB,cAAc,6CAA6C,GAK9Eg2B,GAJAD,GACAA,EAAW72B,OAAO,EAGFjC,SAASoE,cAAc,MAAM,GACjD20B,EAAcl3B,UAAY,sDACrB7B,SAAS+C,cAAc,oCAAoC,IACxDuG,EAAStJ,SAASoE,cAAc,QAAQ,EACX,aAA7B,OAAO6D,mBAAqCA,kBAAkB+wB,gBAC9D1vB,EAAOktB,UAAYvuB,kBAAkB+wB,gBAErC1vB,EAAOktB,UAAYM,cAAckC,gBAErC1vB,EAAOzH,UAAY,oCACnByH,EAAO3G,iBAAiB,QAAS,WAC7B3C,SAAS+J,KAAKlI,UAAUI,OAAO,kBAAkB,EACjDqrB,EAAM/hB,aAAa,QAAS,cAAc,EAC1C0tB,iBAAiBpZ,EAAmB7J,CAAM,EAElB,aAApB,OAAOrF,UAA4BA,SAASimB,0BAA4BH,GACxEA,EAAYlC,MAAM,CAE1B,CAAC,EACDwE,EAAc1zB,OAAOiE,CAAM,EAC3BgkB,EAAMjoB,OAAO0zB,CAAa,EAElC,CACJ,EAAG,GAAI,EAEHtC,EACIzgB,EAAOoiB,SACPH,kBAAkB,EACe,aAA7B,OAAOhwB,mBAAqCA,kBAAkBixB,iBAC9DhB,oBAAoBjwB,kBAAkBixB,iBAAmB,KAAOljB,EAAOpS,KAAK,GAAG+jB,OAAO,EAEtFuQ,oBAAoBpB,cAAcoC,iBAAmB,KAAOljB,EAAOpS,KAAK,GAAG+jB,OAAO,IAGtFsQ,kBAAkB,EACe,aAA7B,OAAOhwB,mBAAqCA,kBAAkBkxB,wBAC9DjB,oBAAoBjwB,kBAAkBkxB,wBAA0B,KAAOnjB,EAAOzN,MAAMof,OAAO,EAE3FuQ,oBAAoBpB,cAAcqC,wBAA0B,KAAOnjB,EAAOpS,KAAK,GAAG+jB,OAAO,GAIjGnd,QAAQrE,IAAI,SAAU6P,CAAM,CAGxC,CAKA,SAASiiB,oBACqC,KAAA,IAA/BtnB,SAASkP,mBAChBlP,SAASkP,kBAAkBvP,QAAQ,SAAS6E,GACxCA,EAAQxS,iBAAiB,QAASye,yBAAyB,CAC/D,CAAC,CAET,CAMA,SAAS8W,oBAAoBvQ,GAClBA,EAAAA,IAC8B,aAA7B,OAAO1f,mBAAqCA,kBAAkBmxB,uBACpDnxB,kBAEA6uB,eAFkBsC,uBAMpCl4B,IAAIosB,EAAQttB,SAASya,eAAe,aAAa,EACjDvZ,IAAIm4B,EAAYr5B,SAASya,eAAe,kBAAkB,EAC5C,OAAV6S,IACAttB,SAAS+J,KAAKlI,UAAUI,OAAO,kBAAkB,EAChB,aAA7B,OAAOgG,mBAAqCA,kBAAkBqxB,uBAC9DD,EAAU7C,UAAYvuB,kBAAkBqxB,uBAAyB,KAAO3R,EAExE0R,EAAU7C,UAAYM,cAAcwC,uBAAyB,KAAO3R,EAExE7hB,WAAW,WACPwnB,EAAM/hB,aAAa,QAAS,cAAc,CAC9C,EAAG,GAAI,EAEf,CAOA,SAAS0tB,iBAAiBM,EAAcC,GACpC,GAA0B,EAAtBD,EAAan4B,OACb,IAAKF,IAAIC,EAAI,EAAGA,EAAIo4B,EAAan4B,OAAQD,CAAC,GAAI,CAE1CD,IAAIo3B,EAOJ,GANAkB,EAAe51B,KAAK0M,QAAQ,IACpBioB,EAAIC,gBAAkBe,EAAap4B,GAAGoV,QAAQshB,iBAC9CS,EAAoBC,EAE5B,CAAC,EAEoC,CAAA,IAAjCD,EAAkBD,WAClB,OAGJ,GACoC,KAAA,IAAzBkB,EAAap4B,GAAGoG,MAEyB,IAA5CgyB,EAAap4B,GAAGoG,KAAK/C,QAAQ,SAAS,GACG,IAAzC+0B,EAAap4B,GAAGoG,KAAK/C,QAAQ,MAAM,EA6BvC+0B,EAAap4B,GAAGU,UAAUC,IAAI,SAAS,EAEvCgE,WAAW,KACP2zB,2BAA2BnB,EAAmBiB,EAAap4B,EAAE,CACjE,EAAG,GAAI,MA/BT,CACED,IAAIw4B,EACJ,GAAgD,IAA5CH,EAAap4B,GAAGoG,KAAK/C,QAAQ,SAAS,EACtCk1B,EAAiB,cACd,CAAA,GAA6C,IAAzCH,EAAap4B,GAAGoG,KAAK/C,QAAQ,MAAM,EAG1C,SAFAk1B,EAAiB,MAGrB,CACAx4B,IAAIy1B,EAAe4C,EAAap4B,GAAGoG,KAAKxG,QAAQ24B,EAAgB,EAAE,EAC9DC,EAAqBJ,EAAap4B,GAAGqO,UACzC+pB,EAAap4B,GAAGqO,UAAYmqB,EAAmB54B,QAC3C41B,EACA2B,EAAkBG,aACtB,EACAc,EAAap4B,GAAGoG,KAAOmyB,EAAiBpB,EAAkBG,cAE1Dc,EAAap4B,GAAGlB,iBAAiB,0BAA0B,EAAEqQ,QAAQ,IACjEpP,IAAI04B,EAA+B,GACnCJ,EAAe51B,KAAK0M,QAAQ,IACpBioB,EAAIC,gBAAkB7O,EAAGpT,QAAQshB,iBACjC+B,EAA+BrB,EAAIE,cAE3C,CAAC,EACD9O,EAAGna,UAAYoqB,CACnB,CAAC,CACL,CAQAL,EAAap4B,GAAGwX,oBAAoB,QAASyI,yBAAyB,CAC1E,KACG,CACHlgB,IAAIo3B,EAAoBkB,EAAe51B,KAAK,GAC5C21B,EAAa13B,UAAUC,IAAI,SAAS,EAEpCgE,WAAW,KACP2zB,2BAA2BnB,EAAmBiB,CAAY,CAC9D,EAAG,GAAI,EACPA,EAAa5gB,oBAAoB,QAASyI,yBAAyB,CACvE,CACJ,CAMA,SAASqY,2BAA2B1tB,EAAU8tB,GAC1CA,EAActuB,aAAa,QAAS,EAAE,EACtCsuB,EAAcjuB,gBAAgB,OAAO,EACrCkuB,mBAAmBD,EAAe9tB,EAAS0sB,aAAa,CAC5D,CAMA,SAASqB,mBAAmBh3B,EAAQiY,GAChCjY,EAAO0M,UAAY1M,EAAO0M,UAAUzO,QAAQ,kDAAmDga,EAAQ,IAAI,CAC/G"} \ No newline at end of file diff --git a/js/apbct-public-bundle_full-protection.min.js.map b/js/apbct-public-bundle_full-protection.min.js.map index 0d8106f58..1f926ac51 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_int-protection.min.js.map b/js/apbct-public-bundle_int-protection.min.js.map index 00eda2b5d..aa2562bc2 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // red cross\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file diff --git a/js/src/apbct-public--8--browser-check.js b/js/src/apbct-public--8--browser-check.js index 94375b3b7..0c1eb2e50 100644 --- a/js/src/apbct-public--8--browser-check.js +++ b/js/src/apbct-public--8--browser-check.js @@ -26,6 +26,9 @@ document.addEventListener('DOMContentLoaded', function() { }, timeoutToShowResult); }); + /** + * Show result + */ function showResult() { let results = ['bot', 'human']; let result = results[Math.floor(Math.random() * results.length)]; @@ -39,17 +42,18 @@ document.addEventListener('DOMContentLoaded', function() { let svg = ''; let arrowAction = ''; switch (result) { - case 'bot': - console.log('bot'); - // red cross - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; + case 'bot': + console.log('bot'); + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; } document.querySelector('.ct-browser-check-title').textContent = title; const dev = document.createElement('div'); @@ -162,6 +166,11 @@ document.addEventListener('DOMContentLoaded', function() { loaderContainer.appendChild(description); }); +/** + * Hide browser check + * + */ +// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle.js b/js/src/apbct-public-bundle.js index e5f07fe23..2b76c2e68 100644 --- a/js/src/apbct-public-bundle.js +++ b/js/src/apbct-public-bundle.js @@ -4280,6 +4280,9 @@ document.addEventListener('DOMContentLoaded', function() { }, timeoutToShowResult); }); + /** + * Show result + */ function showResult() { let results = ['bot', 'human']; let result = results[Math.floor(Math.random() * results.length)]; @@ -4293,17 +4296,18 @@ document.addEventListener('DOMContentLoaded', function() { let svg = ''; let arrowAction = ''; switch (result) { - case 'bot': - console.log('bot'); - // red cross - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; + case 'bot': + console.log('bot'); + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; } document.querySelector('.ct-browser-check-title').textContent = title; const dev = document.createElement('div'); @@ -4416,6 +4420,11 @@ document.addEventListener('DOMContentLoaded', function() { loaderContainer.appendChild(description); }); +/** + * Hide browser check + * + */ +// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle_ext-protection.js b/js/src/apbct-public-bundle_ext-protection.js index 8b04579ec..133f573a1 100644 --- a/js/src/apbct-public-bundle_ext-protection.js +++ b/js/src/apbct-public-bundle_ext-protection.js @@ -4280,6 +4280,9 @@ document.addEventListener('DOMContentLoaded', function() { }, timeoutToShowResult); }); + /** + * Show result + */ function showResult() { let results = ['bot', 'human']; let result = results[Math.floor(Math.random() * results.length)]; @@ -4293,17 +4296,18 @@ document.addEventListener('DOMContentLoaded', function() { let svg = ''; let arrowAction = ''; switch (result) { - case 'bot': - console.log('bot'); - // red cross - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; + case 'bot': + console.log('bot'); + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; } document.querySelector('.ct-browser-check-title').textContent = title; const dev = document.createElement('div'); @@ -4416,6 +4420,11 @@ document.addEventListener('DOMContentLoaded', function() { loaderContainer.appendChild(description); }); +/** + * Hide browser check + * + */ +// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle_full-protection.js b/js/src/apbct-public-bundle_full-protection.js index f237744a8..46966f57a 100644 --- a/js/src/apbct-public-bundle_full-protection.js +++ b/js/src/apbct-public-bundle_full-protection.js @@ -5879,6 +5879,9 @@ document.addEventListener('DOMContentLoaded', function() { }, timeoutToShowResult); }); + /** + * Show result + */ function showResult() { let results = ['bot', 'human']; let result = results[Math.floor(Math.random() * results.length)]; @@ -5892,17 +5895,18 @@ document.addEventListener('DOMContentLoaded', function() { let svg = ''; let arrowAction = ''; switch (result) { - case 'bot': - console.log('bot'); - // red cross - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; + case 'bot': + console.log('bot'); + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; } document.querySelector('.ct-browser-check-title').textContent = title; const dev = document.createElement('div'); @@ -6015,6 +6019,11 @@ document.addEventListener('DOMContentLoaded', function() { loaderContainer.appendChild(description); }); +/** + * Hide browser check + * + */ +// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle_int-protection.js b/js/src/apbct-public-bundle_int-protection.js index ab0cdeb97..40b119248 100644 --- a/js/src/apbct-public-bundle_int-protection.js +++ b/js/src/apbct-public-bundle_int-protection.js @@ -4721,6 +4721,9 @@ document.addEventListener('DOMContentLoaded', function() { }, timeoutToShowResult); }); + /** + * Show result + */ function showResult() { let results = ['bot', 'human']; let result = results[Math.floor(Math.random() * results.length)]; @@ -4734,17 +4737,18 @@ document.addEventListener('DOMContentLoaded', function() { let svg = ''; let arrowAction = ''; switch (result) { - case 'bot': - console.log('bot'); - // red cross - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; + case 'bot': + console.log('bot'); + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + break; + case 'human': + console.log('human'); + title = 'The Real Person'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svg = ''; + arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; + break; } document.querySelector('.ct-browser-check-title').textContent = title; const dev = document.createElement('div'); @@ -4857,6 +4861,11 @@ document.addEventListener('DOMContentLoaded', function() { loaderContainer.appendChild(description); }); +/** + * Hide browser check + * + */ +// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; From 200428d15a24b912b60fcebd01c14d0e060bac03 Mon Sep 17 00:00:00 2001 From: svfcode Date: Mon, 5 May 2025 15:06:25 +0300 Subject: [PATCH 3/5] fix eslint --- js/apbct-public--8--browser-check.min.js.map | 2 +- js/apbct-public-bundle_ext-protection.min.js.map | 2 +- js/apbct-public-bundle_full-protection.min.js.map | 2 +- js/apbct-public-bundle_int-protection.min.js.map | 2 +- js/src/apbct-public--8--browser-check.js | 7 +++---- js/src/apbct-public-bundle.js | 7 +++---- js/src/apbct-public-bundle_ext-protection.js | 7 +++---- js/src/apbct-public-bundle_full-protection.js | 7 +++---- js/src/apbct-public-bundle_int-protection.js | 7 +++---- 9 files changed, 19 insertions(+), 24 deletions(-) diff --git a/js/apbct-public--8--browser-check.min.js.map b/js/apbct-public--8--browser-check.min.js.map index 2e58d1096..7449bf71c 100644 --- a/js/apbct-public--8--browser-check.min.js.map +++ b/js/apbct-public--8--browser-check.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EA6KpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAlLAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KA2BhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACR,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CA1DA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file +{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EA4KpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAjLAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KA2BhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACR,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CA1DA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file diff --git a/js/apbct-public-bundle_ext-protection.min.js.map b/js/apbct-public-bundle_ext-protection.min.js.map index 5f33c382e..90bb30071 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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":"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,IAAME,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,IAbKL,IAC3BM,EAAsBnE,SAASoE,cAAcP,CAAI,EAAErE,YAChD,CAAE6E,QAAS,CAAC,CAACC,YAAaC,oBAAoBC,QAAQL,CAAmB,CAAE,IAW/BJ,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,KACVC,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,KACVC,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,GAwBNC,GAvBAH,GAAOA,EAAII,QACXF,EAAIG,IAAM,CACNL,IAAOA,EAAII,QACXE,KAAUN,EAAIO,UAA0B,CAAA,EACxCC,GAAQR,EAAIS,YAAgCC,QAAkB,CAAA,EAC9DC,IAASX,EAAIY,cAAoCC,UAAsB,CAAA,EACvEC,WAAgBd,EAAIe,OAAoB,CAAA,EACxCC,MAAWf,CAAAA,CAAAA,GAAMgB,KAAKC,UAAUjB,CAAG,EACnCkB,SAAcC,OAAgB,CAAA,CAClC,GAEAlB,EAAIG,IAAM,CACNL,IAAOA,CACX,EAEMC,IACFC,EAAIG,IAAIC,KAAOL,IAIvBC,EAAID,IAAMN,OAAO0B,SAASC,KAC1BpB,EAAIqB,UAAY5B,OAAO6B,UAAUD,UAEhB,gBACjBtG,IAAIwG,EAAWC,aAAaC,QAAQxB,CAAU,EAC7B,OAAbsB,IAAmBA,EAAW,MAClCA,EAAWR,KAAKW,MAAMH,CAAQ,EAC9B,IAAKxG,IAAIC,EAAI,EAAGA,EAAIuG,EAAStG,OAAQD,CAAC,GAClC,GAAIuG,EAASvG,GAAGmF,IAAIL,MAAQE,EAAIG,IAAIL,IAChC,OAIRyB,EAASrH,KAAK8F,CAAG,EACjBwB,aAAaG,QAAQ1B,EAAYc,KAAKC,UAAUO,CAAQ,CAAC,CAC7D,CAoBA,SAASK,oBACL7G,IAAI8G,EAAe,GAEnB,OACIC,kBAAkBC,eAAe,cAAc,GACL,UAA1C,OAAOD,kBAAkBE,cACe,EAAxCF,kBAAkBE,aAAa/G,OAExB6G,kBAAkBE,cAIa,eAAtCF,kBAAkBG,iBAClBH,kBAAkBC,eAAe,aAAa,GACL,UAAzC,OAAOD,kBAAkBI,aACc,EAAvCJ,kBAAkBI,YAAYjH,SAE9B4G,EAAeC,kBAAkBI,aAQjCL,EALsC,SAAtCC,kBAAkBG,iBAClBH,kBAAkBC,eAAe,aAAa,GACL,UAAzC,OAAOD,kBAAkBK,aACc,EAAvCL,kBAAkBK,YAAYlH,OAEf6G,kBAAkBK,YAG9BN,EACX,CASA,SAASO,MAAMC,GACX,OAAO,IAAIxJ,WACNU,OAAO8I,CAAM,CACtB,CA3DwC,IAApCC,KAAKC,MAAsB,IAAhBD,KAAKE,OAAO,CAAO,IAC9B/C,OAAOgD,QAAU,SAASC,EAAW3C,GACjChF,IAAI4H,EAAc,CAAC,QAAS,YAC5B5H,IAAIE,EAAS0H,EAAY1H,OACzB,KAAOA,CAAM,IACsC,CAAC,IAA5CyH,EAAUrE,QAAQsE,EAAY1H,EAAO,GACrC4E,eAAe6C,EAAW3C,CAAG,EAIrC,MAAO,CAAA,CACX,SAqDE6C,SACFC,IAAM,IAAIC,eAGVC,OAAS,OACThD,IAAM,GACNiD,MAAQ,CAAA,EACRC,KAAO,KACPC,SAAW,KACXzF,KAAO,GAGP0F,OAAS,KACTC,QAAU,KACVC,YAAc,KACdC,QAAUhK,KACVyD,SAAW,KACXwG,gBAAkB,KAElBC,aAAe,OACfC,QAAU,GACVC,QAAU,KAEVC,+BAAiC,CAC7B,MACA,QAGJC,KAAO,KACPC,UAAY,EACZC,YAAc,GAGdzK,YAAY0K,GAER,IAAMhJ,IAAIiJ,KAAOD,EACa,KAAA,IAAdzK,KAAK0K,KACb1K,KAAK0K,GAAOD,EAAWC,IAa/B,GARA1K,KAAK2K,QAAQ,EAGRxJ,OAAOyJ,KAAK5K,KAAKmE,IAAI,EAAExC,SACxB3B,KAAK6K,yBAAyB7K,KAAKmE,IAAI,EACvCnE,KAAK8K,YAAY,GAGhB,CAAE9K,KAAKyG,IAGR,OAFAsE,QAAQrE,IAAI,2BACR,iCAAkC,mCAAmC,EAClE,CAAA,EAIX1G,KAAKuJ,IAAIyB,KAAKhL,KAAKyJ,OAAQzJ,KAAKyG,IAAKzG,KAAK0J,MAAO1J,KAAK2J,KAAM3J,KAAK4J,QAAQ,EACzE5J,KAAKiL,WAAW,EAEhBjL,KAAKuJ,IAAIW,aAAelK,KAAKkK,aAC7BlK,KAAKuJ,IAAIa,QAAUpK,KAAKoK,QAIxBpK,KAAKuJ,IAAI2B,mBAAqB,WACtBlL,KAAKmL,eAAe,EACpBnL,KAAKoL,yBAAyBX,CAAU,EAG5CzK,KAAKqL,mBAAmB,CAC5B,EAAEjI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAI+B,OAAS,WACdtL,KAAKuL,OAAO,CAChB,EAAEnI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIiC,WAAa,SAAS1L,GAC3BE,KAAKyL,WAAW3L,CAAK,CACzB,EAAEsD,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIJ,QAAU,WACfnJ,KAAK0L,QAAQ,CACjB,EAAEtI,KAAKpD,IAAI,EAEXA,KAAKuJ,IAAIoC,UAAY,WACjB3L,KAAK4L,UAAU,CACnB,EAAExI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIsC,KAAK7L,KAAKsK,IAAI,CAC3B,CAKAK,UAEQ3K,KAAK6J,SACL7J,KAAK6J,OAAOiC,aAAa,WAAY,UAAU,EAC/C9L,KAAK6J,OAAO7I,MAAM+K,OAAS,eAI3B/L,KAAK8J,UACL9J,KAAK8J,QAAQ9I,MAAMiB,QAAU,SAErC,CAKA+J,WACIhM,KAAKuK,UAAYvK,KAAKuJ,IAAI0C,OAC1BjM,KAAKwK,YAAcxK,KAAKuJ,IAAI2C,WAGxBlM,KAAK6J,SACL7J,KAAK6J,OAAOsC,gBAAgB,UAAU,EACtCnM,KAAK6J,OAAO7I,MAAM+K,OAAS,QAI3B/L,KAAK8J,UACL9J,KAAK8J,QAAQ9I,MAAMiB,QAAU,QAG5BjC,KAAK+J,aACN/J,KAAK+J,YAAYzD,QAAQ,MAAM,CAEvC,CAKA+E,qBACuC,OAA/BrL,KAAKoM,uBAAwE,YAAtC,OAAOpM,KAAKoM,uBACnDpM,KAAKoM,sBAAsB,CAEnC,CAKAX,WAAW3L,GACkB,OAArBE,KAAKqM,aAAoD,YAA5B,OAAOrM,KAAKqM,aACzCrM,KAAKqM,YAAY,CAEzB,CAKAX,UACIX,QAAQrE,IAAI,OAAO,EAEnB1G,KAAKgM,SAAS,EACdhM,KAAK4H,MACD5H,KAAKuK,UACLvK,KAAKwK,WACT,EAE6B,OAAzBxK,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgBjK,KAAKwK,WAAW,CAE7C,CAKAoB,YACI5L,KAAKgM,SAAS,EACdhM,KAAK4H,MACD,EACA,SACJ,EAE6B,OAAzB5H,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgB,SAAS,CAEtC,CAKAsB,SAGI,GAFAvL,KAAKgM,SAAS,EAEY,SAAtBhM,KAAKkK,aAA0B,CAC/B,GAA0B,OAAtBlK,KAAKuJ,IAAI+C,SAET,OADAtM,KAAK4H,MAAM5H,KAAKuK,UAAWvK,KAAKwK,YAAa,aAAa,EACnD,CAAA,EACJ,GAAwC,KAAA,IAA5BxK,KAAKuJ,IAAI+C,SAAS1E,MAEjC,OADA5H,KAAK4H,MAAM5H,KAAKuK,UAAWvK,KAAKwK,YAAaxK,KAAKuJ,IAAI+C,SAAS1E,KAAK,EAC7D,CAAA,CAEf,CAEsB,OAAlB5H,KAAKyD,UAA8C,YAAzB,OAAOzD,KAAKyD,UACtCzD,KAAKyD,SAASnD,KAAKN,KAAKgK,QAAShK,KAAKuJ,IAAI+C,SAAUtM,KAAKmE,IAAI,CAErE,CAMAgH,iBACI1J,IAAI8K,EAAa,CAAA,EACbC,EAAa,CAAA,EAYjB,OAV2B,GAAvBxM,KAAKuJ,IAAIkD,aACTF,EACiC,UAA7B,OAAOvM,KAAKuJ,IAAI+C,UAA+C,OAAtBtM,KAAKuJ,IAAI+C,UAClDtM,KAAKuJ,IAAI+C,SAAS7D,eAAe,MAAM,GACvCzI,KAAKuJ,IAAI+C,SAASnI,KAAKsE,eAAe,QAAQ,GACZ,MAAlCzI,KAAKuJ,IAAI+C,SAASnI,KAAK8H,OAE3BO,EAAmC,OAAtBxM,KAAKuJ,IAAI+C,UAAyC,MAApBtM,KAAKuJ,IAAI0C,QAGjDM,GAAcC,CACzB,CAMApB,yBAAyBsB,GACrBjL,IAAIkL,EAAY,GAmBhB,IAKI5D,EApBA2D,EAAqBjE,eAAe,SAAS,GAC7CiE,EAAqBvC,QAAQ1B,eAAe,YAAY,IAExDkE,EAAYD,EAA8B,QAAE,eAY7B,MAJfC,EAHAD,EAAqBjE,eAAe,MAAM,GAC1CiE,EAAqBvI,KAAKsE,eAAe,aAAa,EAE1CiE,EAA2B,KAAe,YAIrDC,MAKD5D,EAAS,CACbU,OAAgB,MADF,GAEPtF,KAAO,CACVyI,wBAA2B,oBAC3BC,YAAe,WACfC,WAAcH,EACdI,uBAA0BL,CAC9B,EACA3D,EAAOiE,QAAU,CAAA,EACjBjE,EAAOtC,IAAM+B,kBAAkByE,SAE/BlE,EAAOtF,SAAW,YAAYR,GAE1BxB,IAAIyL,EAAmBjK,EAAK,GAC5BxB,IAAI0L,EAAmB,CAAA,GAGnBA,EADYC,KAAAA,IAAZnK,EAAK,IAAoBA,EAAK,GAAGwF,eAAe,wBAAwB,EACrDxF,EAAK,GAAG8J,uBAE3BI,IAAoBD,EAAiBzE,eAAe,SAAS,IAC7DD,kBAAkBE,aAAewE,EAAiBG,QACR,SAAtC7E,kBAAkBG,iBAClB,IAAIpJ,WAAYuD,KAAKqK,CAAgB,GAErC,IAAI5N,WAAYoD,KAAKwK,CAAgB,EAGjD,EAEA,IAAI7D,SAASP,CAAM,EACvB,CAOAnB,MAAM0F,EAAUpB,EAAYqB,GACxB9L,IAAI+L,EAAc,GAEE,YAAftB,EACDsB,GAAe,0BACM,MAAbF,EACY,gBAAfpB,EACDsB,GAAe,6DAEfA,GAAe,6BAA+BtB,EAAa,IAC7B,KAAA,IAAlBqB,IACRC,GAAe,2BAA6BD,IAIpDC,GADoB,MAAbF,EACQ,yBAEA,4BAA8BA,EAGjDtN,KAAKyN,YAAaD,CAAY,EAED,OAAzBxN,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgBjK,KAAKwK,WAAW,CAE7C,CAKAiD,YAAYC,GACR3C,QAAQrE,IAAK,qBAAuBgH,EAAU,cAAe,cAAe,CAChF,CAKAzC,aAEI,IAAMxJ,IAAIkM,KAAc3N,KAAKmK,QACgB,KAAA,IAA7BnK,KAAKmK,QAAQwD,IACrB3N,KAAKuJ,IAAIqE,iBAAiBD,EAAY3N,KAAKmK,QAAQwD,EAAW,CAG1E,CAKA7C,cAEI,MAAK,CAAC9K,KAAKqK,+BAA+BtF,QAAS/E,KAAKyJ,MAAO,EACpDzJ,KAAK6N,iBAAiB,EAItB7N,KAAK8N,kBAAkB,CAEtC,CAKAD,mBACIpM,IAAIsM,EAAiB,IAAIC,gBAAgBhO,KAAKmE,IAAI,EAAE8J,SAAS,EACzDC,EAAelO,KAAKyG,IAAIhC,MAAM,8BAA8B,EAAI,IAAM,IAG1E,OAFAzE,KAAKyG,KAAOyH,EAAeH,EAEpB/N,KAAKyG,GAChB,CAKAqH,oBAEI,IAAKrM,IAAI0M,KADTnO,KAAKsK,KAAO,IAAI8D,SACIpO,KAAKmE,KACjBhD,OAAOC,OAAOpB,KAAKmE,KAAMgK,CAAO,GAChCnO,KAAKsK,KAAK1E,OACNuI,EAC8B,UAA9B,OAAOnO,KAAKmE,KAAKgK,GACb1G,KAAKC,UAAU1H,KAAKmE,KAAKgK,EAAQ,EACjCnO,KAAKmE,KAAKgK,EAClB,EAIR,OAAOnO,KAAKsK,IAChB,CAUAO,yBAAyBwD,GACrB,GAAuB,UAAlB,OAAOA,EACR,IAAK5M,IAAI6M,KAAaD,EAAQ,CAC1B,IAWYE,EAXRpN,OAAOC,OAAOiN,EAAQC,CAAS,IAEG,UAA7B,OAAOD,EAAOC,KACfD,EAAOC,GAAatO,KAAK6K,yBAAyBwD,EAAOC,EAAU,GAKtC,UAA7B,OAAOD,EAAOC,KACiC,OAA/CD,EAAOC,GAAW7J,MAAM,iBAAiB,GAGb,UAAvB,OADD8J,EAAc9G,KAAKW,MAAMiG,EAAOC,EAAU,KAE1CD,EAAOC,GAAaC,EAIpC,CAGJ,OAAOF,CACX,CACJ,OAEMxL,kBAAkByG,SAEpBvJ,eAAekD,IACXA,EAAOA,EAAK,IACPkB,KAAKyE,YAAcN,kBAAkB,EAC1CkG,MAAMvL,CAAI,CACd,CACJ,OAEMF,kBAAkBuG,SACpBmF,qBAAuBjG,kBAAkBkG,UAAY,yBACrDC,MAAQ,GAGR5O,eAAekD,GACXA,EAAOA,EAAK,GACZ,IAAM2L,EAAQtG,kBAAkB,EAChCrF,EAAKwD,IAAM1D,UAAU0L,cAAgBxL,EAAK0L,MAC1C1L,EAAKkH,QAAU,CACX0E,aAAcD,CAClB,EACAJ,MAAMvL,CAAI,CACd,CACJ,CAGK9B,OAAOf,UAAUgB,QAClBD,OAAO2N,eAAe3N,OAAOf,UAAW,SAAU,CAC9C4D,MAAO,SAAS+K,GACZ,OAAO5N,OAAOf,UAAUqI,eAAenI,KAAKN,KAAM+O,CAAQ,CAC9D,EACAC,WAAY,CAAA,EACZC,aAAc,CAAA,EACdC,SAAU,CAAA,CACd,CAAC,QAQCC,4BACFC,YAAc7O,SAAS+C,cAAc,MAAM,EAC3C+L,gBAAkB9O,SAAS+O,MAI3BvP,cACIC,KAAKuP,aAAa,CACtB,CAKAA,eACIvP,KAAKoP,YAAYlM,iBAAiB,QAAS,IACvClD,KAAKwP,oBAAoB1P,EAAO,WAAW,CAC/C,CAAC,EAEDE,KAAKoP,YAAYlM,iBAAiB,UAAW,IAErB,SADC3C,SAASkP,aAAa,EAAEC,KAAKzB,SAAS,GAEvDjO,KAAK2P,YAAY,CAEzB,CAAC,EAED3P,KAAKoP,YAAYlM,iBAAiB,YAAa,IAC3ClD,KAAKwP,oBAAoB1P,EAAO,oBAAoB,CACxD,CAAC,CACL,CAOA0P,oBAAoB1P,EAAO8P,GACvBnO,IAAIoO,EACJ,IAAKpO,IAAIC,EAAI,EAAGA,EAAI1B,KAAKqP,gBAAgB1N,OAAQD,CAAC,GAK1CmO,EAHgC,EAAhC/P,EAAMuD,OAAOyM,UAAUnO,QACoB,EAA3C3B,KAAKqP,gBAAgB3N,GAAGqO,UAAUpO,OAEpB3B,KAAKqP,gBAAgB3N,GAAGqO,UAAUhL,QAAQjF,EAAMuD,OAAOyM,SAAS,EAEhE,CAAC,EAIvB,OAAQF,GACR,IAAK,YACGC,EAAc,GACd7P,KAAKgQ,UAAU,EAEnB,MACJ,IAAK,qBACiB,CAAC,EAAfH,GACA7P,KAAKiQ,mBAAmB,CAKhC,CACJ,CAKAD,YACQzP,SAAS2P,6BACL3P,SAAS2P,6BAA6BC,OACtC5P,SAAS2P,6BAA6BC,MAAM,GAE5C5P,SAAS2P,6BAA6BC,OAAS,EAKvD5P,SAAS2P,6BAA+B,CAACC,OAAQ,CAAC,CACtD,CAKAR,cACQpP,SAAS2P,6BACL3P,SAAS2P,6BAA6BE,SACtC7P,SAAS2P,6BAA6BE,QAAQ,GAE9C7P,SAAS2P,6BAA6BE,SAAW,EAKzD7P,SAAS2P,6BAA+B,CAACE,SAAU,CAAC,CACxD,CAKAH,qBACS1P,SAAS2P,+BACV3P,SAAS2P,6BAA+B,IAEvC3P,SAAS2P,6BAA6BG,2BACvC9P,SAAS2P,6BAA6BG,yBAA2B,CAAA,GAGrE9P,SAAS2P,6BAA6BG,yBAA2B,CAAA,CACrE,CACJ,CAQA,SAASC,YAAaC,EAASvM,EAAOwM,GAClC/O,IAAIgP,EAA8B,CAC9B,kBACA,gBACA,0BACA,2BACA,2BACA,yBACA,8BAGAC,EAAU,CAAA,EAUd,GARwB,UAAnB,OAAOH,IACRG,EAAsB,oBAAZH,EACY,UAAjB,OAAOvM,GAAuC,UAAjB,OAAOA,IACrCuM,EAAU,CAAC,CAACA,EAASvM,EAAOwM,MAKU,SAAzChI,kBAAkBmI,mBAAgC,CACnDlP,IAAImP,EAAsB,GAC1BL,EAAQM,QAAS,SAASC,GAC+B,CAAC,IAAlDL,EAA4B1L,QAAQ+L,EAAK,EAAE,EAC3CF,EAAoBhQ,KAAKkQ,CAAI,EAE7BC,kBAAkBC,IAAIF,EAAK,GAAIA,EAAK,EAAE,CAE9C,CAAC,EAGiC,EAA7BF,EAAoBjP,QACrBsP,uBAAuBL,CAAmB,EAIzCM,SAASC,mBAAqB,CAACT,EAEhCO,uBAAuBV,EAAS,CAACa,gBAAiB,CAAA,CAAI,CAAC,EAEvDC,oCAAoC,CAI5C,KAAqD,WAAzC7I,kBAAkBmI,oBAErBO,SAASC,mBAAqB,CAACT,GAEhCO,uBAAuBV,EAAS,CAACa,gBAAiB,CAAA,CAAI,CAAC,EAE3Db,EAAQM,QAAS,SAASC,GACtB,IAAMQ,EAA8B,KAAA,IAAZR,EAAK,GAAqB,WAAaN,EAAU,KAAO,GAC5Ee,EAAiC,WAAtB1J,SAAS2J,SAAwB,WAAa,GAC7DjR,SAASkR,OAASjJ,kBAAkBkJ,aAChCZ,EAAK,GACL,IACAa,mBAAmBb,EAAK,EAAE,EAC1B,KACAQ,EACA,uBACAC,CACR,CAAC,GAGgD,gBAAzC/I,kBAAkBmI,oBAAyCD,GACnEO,uBAAuBV,CAAO,CAEtC,CAGA,SAASqB,gCACLnQ,IAAIoQ,EAAuE,EAAtDtR,SAASC,iBAAiB,iBAAiB,EAAEmB,OAC9DmQ,EAAwG,EAAtEvR,SAASC,iBAAiB,iCAAiC,EAAEmB,OAC/FoQ,EAAiF,EAAhExR,SAASC,iBAAiB,2BAA2B,EAAEmB,OACxEqQ,EAAkG,EAA5EzR,SAASC,iBAAiB,uCAAuC,EAAEmB,OACzFsQ,EAAkF,EAAjE1R,SAASC,iBAAiB,4BAA4B,EAAEmB,OACzEuQ,EAAkG,EAAxE3R,SAASC,iBAAiB,mCAAmC,EAAEmB,OACzFwQ,EAAqG,EAA1E5R,SAASC,iBAAiB,qCAAqC,EAAEmB,OAC5FyQ,EAA0F,EAAvE7R,SAASC,iBAAiB,kCAAkC,EAAEmB,OACjF0Q,EAAyF,EAA5E9R,SAASC,iBAAiB,uCAAuC,EAAEmB,OAChF2Q,EAAuF,EAA9D/R,SAASC,iBAAiB,yBAAyB,EAAEmB,OAC9E4Q,EAA4E,EAAhEhS,SAASC,iBAAiB,2BAA2B,EAAEmB,OACnE6Q,EAAgG,EAA7EjS,SAASC,iBAAiB,wCAAwC,EAAEmB,OAC3FuP,SAASC,kBAAoBY,GACzBF,GACAG,GACAF,GACAG,GACAC,GACAC,GACAC,GACAE,GACAD,GACAE,GACAC,EAEJnM,WAAW,WACP,IACQoM,EADHvB,SAASC,oBACNsB,EAA2F,EAA5ElS,SAASC,iBAAiB,uCAAuC,EAAEmB,OACtFuP,SAASC,kBAAoBsB,EAErC,EAAG,GAAI,CACX,CAGA,SAASxB,uBAAuBV,EAASxH,GACI,YAArC,OAAO,wBAEH5I,MAAMuS,QAAQnC,CAAO,IACrBA,EAAUoC,wBAAwBpC,CAAO,GAG7CxF,QAAQrE,IAAI,sDAAsD,EAGtE,IACI6J,EAAU9I,KAAKW,MAAMmI,CAAO,CAIhC,CAHE,MAAOqC,GAEL,OADA7H,KAAAA,QAAQrE,IAAI,iCAAmCkM,CAAC,CAEpD,CAEA,IAAMnP,EAAWsF,GAAUA,EAAOtF,UAAY,KACxCwG,EAAkBlB,GAAUA,EAAOkB,iBAAmB,KAEvDlB,GAAUA,EAAOqI,kBAClBb,EAAQsC,wBAA0B,CAAA,GAIK,SAAtCrK,kBAAkBG,iBAEoB,UAAnC,OAAO4H,EAAQuC,iBAC4B,CAAC,IAA5CvC,EAAQuC,gBAAgB/N,QAAQ,KAAK,IAErCwL,EAAQuC,gBAAkBC,mBAAmBxC,EAAQuC,eAAe,GAExEvS,SAASyS,cAAc,IAAIC,YAAY,oBAAoB,CAAC,EAC5DC,sBACI,eACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACoM,QAASA,CAAO,EACvB9M,SAAUA,EACVwG,gBAAiBA,CACrB,CACJ,EACA1J,SAASyS,cAAc,IAAIC,YAAY,qBAAqB,CAAC,GAEf,eAAtCzK,kBAAkBG,iBAC1BwK,sBACI,CACIC,OAAQ,gCACR7C,QAASA,CACb,EACA,CACIvD,QAAS,EACTvJ,SAAUA,EACVwG,gBAAiBA,EACjBoJ,WAAY,SAAS9J,GACjBA,EAAIqE,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAQA,SAAS0F,YAAYlP,GACbmP,EAAUhT,SAASkR,OAAOhN,MAAM,IAAI+O,OACpC,WAAapP,EAAK9C,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAOiS,EAAUR,mBAAmBQ,EAAQ,EAAE,EAAInG,KAAAA,CACtD,CAGA,SAASqG,eAAeC,GAEpB,IAKQnC,EALsC,SAAzC/I,kBAAkBmI,qBAI8B,WAAzCnI,kBAAkBmI,oBACtBY,EAAiC,WAAtB1J,SAAS2J,SAAwB,WAAa,GAC7DjR,SAASkR,OAASiC,EAAa,mEAAqEnC,GAG5F/I,kBAAkBmI,mBAGlC,CAGA,SAASwC,sBAAsBhP,EAAM4E,EAAQ4K,GAEzClS,IAAImS,EAAU,GAiBRhF,GAhBNgF,EAAkB,SAAI7K,EAAOtF,UAAY,KACzCmQ,EAAyB,gBAAI7K,EAAOkB,iBAAmB,KACvD2J,EAA0B,iBAAI7K,EAAO8K,kBAAoB,KACzDD,EAAyB,gBAAI7K,EAAO+K,iBAAmB,KACvDF,EAAe,MAAI7K,EAAOW,OAAS,CAAA,EACnCkK,EAAiB,QAAI7K,EAAOiE,SAAW,KACvC4G,EAAsB,aAAG7K,EAAOiE,QAAU,OAAS,OACnD4G,EAAiB,QAAI7K,EAAOqB,SAAW,KACvCwJ,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAI7K,EAAOc,QAAU,KACrC+J,EAAiB,QAAI7K,EAAOe,SAAW,KACvC8J,EAAqB,YAAI7K,EAAOgB,aAAe,KAC/C6J,EAAgB,OAAI7K,EAAOgL,QAAU,KACrCH,EAAkB,SAAI7K,EAAOiL,UAAY,KACzCJ,EAAc,KAAIzP,EAClByP,EAAa,IAAIpL,kBAAkByL,UACrB3L,kBAAkB,GAEV,UAAlB,OAAO,GACAsL,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBhF,GAE1DgF,EAAc,KAAIA,EAAc,KAAI,aAAe5K,KAAKE,OAAO,IAExD0K,EAAkB,WACrBA,EAAc,KAAEhL,YAAcgG,GAElCgF,EAAc,KAAEM,SAAWlL,KAAKE,OAAO,IAG3C,IAAI3J,WAAYoD,KAAKiR,CAAO,CAChC,CAGA,SAASV,sBAAuBvE,EAAO5F,GACnCtH,IAAImS,EAAU,GACdA,EAAe,MAAIjF,EACnBiF,EAAkB,SAAI7K,EAAOtF,UAAY,KACzCmQ,EAAyB,gBAAI7K,EAAOkB,iBAAmB,KACvD2J,EAAc,KAAI7K,EAAO5E,MAAQ,GACjCyP,EAAgB,OAAI7K,EAAOU,QAAU,QAErC,IAAIlK,WAAYuD,KAAK8Q,CAAO,CAChC,CAOA,SAASO,wBACL,OAAOnL,KAAKE,OAAO,EAAE+E,SAAS,EAAE,EAAE3M,QAAQ,WAAY,EAAE,EAAE8S,OAAO,EAAG,EAAE,CAC1E,CAEA3S,IAAIsP,kBAAoB,CACpBsD,IAAK,SAAS3J,EAAKqE,GACU,KAAA,IAAbA,IACRA,EAAW,SAETuF,EAAepM,aAAaC,QAAQuC,CAAG,EAC7C,GAAsB,OAAjB4J,EACD,IACI,IAAMC,EAAO9M,KAAKW,MAAMkM,CAAY,EACpC,GAAKC,CAAAA,EAAK9L,eAAesG,CAAQ,EAS7B,OAAOwF,EARP,IAEI,OAAO9M,KAAKW,MAAOmM,EAAKxF,EAAU,CAItC,CAHE,MAAO6D,GAEL,OAAO2B,EAAKxF,GAAUd,SAAS,CACnC,CAMR,CAFE,MAAO2E,GACL,OAAO0B,CACX,CAEJ,MAAO,CAAA,CACX,EACAtD,IAAK,SAAStG,EAAK1G,EAAOwQ,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzQ,MAASyD,KAAKC,UAAU1D,CAAK,EAAG0Q,UAAa1L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EACrGzM,aAAaG,QAAQqC,EAAKjD,KAAKC,UAAU+M,CAAS,CAAC,GAEnDvM,aAAaG,QAAQqC,EAAK1G,CAAK,CAEvC,EACA4Q,QAAS,SAASlK,EAAKmK,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEG7U,KAAKqU,IAAI3J,EAAK,WAAW,EACxBmK,EAAc7L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAASpK,GACZ,OAAqC,OAA9BxC,aAAaC,QAAQuC,CAAG,CACnC,EACAqK,OAAQ,SAASrK,GACbxC,aAAa8M,WAAWtK,CAAG,CAC/B,EACAuK,iBAAkB,WACdxT,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEwG,aAAavG,OAAQD,CAAC,GAAI,CACtCD,IAAIiJ,EAAMxC,aAAawC,IAAIhJ,CAAC,EACF,CAAC,IAAvBgJ,EAAI3F,QAAQ,KAAK,GAAoC,CAAC,IAA1B2F,EAAI3F,QAAQ,QAAQ,IAChDZ,EAAKuG,EAAIuD,SAAS,GAAK8C,kBAAkBsD,IAAI3J,CAAG,EAExD,CACA,OAAOvG,CACX,CAEJ,EAEI+Q,oBAAsB,CACtBb,IAAK,SAAS3J,EAAKqE,GACU,KAAA,IAAbA,IACRA,EAAW,SAETuF,EAAea,eAAehN,QAAQuC,CAAG,EAC/C,GAAsB,OAAjB4J,EACD,IACI,IAAMC,EAAO9M,KAAKW,MAAMkM,CAAY,EACpC,OAAOC,EAAK9L,eAAesG,CAAQ,EAAItH,KAAKW,MAAMmM,EAAKxF,EAAS,EAAIwF,CAGxE,CAFE,MAAO3B,GACL,OAAO0B,CACX,CAEJ,MAAO,CAAA,CACX,EACAtD,IAAK,SAAStG,EAAK1G,EAAOwQ,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzQ,MAASyD,KAAKC,UAAU1D,CAAK,EAAG0Q,UAAa1L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAe9M,QAAQqC,EAAKjD,KAAKC,UAAU+M,CAAS,CAAC,GAErDU,eAAe9M,QAAQqC,EAAK1G,CAAK,CAEzC,EACA8Q,MAAO,SAASpK,GACZ,OAAuC,OAAhCyK,eAAehN,QAAQuC,CAAG,CACrC,EACAqK,OAAQ,SAASrK,GACbyK,eAAeH,WAAWtK,CAAG,CACjC,EACAuK,iBAAkB,WACdxT,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEyT,eAAexT,OAAQD,CAAC,GAAI,CACxCD,IAAIiJ,EAAMyK,eAAezK,IAAIhJ,CAAC,EACJ,CAAC,IAAvBgJ,EAAI3F,QAAQ,KAAK,GAAoC,CAAC,IAA1B2F,EAAI3F,QAAQ,QAAQ,IAChDZ,EAAKuG,EAAIuD,SAAS,GAAKiH,oBAAoBb,IAAI3J,CAAG,EAE1D,CACA,OAAOvG,CACX,CACJ,EAUA,SAASiR,sBAAsBtV,IAC1B,oBAAsBA,EAAMuV,cACzBC,kBAAkCC,yBAAhBzV,EAAMuD,MAAM,CACtC,CAUA,SAASmS,aAAa1V,IACjB,0BAA4BA,EAAM2V,WAAe,SAAU3V,EACtByV,wBAAlCD,mBAA0DxV,EAAMuD,MAAM,CAC9E,CAWA,SAASiS,kBAAkBI,GACvB,IAGI5V,EAHA4V,EAAQC,aAAa,eAAe,IACxCD,EAAQ5J,aAAa,gBAAiB,EAAE,EAEpChM,EAAQ,IAAIqG,OAAO8M,YAAY,iBAAkB,CACjD2C,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIJ,EAAQ1C,cAAclT,CAAK,KAC5B4V,EAAQ1R,MAAQ,GAExB,CAWA,SAASuR,wBAAwBG,GACxBA,EAAQC,aAAa,eAAe,IACzCD,EAAQvJ,gBAAgB,eAAe,EAGvCuJ,EAAQ1C,cAAc,IAAI7M,OAAO8M,YAAY,iBAAkB,CAC3D2C,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAKMC,qBACFC,SAAW,GAKXjW,cACIC,KAAKgW,SAAWhW,KAAKiW,aAAa,EAE9BjW,KAAKgW,SAASrU,OAAS,GAI3B3B,KAAKkW,SAAS,CAClB,CAMAD,eACI,OAAO1V,SAASC,iBAAiB,6BAA6B,CAClE,CAMA0V,WACIzU,IAAI0C,EAAO,CACPgS,sBAAuBxD,wBAAwB,EAC/CyD,SAAU7V,SAASsH,SAASC,KAC5BuO,SAAU9V,SAAS8V,QACvB,EAE0C,SAAtC7N,kBAAkBG,gBAClBuK,sBAAsB,6BAA8B,CAChD/O,KAAAA,EACAsF,OAAQ,OACRhG,SAAU,GAAYzD,KAAKsW,iBAAiBC,CAAM,CACtD,CAAC,EAC4C,eAAtC/N,kBAAkBG,kBACzBxE,EAAKiP,OAAS,mCACdD,sBAAsBhP,EAAM,CAACV,SAAU,GAAYzD,KAAKsW,iBAAiBC,CAAM,CAAC,CAAC,EAEzF,CAOAD,iBAAiBC,GAEb,GAAIA,EAAOpS,MAAQoS,EAAOpS,KAAK8H,QAAiC,MAAvBsK,EAAOpS,KAAK8H,OACjDlB,QAAQrE,IAAI,gDAAgD,EAC5D1G,KAAKwW,YAAY,MAFrB,CAMA,GAAsB,UAAlB,OAAOD,EACP,IACIA,EAAS9O,KAAKW,MAAMmO,CAAM,CAK9B,CAJE,MAAO3D,GAGL,OAFA7H,QAAQrE,IAAI,yCAA0CkM,CAAC,EAAvD7H,KACA/K,KAAKwW,YAAY,CAErB,CAGkB,UAAlB,OAAOD,GAAuBA,EAAOE,OAA0B,IAAjBF,EAAOE,OACrDzW,KAAKwW,YAAY,EACjBjW,SAASyS,cAAc,IAAI0D,MAAM,6BAA6B,CAAC,GAE/D1W,KAAK2W,kBAAkBJ,EAAO3P,OAAO,CAhBzC,CAkBJ,CAMA4P,cACI/U,IAAImV,EAEJ5W,KAAKgW,SAASnF,QAAQ,IAClB+F,EAAOC,EAAQvT,cAAc,qBAAqB,EAAEwT,QAAQC,YAE5D,IACQH,GAAwB,UAAhB,OAAM,IACdC,EAAQ/G,UAAYkH,KAAKJ,CAAI,EAIrC,CAFE,MAAOhP,GACLmD,QAAQrE,IAAIkB,CAAK,CACrB,CACJ,CAAC,CACL,CAOA+O,kBAAkB/P,GACdnF,IAAImV,EAEJ5W,KAAKgW,SAASnF,QAAQ,KAClB+F,EAAOC,EAAQvT,cAAc,qBAAqB,EAAEwT,QAAQC,eAExDF,EAAQ/G,UAAY,0CAA4ClJ,EAAU,SAElF,CAAC,CACL,CACJ,CAKA,SAASqQ,oBACD/F,SAASgG,mCAAqE,KAAA,IAAzBnB,sBACrD,IAAIA,oBAEZ,CAEI7E,SAASiG,kBACmB,YAAxB5W,SAASkM,WACTwK,kBAAkB,EAElBG,2BAA2B7W,SAAU,mBAAoB0W,iBAAiB,SAoB5EI,WACFC,UAAY,CACRC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,WAAY,EACZC,kBAAmB,EACnBC,iBAAkB,EAClBC,UAAW,EACXC,WAAY,CAChB,EAEAC,OAASvX,SAASC,iBAAiB,wBAAwB,EAE3D2D,KAAO,GAKP4T,kBACmB5X,MAAMC,UAAUC,MAAMC,KAAKN,KAAK8X,MAAM,EAC5CjH,QAAQ,CAACmH,EAAOtW,KACrB1B,KAAKmE,KAAKvD,KAAKO,OAAO8W,OAAO,GAAIjY,KAAKsX,SAAS,CAAC,CACpD,CAAC,CACL,CAKA/H,eACIvP,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAG8V,YAAc,CAAA,CAC/B,CAAC,CACL,CAAC,EAEDxX,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,iBAAkB,KACrClD,KAAKmE,KAAKzC,GAAG6V,WAAa,CAAA,CAC9B,CAAC,CACL,CAAC,EAEDvX,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAGmW,UAAU,GACvBpW,IACIyW,EADApS,EAAO,CAAE,IAAIG,KAGe,IAA5BjG,KAAKmE,KAAKzC,GAAGmW,YACb7X,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGgW,kBAAoB5R,IAIrCoS,EAAepS,EAAO9F,KAAKmE,KAAKzC,GAAGiW,iBACH,IAA5B3X,KAAKmE,KAAKzC,GAAGmW,YACb7X,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGkW,UAAYM,GAIC,EAA1BlY,KAAKmE,KAAKzC,GAAGmW,aACb7X,KAAKmE,KAAKzC,GAAG+V,YAAczO,KAAKmP,IAAInY,KAAKmE,KAAKzC,GAAGkW,UAAYM,CAAY,EACzElY,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGkW,UAAYM,GAEjC,CAAC,CACL,CAAC,CACL,CACJ,CAGA,IAAME,OAAS,IAAInS,KACboS,UAAW,IAAIpS,MAAO0O,QAAQ,EAChC2D,sBAAwB,CAAA,EACxBC,YAAc,GACdC,mBAAqB,EACrBC,gBAAkB,GAClBC,qBAAuB,GACvBC,oBACAC,yBACAC,uBACAC,yBAA2B,EAC3BC,kCAAoC,GAGxC,SAAS3B,2BAA2BvW,EAAMf,EAAO2D,GACN,YAAnC,OAAO0C,OAAOjD,iBAAiCrC,EAAKqC,iBAAiBpD,EAAO2D,CAAQ,EACnF5C,EAAKmY,YAAYlZ,EAAO2D,CAAQ,CACzC,CAEA,SAASwV,2BAA2BpY,EAAMf,EAAO2D,GACH,YAAtC,OAAO0C,OAAO+S,oBAAoCrY,EAAKqY,oBAAoBpZ,EAAO2D,CAAQ,EACzF5C,EAAKsY,YAAYrZ,EAAO2D,CAAQ,CACzC,CAGA,IAAM2V,mBAAqB,SAAgBtZ,GAEvCwQ,YAAY,mBADOtH,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CACb,EAC5C0E,uBAAuB,CAC3B,EAmCMC,qBA7BNC,iBAAiB,GAAI,EAIjB/Q,kBAAkBC,eAAe,4BAA4B,GACb,GAAhDD,kBAAkBgR,4BAClBhR,kBAAkBC,eAAe,iCAAiC,GACb,GAArDD,kBAAkBiR,iCAElBC,gCAAgC,GAAI,EAOpCxI,SAASiG,kBAETwB,oBAAsBgB,YAAY,WAC9BrB,sBAAwB,CAAA,CAC5B,EAAG,GAAG,EAGNM,yBAA2Be,YAAY,WACnCrJ,YAAY,kBAAmB7I,KAAKC,UAAU6Q,WAAW,CAAC,CAC9D,EAAG,IAAI,GAIiB,SAAgBzY,GACxC8Z,gBAAgB,EACc,CAAA,IAA1BtB,wBACAC,YAAY3X,KAAK,CACboI,KAAK6Q,MAAM/Z,EAAMga,OAAO,EACxB9Q,KAAK6Q,MAAM/Z,EAAMia,OAAO,EACxB/Q,KAAK6Q,OAAM,IAAI5T,MAAO0O,QAAQ,EAAI0D,QAAQ,EAC7C,EAEDG,kBAAkB,GAClBF,sBAAwB,CAAA,EACE,IAAtBE,qBACAwB,gBAAgB,CAG5B,GAMA,SAAST,iBAAiBU,EAAmB,KACzC5T,WAAW,WACPsT,YAAY,WACRO,uBAAuB,EACvBC,mCAAmC,CACvC,EAAG,GAAI,CACX,EAAGF,CAAgB,CACvB,CAQA,SAASP,gCAAgCO,EAAmB,IAAMG,EAAW,KACzE/T,WAAW,WACPsT,YAAY,WACR,IAAMU,EAAatJ,kBAAkBsD,IAAI,mCAAmC,EACxEiG,0BAA0BD,CAAU,IACpCvB,yBAA2BuB,EAAWE,gBAEtCtJ,uBAAuB,GAAI,CAACG,gBAAiB,CAAA,CAAI,CAAC,EAE1D,EAAGgJ,CAAQ,CACf,EAAGH,CAAgB,CACvB,CAOA,SAASK,0BAA0BD,GAC/B,GACIA,GAAcA,EAAW5R,eAAe,iBAAiB,GACzDqQ,2BAA6BuB,EAAWE,gBAExC,IACI,IAAK9Y,IAAIC,EAAI,EAAGA,EAAI2Y,EAAWG,QAAQ7Y,OAAQD,CAAC,GAAI,CAChD,IAAM+Y,EAAcJ,EAAWG,QAAQ9Y,GAAGgZ,cAAcC,SAExD,GAAoBvN,KAAAA,IAAhBqN,GAA6B1B,CAAAA,kCAAkC6B,SAASH,CAAW,EAKvF,OADA1B,kCAAkCnY,KAAK6Z,CAAW,EAC3C,CAAA,CACX,CAGJ,CAFE,MAAO7H,GACL7H,QAAQrE,IAAI,6CAA+CkM,EAAE3E,SAAS,CAAC,CAC3E,CAEJ,MAAO,CAAA,CACX,CAKA,SAASkM,qCAIL,IAScU,EATRC,EACyD,EAA3Dva,SAASwa,uBAAuB,gBAAgB,EAAEpZ,QACqB,EAAvEpB,SAASwa,uBAAuB,4BAA4B,EAAEpZ,QACd,OAAhDpB,SAASya,eAAe,kBAAkB,EAG9C,IACSF,IAEKD,EAAQ9J,kBAAkBsD,IAAI,0BAA0B,EAC5B,YAA9B,OAAO4G,qBAA+C7N,KAAAA,IAAVyN,GAAwC,KAAjBA,EAAMlZ,QACzEsZ,mBAAmBJ,CAAK,CAMpC,CAFE,MAAOjI,GACL7H,QAAQrE,IAAIkM,EAAE3E,SAAS,CAAC,CAC5B,CACJ,CAKA,SAAS+L,kBACLf,2BAA2B1Y,SAAU,YAAa+Y,mBAAmB,EACrE4B,cAAcvC,mBAAmB,EACjCuC,cAActC,wBAAwB,CAC1C,CAKA,SAASS,yBACLJ,2BAA2B1Y,SAAU,YAAa6Y,kBAAkB,EACpEH,2BAA2B1Y,SAAU,UAAW6Y,kBAAkB,CACtE,CAKA,SAAS+B,WAAWvI,GAChBnR,IAAI2Z,EAAexI,EAAEvP,OAAOW,MAEtB,CAAA,6BAA6BqX,KAAKD,CAAY,GAIhDA,CAAAA,GAAkBA,KAAgB3C,kBAES,SAAtCjQ,kBAAkBG,gBACnBuK,sBACI,0BACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACmX,MAASF,CAAY,EAC5B3X,SAAU,SAAS8S,GACXA,EAAOA,SACPkC,gBAAgB2C,GAAgB,CAC5B7E,OAAUA,EAAOA,OACjB7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EACAjL,YAAY,oBAAqB7I,KAAKC,UAAU+Q,eAAe,CAAC,EAExE,CACJ,CACJ,EAE8C,eAAtCjQ,kBAAkBG,iBAC1BwK,sBACI,CACIC,OAAQ,gCACRkI,MAAOF,CACX,EACA,CACI3X,SAAU,SAAS8S,GACXA,EAAOA,SACPkC,gBAAgB2C,GAAgB,CAC5B7E,OAAUA,EAAOA,OACjB7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EACAjL,YAAY,oBAAqB7I,KAAKC,UAAU+Q,eAAe,CAAC,EAExE,CACJ,CACJ,EAGZ,CAKA,SAAS+C,gBAAgB5I,GACrBnR,IAAI2Z,EAAexI,EAAEvP,OAAOW,MAC5BvC,IAOQga,EALHL,GAAiBA,EAAazZ,OAY7B,6BAA6B0Z,KAAKD,CAAY,IAIhDA,KAAgB1C,sBAChBnC,EAASmC,qBAAqB0C,GAC9BM,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,IAKpDO,oBAAoB/I,EAAG,MAAM,GAG7BpK,kBAAkBG,gBAAkB,UAChCH,kBAAkBG,gBAClBuK,sBACI,yBACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACmX,MAASF,CAAY,EAC5B3X,SAAU,SAAS8S,GACfmF,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,CACpD,CACJ,CACJ,EAKsC,eAAtC5S,kBAAkBG,iBAClBwK,sBACI,CACIC,OAAQ,+BACRkI,MAAOF,CACX,EACA,CACI3X,SAAU,SAAS8S,GACfmF,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,CACpD,CACJ,CACJ,MApDIQ,EAAWrb,SAASya,eAAe,+BAA+B,IAElEY,EAASpZ,OAAO,GAEhBiZ,EAAOlb,SAASya,eAAe,2CAA2C,IAE1ES,EAAKjZ,OAAO,EAgDxB,CAOA,SAASkZ,yBAAyB9I,EAAG2D,EAAQ6E,GACpC7E,GAAWA,EAAOA,SAIvBA,EAASA,EAAOA,OAEhBmC,qBAAqB0C,GAAgB,CACjC7E,OAAUA,EACV7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EAEqB,UAAjBhF,EAAOA,OACPoF,oBAAoB/I,EAAG,aAAc2D,EAAOsF,WAAW,EAEvDF,oBAAoB/I,EAAG,YAAa2D,EAAOsF,WAAW,EAG1DvL,YAAY,0BAA2B7I,KAAKC,UAAUgR,oBAAoB,CAAC,EAC/E,CAOA,SAASiD,oBAAoB/I,EAAGkJ,EAAOC,GAC/B1W,EAAgBuN,EAAEvP,OAAOgC,cAC7B5D,IAAIua,EAAa3W,EAAc/B,cAAc,iBAAiB,EAE9D,GAAK0Y,EAAL,CAIAva,IAAIma,EACAH,EAmCJ,OAhCIlb,SAASya,eAAe,+BAA+B,EACvDY,EAAWrb,SAASya,eAAe,+BAA+B,IAElEY,EAAWrb,SAASoE,cAAc,KAAK,GAC9BmH,aAAa,QAAS,+BAA+B,EAC9D8P,EAAS9P,aAAa,KAAM,+BAA+B,EAC3D3F,OAAOjD,iBAAiB,SAAU,WAC9B0Y,EAAS5a,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,IAClE,CAAC,EACD5W,EAAcK,MAAMkW,CAAQ,GAI5Brb,SAASya,eAAe,2CAA2C,EACnES,EAAOlb,SAASya,eAAe,2CAA2C,IAE1ES,EAAOlb,SAASoE,cAAc,KAAK,GAC9BmH,aAAa,QAAS,2CAA2C,EACtE2P,EAAK3P,aAAa,KAAM,2CAA2C,EACnE3F,OAAOjD,iBAAiB,SAAU,WAC9BuY,EAAKza,MAAMib,IAAML,EAASM,sBAAsB,EAAED,IAAM,IAC5D,CAAC,EAEDL,EAASlW,MAAM+V,CAAI,GAGvBU,iCAAiC,EAEjChW,OAAOjD,iBAAiB,SAAU,SAASpD,GACvCqc,iCAAiC,CACrC,CAAC,EAEOL,GACR,IAAK,OACDF,EAASxZ,UAAUI,OAAO,qCAAsC,mCAAmC,EACnGoZ,EAASxZ,UAAUC,IAAI,8BAA8B,EACrD,MAEJ,IAAK,aACDuZ,EAASxZ,UAAUI,OAAO,+BAAgC,mCAAmC,EAC7FoZ,EAASxZ,UAAUC,IAAI,oCAAoC,EAE3DuZ,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKza,MAAMiB,QAAU,QACrBwZ,EAAKza,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKza,MAAMub,MAAQ,SACvB,EAEAX,EAASY,WAAa,WAClBf,EAAKza,MAAMiB,QAAU,MACzB,EAEA,MAEJ,IAAK,YACD2Z,EAASxZ,UAAUI,OAAO,+BAAgC,oCAAoC,EAC9FoZ,EAASxZ,UAAUC,IAAI,mCAAmC,EAE1DuZ,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKza,MAAMiB,QAAU,QACrBwZ,EAAKza,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKza,MAAMub,MAAQ,SACvB,EAEAX,EAASY,WAAa,WAClBf,EAAKza,MAAMiB,QAAU,MACzB,CAMJ,CAhFA,CAiFJ,CAOA,SAASka,mCACL,IAaMV,EAZAO,EAAazb,SAAS+C,cAAc,gDAAgD,EACrF0Y,KAGCJ,EAAWrb,SAASya,eAAe,+BAA+B,KAEpEY,EAAS5a,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,KAC9DL,EAAS5a,MAAMyb,KAAOT,EAAWE,sBAAsB,EAAEQ,MARvC,GAQ+D,GAAK,KACtFd,EAAS5a,MAAMsb,OAASN,EAAWW,aAAe,KAClDf,EAAS5a,MAAM4b,MAAQC,QAGrBpB,EAAOlb,SAASya,eAAe,2CAA2C,KAE5ES,EAAKza,MAAM4b,MAAQZ,EAAWc,YAAc,KAC5CrB,EAAKza,MAAMyb,KAAOT,EAAWE,sBAAsB,EAAEO,KAAO,KAEpE,CAKA,SAASM,gBACL,OAA+B,KAA3B7L,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,wCAIxC,CAAC/L,SAASgM,gBACoB,SAAhChM,SAASP,oBAAyF,IAAxDpQ,SAASC,iBAAiB,iBAAiB,EAAEmB,QACvD,gBAAhCuP,SAASP,oBAAgG,IAAxDpQ,SAASC,iBAAiB,iBAAiB,EAAEmB,OACvG,CAMA,SAASwb,cAAcC,GACnB,GAA+B,KAA3BlM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAGX,IAEYI,EAHZ/M,YAAY,kBAAmB8M,CAAQ,EAClCL,cAAc,GACRxc,CAAAA,SAASya,eAAe,aAAa,KACpCqC,EAAc9c,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAO,iBAAiB,EACjDuR,EAAYvR,aAAa,QAAS,iBAAiB,EACnDuR,EAAYvR,aAAa,KAAM,aAAa,EAC5CuR,EAAYvR,aAAa,QAAS,+BAA+B,EACjEuR,EAAYvR,aAAa,MAAOsR,CAAQ,EACxCtU,MAAM,MAAM,EAAElD,OAAOyX,CAAW,EAG5C,CAMA,SAASC,8BAA8BF,GACnC,GAA+B,KAA3BlM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAEX,IAEYI,EAFPN,cAAc,GACRxc,CAAAA,SAASya,eAAe,aAAa,KACpCqC,EAAc9c,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAO,iBAAiB,EACjDuR,EAAYvR,aAAa,QAAS,iBAAiB,EACnDuR,EAAYvR,aAAa,KAAM,aAAa,EAC5CuR,EAAYvR,aAAa,QAAS,+BAA+B,EACjEuR,EAAYvR,aAAa,MAAOiH,mBAAmBqK,CAAQ,CAAC,EAC5DtU,MAAM,MAAM,EAAElD,OAAOyX,CAAW,EAG5C,CAMA,SAASE,gBACL,GAA+B,KAA3BrM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAIXxb,IAAI+b,EAAuBzM,kBAAkBsD,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzBmJ,EAAiC,CAClC,GAAOzM,kBAAkB6D,QAAQ,kBAAmB,KAAQ,EAKxD,OADA0I,KAAAA,8BAA8BE,CAAoB,EAHlDzM,kBAAkBgE,OAAO,iBAAiB,CAMlD,CAE2C,SAAtCvM,kBAAkBG,gBACnBuK,sBACI,sBACA,CACIzJ,OAAQ,OACRhG,SAAU,SAAS8S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBkH,SAAuC,IAA5BlH,EAAOxR,QAAQ,OAAO,IAE3EgM,kBAAkBsD,IAAI,iBAAiB,IAE1CtD,kBAAkBC,IAAI,kBAAmBuF,CAAM,EAE/ClF,oCAAoC,GAGxC8L,cAAc5G,CAAM,EAE5B,CACJ,CACJ,EAGApD,sBACI,CACIC,OAAQ,qBACZ,EACA,CACIpG,QAAS,CAAA,EACTvJ,SAAU,SAAS8S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBkH,SAAuC,IAA5BlH,EAAOxR,QAAQ,OAAO,IAE3EgM,kBAAkBsD,IAAI,iBAAiB,IAE1CtD,kBAAkBC,IAAI,kBAAmBuF,CAAM,EAE/ClF,oCAAoC,GAGxC8L,cAAc5G,CAAM,EAE5B,EACAlD,WAAY,SAAS9J,GACjBA,EAAIqE,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAKA,SAAS8P,mBACE3M,kBAAkB+D,MAAM,iBAAiB,GAAO/D,kBAAkBsD,IAAI,iBAAiB,IAC1F/D,YAAY,kBAAmB,MAAM,EACrCS,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhCE,SAASP,oBAC0BvD,KAAAA,IAAnCkG,YAAY,iBAAiB,GAE7BhD,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAASsJ,kBACE7I,kBAAkB+D,MAAM,gBAAgB,GAAO/D,kBAAkBsD,IAAI,gBAAgB,IACxF/D,YAAY,iBAAkB,MAAM,EACpCS,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhCE,SAASP,oBACyBvD,KAAAA,IAAlCkG,YAAY,gBAAgB,GAE5BhD,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAAS4J,yBACAnJ,kBAAkB+D,MAAM,sBAAsB,GAAM/D,kBAAkB+D,MAAM,eAAe,GAC5F6I,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACK5M,CAAAA,kBAAkB+D,MAAM,eAAe,GAAK/D,CAAAA,kBAAkBsD,IAAI,eAAe,GACjFtD,CAAAA,kBAAkB+D,MAAM,sBAAsB,GAAK/D,CAAAA,kBAAkBsD,IAAI,sBAAsB,GAE5D,WAAhCnD,SAASP,oBAC+BvD,KAAAA,IAAxCkG,YAAY,sBAAsB,GACDlG,KAAAA,IAAjCkG,YAAY,eAAe,EANnC,CAaA7R,IAAI6N,EAAQsO,eAAe,EAG3B,GAFA1M,SAAS2M,eAAiB,GAEP,EAAfvO,EAAM3N,OACN,IAAKF,IAAIC,EAAI,EAAGA,EAAI4N,EAAM3N,OAAQD,CAAC,GAAI,CAEnC,IAAMoc,EAAoBxO,EAAM5N,GAAGlB,iBAAiB,gBAAgB,EACpE,IAAKiB,IAAIC,EAAI,EAAGA,EAAIoc,EAAkBnc,OAAQD,CAAC,GACT,WAA9Boc,EAAkBpc,GAAGgO,OAErBwB,SAAS2M,eAAejd,KAAKkd,EAAkBpc,EAAE,EAEjD0V,2BAA2B0G,EAAkBpc,GAAI,QAASqc,yBAAyB,EACnF3G,2BAA2B0G,EAAkBpc,GAAI,QAASsc,kBAAkB,EAGxF,CAlBJ,CAoBJ,CAOA,SAASC,sBAAsBC,EAAWC,GACtC,GAAuC,KAAA,IAA5BjN,SAAS2M,gBAAmE,EAAjC3M,SAAS2M,eAAelc,OAC1E,IAAKF,IAAIC,EAAI,EAAGA,EAAIwP,SAAS2M,eAAelc,OAAQD,CAAC,GACjDuX,2BAA2B/H,SAAS2M,eAAenc,GAAIwc,EAAWC,CAAY,CAG1F,CAEA1c,IAAIsc,0BAA4B,SAAgBje,GAC5Cse,qBAAqB,EACrBH,sBAAsB,QAASF,yBAAyB,CAC5D,EAEIC,mBAAqB,SAAgBle,GACrCue,cAAc,EACdJ,sBAAsB,QAASD,kBAAkB,CACrD,EAKA,SAASI,uBACErN,kBAAkB+D,MAAM,sBAAsB,GAAO/D,kBAAkBsD,IAAI,sBAAsB,GACpGtD,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhCE,SAASP,oBAC+BvD,KAAAA,IAAxCkG,YAAY,sBAAsB,GAEN,gBAAhCpC,SAASP,oBAGuB,SAAhCO,SAASP,qBAEiC,KAAA,IAA/BO,SAASC,mBACgB/D,KAAAA,IAA/B8D,SAASC,mBAAmCD,SAASC,qBAI9Db,YAAY,uBAAwB,MAAM,CAElD,CAKA,SAAS+N,gBACEtN,kBAAkB+D,MAAM,eAAe,GAAO/D,kBAAkBsD,IAAI,eAAe,GACtFtD,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhCE,SAASP,oBACwBvD,KAAAA,IAAjCkG,YAAY,eAAe,GAEC,gBAAhCpC,SAASP,oBAGuB,SAAhCO,SAASP,qBAEiC,KAAA,IAA/BO,SAASC,mBACgB/D,KAAAA,IAA/B8D,SAASC,mBAAmCD,SAASC,qBAI9Db,YAAY,gBAAiB,MAAM,CAE3C,CAYA,SAASgO,gCAEL,SAASC,EAAsBhV,GAC3B,GAAIA,EAAIiV,cACmC,CAAC,IAAxCjV,EAAIiV,aAAazZ,QAAQ,QAAQ,GACO,CAAC,IAAzCwE,EAAIiV,aAAazZ,QAAQ,SAAS,EAElC,IACI0Z,oBAAoBhX,KAAKW,MAAMmB,EAAIiV,YAAY,CAAC,CAGpD,CAFE,MAAO5L,GACL7H,QAAQrE,IAAIkM,EAAE3E,SAAS,CAAC,CAC5B,CAER,CAEsB,aAAlB,OAAOyQ,OAEwC,YAA3C,OAAOA,OAAOne,QAAQ,EAAEoe,aAAa,EACrCD,OAAOne,QAAQ,EAAEyC,GAAG,eAAgB,SAASlD,EAAOyJ,EAAKqV,GACrDL,EAAsBhV,CAAG,CAC7B,CAAC,EAEDmV,OAAOne,QAAQ,EAAEoe,aAAc,SAAS7e,EAAOyJ,EAAKqV,GAChDL,EAAsBhV,CAAG,CAC7B,CAAC,EAIyB,aAA1B,OAAOC,gBAEPjJ,SAAS2C,iBAAiB,mBAAoB,SAASpD,GACnB,IAA5BA,EAAMuD,OAAOoJ,YACb8R,EAAsBze,EAAMuD,MAAM,CAE1C,CAAC,CAGb,CAMA,SAASwb,kCACLhG,uBAAyBc,YAAa,WAClC,IAIImF,EAJoD,MAApD/N,kBAAkBsD,IAAI,wBAAwB,EAC9C6G,cAAcrC,sBAAsB,GAGpCiG,EAAa/N,kBAAkBsD,IAAI,0BAA0B,KAE7DpD,uBAAuB,CAAC,CAAC,8BAA+B6N,IAAc,CAAC1N,gBAAiB,CAAA,CAAI,CAAC,EAC7FL,kBAAkBC,IAAI,yBAA0B,GAAG,EACnDkK,cAAcrC,sBAAsB,EAG5C,EAAG,GAAI,CACX,CAOA,SAASkG,cACLxe,SAAS2C,iBAAiB,oBAAqB,WAED,KAAA,IAA/BgO,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,qBAEzDE,oCAAoC,EACF,YAA9B,OAAO4J,qBAAwE,YAAnC,OAAO+D,yBACnD/D,mBAAmB+D,wBAAwB3K,IAAI,0BAA0B,CAAC,CAGtF,CAAC,EACMnD,SAAS+N,qBACZC,yBAAyB,EAG7BZ,8BAA8B,EAGzBpJ,oBAAoBJ,MAAM,kBAAkB,EAW7C/D,kBAAkBC,IAAI,kBAAmBlP,OAAOiP,kBAAkBsD,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvF8K,EAAYhL,sBAAsB,EACxCe,oBAAoBlE,IAAI,mBAAoBmO,EAAW,CAAA,CAAK,EAC5DpO,kBAAkBC,IAAI,kBAAmB,CAAC,EACtCzQ,SAAS8V,UACQ,IAAI+I,IAAI7e,SAAS8V,QAAQ,EAC3BgJ,OAASxX,SAASwX,MAC7BnK,oBAAoBlE,IAAI,qBAAsBzQ,SAAS8V,SAAU,CAAA,CAAK,GAOlFiJ,oCAAoC,EAdpC,IAgBMC,EAAcxO,kBAAkBsD,IAAI,iBAAiB,EAoBrDmL,GAnBCD,GAAeA,IAAgBrO,SAASP,qBAC3CI,kBAAkBC,IAAI,kBAAmBE,SAASP,kBAAkB,EACpEI,kBAAkBgE,OAAO,gBAAgB,EACzChE,kBAAkBgE,OAAO,iBAAiB,GAGV,gBAAhC7D,SAASP,qBACTgN,uBAAuB,EAEvBtX,WAAWsX,uBAAwB,GAAI,GAG3CxX,OAAOjD,iBAAiB,iBAAkBkS,sBAAuB,CAAA,CAAI,EACrEjP,OAAOjD,iBAAiB,QAASsS,aAAc,CAAA,CAAI,EACnDjV,SAASkf,WAAa,IAAIpI,WAC1B9W,SAASkf,WAAW1H,gBAAgB,EACpCxX,SAASkf,WAAWlQ,aAAa,EAGb,CAChB,CAAC,kBAAmBvG,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAeyD,OAAOsH,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkB3X,UAAU4X,aAWjC,GARA7O,kBAAkBC,IAAI,kBAAmBhI,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EAChF5D,kBAAkBC,IAAI,mBAAoB,GAAG,EAC7CD,kBAAkBC,IAAI,kBAAmB,GAAG,EAE5CD,kBAAkBC,IAAI,cAAeoH,OAAOsH,kBAAkB,EAAE,GAAG,CAAE,CAAG,EACxE3O,kBAAkBC,IAAI,iBAAkB2O,mBAAmB,CAAC,EAC5D5O,kBAAkBC,IAAI,iBAAkBhJ,UAAU4X,SAAS,EAEtB,WAAhC1O,SAASP,mBACV6O,EAAY5e,KAAK,CAAC,uBAAwB,IAAI,MAC3C,CAEHa,IAAIoe,EAAetf,SAASkR,OAAOqO,MAAM,GAAG,EAC5C,GAA6B,IAAxBD,EAAale,OACd,IAAMF,IAAIC,EAAI,EAAGA,EAAIme,EAAale,OAAQD,CAAC,GAAK,CAC5CD,IACIiS,EADgBmM,EAAane,GAAGqe,KAAK,EACVD,MAAM,GAAG,EAAE,GACW,IAAhDpM,EAAW3O,QAAQ,uBAAuB,GAC3C0O,eAAeC,CAAU,CAEjC,CAER,CAGI,CAAA,CAACxC,SAAS8L,gBACoB,GAA5B,CAAC9L,SAAS8L,gBAAwE,GAAjD9L,SAAS+L,uCAEvCF,cAAc,EACfQ,cAAc,EAEdiC,EAAY5e,KAAK,CAAC,kBAAmBsQ,SAAS8O,WAAW,GAI5D,CAAC9O,SAAS+O,gCACXT,EAAY5e,KAAK,CAAC,oBAAqB,IAAI,EAC3CkI,MAAM,+BAAiC,EAAE9F,GAAG,OAAQmY,UAAU,GAG7D,CAACjK,SAASgP,+BACXV,EAAY5e,KAAK,CAAC,0BAA2B,IAAI,EACjDkI,MAAM,iDAAmD,EAAE9F,GAAG,OAAQwY,eAAe,GAGrFzK,kBAAkB+D,MAAM,YAAY,EACpC0K,EAAY5e,KAAK,CAAC,aAAcmQ,kBAAkBsD,IAAI,YAAY,EAAE,EAEpEmL,EAAY5e,KAAK,CAAC,aAAc,EAAE,EAItCgR,8BAA8B,EAG9BnQ,IAAI0e,EAAmBpP,kBAAkBsD,IAAI,0BAA0B,EAqGnE+L,GApGsC,KAAA,IAA/BlP,SAASC,mBAChBD,SAASC,mBACTD,SAAS+L,uCAETlM,kBAAkBC,IAAI,yBAA0B,GAAG,EAC/CmP,GACAX,EAAY5e,KAAK,CAAC,8BAA+Buf,EAAiB,EAClEpP,kBAAkBC,IAAI,yBAA0B,GAAG,GAEnD6N,gCAAgC,GAIxCvO,YAAYkP,CAAW,EAEvBnZ,WAAW,WAEkC,KAAA,IAA9B6K,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,oBAEzDE,oCAAoC,EAIG,KAAA,IAAhCH,SAASP,oBACgB,SAAhCO,SAASP,qBAET0P,0CAA0C,EAC1CC,mBAAmB,GAGvB,IAAK7e,IAAIC,EAAI,EAAGA,EAAInB,SAAS+O,MAAM3N,OAAQD,CAAC,GAAI,CAC5CD,IA0BI8e,EAIAC,EA9BA5J,EAAOrW,SAAS+O,MAAM5N,GAGtB+e,8BAA8BlgB,SAAS+O,MAAM5N,GAAI,gBAAgB,GAGjEkV,EAAKtT,cAAc,qCAAqC,GACxDsT,EAAKtT,cAAc,8CAA8C,GACjEsT,EAAKtT,cAAc,8CAA8C,GAOb8J,KAAAA,IAApD7M,SAAS+O,MAAM5N,GAAG/B,SAAS+gB,sBAC8B,EAAzDngB,SAAS+O,MAAM5N,GAAG/B,SAAS+gB,qBAAqB/e,SAKhDiV,EAAKtT,cAAc,oCAAoC,IACnDqd,EAAgB/J,EAAKtT,cAAc,oCAAoC,EAC3EsT,EAAKgK,YAAYD,CAAa,IAG9BJ,EAAchgB,SAASoE,cAAe,OAAQ,GACtCmH,aAAc,OAAQ,QAAS,EAC3CyU,EAAYzU,aAAc,KAAM,wBAA0BpK,CAAE,EAC5D6e,EAAYzU,aAAc,OAAQ,sBAAsB,GACpD0U,EAAuB,IACN,GAAKK,6BAA6BjK,CAAI,EAC3D2J,EAAYvc,MAAQ8c,KAAKrZ,KAAKC,UAAU8Y,CAAoB,CAAC,EAC7D5J,EAAKhR,OAAQ2a,CAAY,EAEzB3J,EAAKmK,cAAgBnK,EAAKoK,SAE1BpK,EAAKqK,YAAcvf,EACnBkV,EAAKoK,SAAW,SAASlhB,GACgB,WAAhCoR,SAASP,oBAAuE,KAAA,IAA7B7Q,EAAMuD,OAAO4d,aACjEC,gCAAiCL,6BAA6B7gB,IAAI,EAAGF,EAAMuD,OAAO4d,WAAY,EAG9D,SAAhC/P,SAASP,oBAAiCwQ,uBAAuBrhB,EAAMuD,MAAM,IAC7E8C,OAAOqD,eAAepJ,UAAUyL,KAAO,SAAS1H,GAC5C1C,IACA2f,EAAe,uCADIC,gBAAgB,EACoC,IACvEC,YAAYhhB,KAAKN,KAAMohB,EAAejd,CAAI,EAC1CkC,WAAW,KACPF,OAAOqD,eAAepJ,UAAUyL,KAAOyV,WAC3C,EAAG,CAAC,CACR,GAIAxhB,EAAMuD,OAAO0d,yBAAyBQ,UAAY,CAACC,0BAA0B1hB,EAAMuD,MAAM,IAC1D+J,KAAAA,IAA3BtN,EAAMuD,OAAOjB,WAA2BtC,EAAMuD,OAAOjB,UAAUqf,SAAS,iBAAiB,GACzF3hB,EAAM4hB,eAAe,EAEzBrb,WAAW,WACPvG,EAAMuD,OAAO0d,cAAczgB,KAAKR,EAAMuD,OAAQvD,CAAK,CACvD,EAAG,CAAC,EAEZ,EACJ,CACJ,EAAG,GAAI,EAGiBS,SAASC,iBAAiB,wBAAwB,GAE1E,IADA0Q,SAASkP,kBAAoBA,GACPze,OAClB,IAAKF,IAAIC,EAAI,EAAGA,EAAI0e,EAAkBze,OAAQ,EAAED,EAC5C0e,EAAkB1e,GAAGwB,iBAAiB,QAASye,yBAAyB,EAKhF,IAAK,IAAMC,KAASrhB,SAAS+O,MAED,aAApB,OAAO4B,UACqC,GAA5C,CAAEA,SAAS2Q,8BACX,EACiC,eAA7BD,EAAM9d,aAAa,IAAI,GACU,OAAhC8d,EAAM9d,aAAa,OAAO,GAAqE,CAAC,IAAxD8d,EAAM9d,aAAa,OAAO,EAAEiB,QAAQ,aAAa,GAC1D,OAA/B6c,EAAM9d,aAAa,MAAM,GAA+D,CAAC,IAAlD8d,EAAM9d,aAAa,MAAM,EAAEiB,QAAQ,QAAQ,IAInF6c,EAAMte,cAAc,8BAA8B,GAKrB,qBAA7Bse,EAAM9d,aAAa,IAAI,GACS,2BAAhC8d,EAAM9d,aAAa,OAAO,IAM9B8d,EAAME,wBAA0BF,EAAMZ,SACtCY,EAAMZ,SAAW,GAAOe,4BAA4BnP,EAAGgP,CAAK,GAKpEI,yBAAyB,EAGzB,IAAI7S,4BAOA+B,SAAS+Q,6BACTC,sBAAsB,CAE9B,CAKA,SAASA,wBACL,GAAIhR,SAAS+L,qCAAsC,CAC/C,IAAMkF,EAA4BxI,YAAY,KACdzR,CAAAA,aAAaka,2BAGrC9R,YAAY,2BAA4B,IAAK,MAAM,EACnD4K,cAAciH,CAAyB,EAE/C,EAAG,GAAG,CACV,CACJ,CAKA,SAAS7B,qBA2BDna,OAAOsC,eAAe,IAAI,GAC1BtC,OAAOkc,GAAG5Z,eAAe,UAAU,GACD,YAAlC,OAAOtC,OAAOkc,GAAGC,SAASC,KAE1Bpc,OAAOkc,GAAGC,SAASC,IA9BI,CAACC,EAASC,KACV,UAAnB,OAAOD,GAAoC,OAAZA,GAC9BA,EAAQ/Z,eAAe,MAAM,GAAM+Z,EAAQ/Z,eAAe,MAAM,IAMjE+Z,EAAQre,KAAKsE,eAAe,UAAU,GACP,EAA/B+Z,EAAQre,KAAKue,SAAS/gB,QACtB6gB,EAAQre,KAAKue,SAAS,GAAGja,eAAe,MAAM,GACZ,+BAAlC+Z,EAAQre,KAAKue,SAAS,GAAGC,OAEzBH,EAAQre,KAAKue,SAAS,GAAGve,KAAKye,0BAA4BvB,gBAAgB,EAC1EmB,EAAQre,KAAKue,SAAS,GAAGve,KAAK0e,YAAc3a,aAAaC,QAAQ,0BAA0B,GAI1E,0BAAjBqa,EAAQG,QACRH,EAAQre,KAAKye,0BAA4BvB,gBAAgB,EACzDmB,EAAQre,KAAK0e,YAAc3a,aAAaC,QAAQ,0BAA0B,GAGvEsa,EAAKD,CAAO,EAOsB,CAEjD,CAKA,SAASR,2BAEL,GAAqD,OAAhDzhB,SAAS+C,cAAc,mBAAmB,EAAa,CACxD,IAAMwf,EAAetZ,eAAepJ,UAAUyL,KAC9CrC,eAAepJ,UAAUyL,KAAO,SAASvB,GAErC,GACIA,GACgB,UAAhB,OAAOA,GAEmD,CAAC,IAAvDA,EAAKvF,QAAQ,mCAAmC,EAEtD,CACEtD,IAAIshB,EAA0B,GAC1BjE,EAAa5W,aAAaC,QAAQ,0BAA0B,EAChE,IACI2W,EAAarX,KAAKW,MAAM0W,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CAEmB,OAAfA,GACe,CAAA,IAAfA,GACAA,EAAWrW,eAAe,OAAO,GACZ,KAArBqW,EAAW9a,QAEX8a,EAAaA,EAAW9a,MACxB+e,GAA2B,0CAAiDjE,GAGhFrd,IAAI2f,EAAeC,gBAAgB,EAGnC/W,GAFAyY,GAA2B,wCAA+C3B,CAK9E,CACA,OAAO0B,EAAaE,MAAMhjB,KAAM,CAACsK,EAAK,CAC1C,CACJ,CACJ,CAMA,SAAS2Y,4CAA4CC,GAE5CA,IAC0C,SAAtC1a,kBAAkBG,gBACnBuK,sBAAsB,iCAAkC,EAAE,EACZ,eAAtC1K,kBAAkBG,iBAC1BwK,sBAAsB,CAACC,OAAQ,gCAAgC,EAAG,EAAE,EAGhF,CAUA,SAASiN,4CAIL5e,IAAIqd,EAAa,CAAA,EACM,aAAlB,OAAOJ,QAAsD,YAA5B,OAAOA,OAAOyE,WAChDzE,OAAOyE,UAAU,CACb9P,WAAY,SAAS9J,EAAKqV,GACtBnd,IAAI2hB,EAAa,CAAA,EA0BjB,GAxB8B,UAAzB,OAAOxE,EAASza,OAC8B,CAAC,IAA5Cya,EAASza,KAAKY,QAAQ,eAAe,IACrCqe,EAAa,iBAGgC,CAAC,IAA9CxE,EAASza,KAAKY,QAAQ,iBAAiB,IACvCqe,EAAa,mBAIyC,CAAC,IAAvDxE,EAASza,KAAKY,QAAQ,0BAA0B,GACI,CAAC,IAArD6Z,EAASza,KAAKY,QAAQ,wBAAwB,IAE9Cqe,EAAa,4BAG0C,CAAC,IAAxDxE,EAASza,KAAKY,QAAQ,2BAA2B,IACjDqe,EAAa,6BAG4C,CAAC,IAA1DxE,EAASza,KAAKY,QAAQ,6BAA6B,KACnDqe,EAAa,+BAGQ,UAAxB,OAAOxE,EAASnY,KACmC,CAAC,IAAjDmY,EAASnY,IAAI1B,QAAQ,qBAAqB,IAC1Cqe,EAAa,sBAC4C,OAArDlb,aAAaC,QAAQ,0BAA0B,GAAY,CAC3D2W,EAAa5W,aAAaC,QAAQ,0BAA0B,EAC5D,IACI2W,EAAarX,KAAKW,MAAM0W,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CACmB,CAAA,IAAfA,GAAwBA,EAAWrW,eAAe,OAAO,GAA0B,KAArBqW,EAAW9a,QACzE8a,EAAaA,EAAW9a,MAEhC,CAIR,IACQod,EADJgC,IACIhC,EAAeC,gBAAgB,EAE/BvC,EADsB,UAAtB,OAAOA,EACM,yCAA2CA,EAAa,IAExD,GAIjBF,EAASza,MAFTid,EAAe,uCAAyCA,EAAe,KAExCtC,EAAaF,EAASza,KAE7D,CACJ,CAAC,CAET,CAGA,SAASqd,0BAA0B5K,GAC/B,MAAIA,CAAAA,CAAAA,EAAKxU,UAAUqf,SAAS,wBAAwB,CAKxD,CAgBA,SAASM,4BAA4BnP,EAAGyQ,GACpC,IAEI,IAAMC,EAAgBD,EAAW/f,cAAc,4BAA4B,EACvEigB,EAAU,KAEQ,OAAlBD,GACwB,OAAxBA,EAActf,QAEduf,EAAUD,EAActf,OAI5BvC,IAQU+hB,EAWF3D,EAmBE4D,EAtCNC,EAA4BC,6BAA6B,EAGzDC,EAAyB7S,kBAAkBsD,IAAI,0BAA0B,EAG1C,OAA9BqP,GAAwD,OAAlBJ,GAAqD,OAA3BM,IACjEhR,EAAE8O,eAAe,EACX8B,EAAW,KACS,OAAlBF,GACAA,EAAcO,WAAWjD,YAAY0C,CAAa,EAEJ,YAA9C,OAAOD,EAAWvB,wBAClBuB,EAAWvB,wBAAwB,EAEnCgC,gBAAgB1jB,UAAU2jB,OAAOzjB,KAAK+iB,CAAU,CAExD,EAEIxD,EAAe6D,EAGF,OAAZH,IACD1D,EAAamE,kCAAoCT,GAIrD1D,EAAaoE,4BAA8BL,EAIC,UAAxC,OAAO/D,EAAa/M,iBAC4B,CAAC,IAAjD+M,EAAa/M,gBAAgB/N,QAAQ,KAAK,IAE1C8a,EAAa/M,gBAAkBC,mBAAmB8M,EAAa/M,eAAe,GAOpD,KAAA,KAHxB2Q,EAAgBhc,KAAKC,UAAUmY,CAAY,IAGqB,IAAzB4D,EAAc9hB,OACvDsP,uBACIwS,EACA,CAAChgB,SAAU+f,EAAUvZ,gBAAiBuZ,EAAUpS,gBAAiB,CAAA,CAAI,CACzE,EAEAoS,EAAS,EAKrB,CAFE,MAAO5b,GACLmD,QAAQmZ,KAAK,6CAA+Ctc,CAAK,CACrE,CACJ,CAMA,SAAS+K,wBAAwBwR,EAAgB,IAC7C1iB,IAAI2iB,EAAiB,GAErBA,EAAeC,kBAAoB/Q,YAAY9K,kBAAkBkJ,aAAe,mBAAmB,EACnG0S,EAAeE,wBAA0BhR,YAAY9K,kBAAkBkJ,aAAe,yBAAyB,EAC/G0S,EAAeG,WAAajR,YAAY9K,kBAAkBkJ,aAAe,YAAY,EACrF0S,EAAeI,iBAAmBlR,YAAY9K,kBAAkBkJ,aAAe,kBAAkB,EACjG0S,EAAeK,gBAAkBnR,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAC/F0S,EAAeM,gBAAkBpR,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAC/F0S,EAAeO,eAAiBrR,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EAC7F0S,EAAeQ,YAActR,YAAY9K,kBAAkBkJ,aAAe,aAAa,EAGvF,IAAMmT,EAA2B9T,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,gBAAgB,EAClGoT,EAA4B/T,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACpGqT,EAA4BhU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACpGsT,EAAgBjU,kBAAkBsD,IAAI,iBAAiB,EACvD4Q,EAAmB/P,oBAAoBb,IAAI,oBAAoB,EAC/D6Q,EAAmBhQ,oBAAoBb,IAAI,oBAAoB,EAC/D8Q,EAAyBpU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,cAAc,EAC9F0T,EAAarU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACrF2T,EAAgBtU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,gBAAgB,EACvF4T,EAA+BvU,kBAAkBsD,IACnD7L,kBAAkBkJ,aAAe,mCACrC,EAGM6T,EAAqBjS,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EAClF8T,EAAsBlS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EACpF+T,EAAsBnS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EACpFgU,EAAoBpS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAClFiU,EAAsB,CAAC,CAACrS,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EA8B3F,GA3BA0S,EAAewB,eAA8CxY,KAAAA,IAA7ByX,EAC5BA,EAA2BU,EAC/BnB,EAAeyB,gBAAgDzY,KAAAA,IAA9B0X,EAC7BA,EAA4BU,EAChCpB,EAAe0B,gBAAgD1Y,KAAAA,IAA9B2X,EAC7BA,EAA4BU,EAChCrB,EAAetR,gBAAiC1F,KAAAA,IAAfgY,EAC7BA,EAAaM,EACjBtB,EAAe2B,eAAmC3Y,KAAAA,IAAlBiY,EAC5BA,EAAgBM,EACpBvB,EAAe4B,kCAAqE5Y,KAAAA,IAAjCkY,EAC/CA,EAA+B,GAC/BlB,EAAetR,iBAA6D,UAA1C,OAAOsR,EAA8B,iBACnEA,EAAetR,gBAAgB/N,QAAQ,QAAQ,IAC/Cqf,EAAetR,gBAAkBC,mBAAmBqR,EAAetR,eAAe,GAI1FsR,EAAe6B,gBAAkBjB,EACjCZ,EAAe8B,mBAAqBjB,EACpCb,EAAe+B,mBAAqBjB,EACpCd,EAAegC,mBAAqBjB,EAE/Bf,EAAetR,kBAChBsR,EAAetR,gBAAkB5B,SAAS8O,YAGd,UAA3B,OAAO,EACR,IAAKve,IAAIC,EAAI,EAAGA,EAAIyiB,EAAcxiB,OAAQ,EAAED,EACF,UAAjC,OAAQyiB,EAAcziB,GAAG,GAE1B0iB,EAAeD,EAAcziB,GAAG,GAAG,IAAMyiB,EAAcziB,GAAG,GAAG,GAE7D0iB,EAAeD,EAAcziB,GAAG,IAAMyiB,EAAcziB,GAAG,QAI/DqJ,QAAQrE,IAAI,+CAA+C,EAO/D,OAHA0d,EAAiBiC,yBAAyBjC,CAAc,EAGjD3c,KAAKC,UAAU0c,CAAc,CACxC,CAUA,SAASiC,yBAAyBhY,GAC9B,GAAuB,UAAlB,OAAOA,EAER,IAAK5M,IAAI6M,KAAaD,EAAQ,CAO1B,IAIUE,EATwB,UAA7B,OAAOF,EAAOC,KACfD,EAAOC,GAAa+X,yBAAyBhY,EAAOC,EAAU,GAKjC,UAA7B,OAAOD,EAAOC,IACiC,OAA/CD,EAAOC,GAAW7J,MAAM,iBAAiB,GAGb,UAAvB,OADC8J,EAAc9G,KAAKW,MAAMiG,EAAOC,EAAU,KAE5CD,EAAOC,GAAaC,EAGhC,CAGJ,OAAOF,CACX,CAGA,SAASwS,6BAA8BjK,GAEnCnV,IAAI6kB,EAAS,GACTC,EAAgB,GAChBC,EAAqB,EACrBC,EAAkB,GAClBC,EAAuB,EACvBC,EAA2B,GAE/B,IAAKllB,IAAIiJ,KAAOkM,EAAKjX,SACZinB,MAAM,CAAClc,CAAG,IACX4b,EAAO5b,GAAOkM,EAAKjX,SAAS+K,IAsDpC,OAjDA4b,EAASA,EAAOhiB,OAAO,SAASzD,GAE5B,MAAuE,CAAC,IAAnE8lB,EAAyB5hB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IAI5D,CAAC,IAAM,CAAC,QAAS,YAAYiB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IACjE6iB,EAAyB/lB,KAAMC,EAAKiD,aAAa,MAAM,CAAE,EAClD,CAAA,GAGf,CAAC,GAGM+M,QAAQ,SAAShQ,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,EAAEgmB,YACY,MAAnChlB,iBAAiBhB,CAAI,EAAEkF,SACO,WAA9BlF,EAAKiD,aAAa,MAAM,GAEnBjD,EAAKuB,UAAUqf,SAAS,gBAAgB,GAW7C8E,GAAiB,IAAM1lB,EAAKiD,aAAa,MAAM,EAC/C0iB,CAAkB,KARdC,GAAmB,IAAM5lB,EAAKiD,aAAa,MAAM,EACjD4iB,CAAoB,IAShC,CAAC,EAEDD,EAAkBA,EAAgB1G,KAAK,EAGhC,CACH+G,eAHJP,EAAgBA,EAAcxG,KAAK,EAI/BgH,qBAAsBP,EACtBQ,iBAAkBP,EAClBQ,uBAAwBP,CAC5B,CACJ,CAGA,SAASxF,gCAAiCgG,EAAyBC,GAC/D1lB,IAAI2lB,EAAgD,UAAnC,OAAOF,GAAoE,OAA5BA,EAC5DA,EAA0B,GAE9B,GAAqC,WAAhChW,SAASP,mBAEV,IAAMlP,IAAIC,KAAK0lB,EAAa,CACxB,GAAS,GAAJ1lB,EAED,OAGJ4O,YAAY,yBADqBlD,KAAAA,IAAX+Z,EAAuBA,EAASzlB,GACC+F,KAAKC,UAAW0f,EAAW1lB,EAAG,CAAE,CAC3F,MAEA4O,YAAY,uBAAwB7I,KAAKC,UAAW0f,CAAW,CAAE,CAEzE,CAGA,SAASC,+BAA+B9Q,EAAQpS,EAAM4E,EAAQ4K,GAC1D,GAA8D,EAAzDpT,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,MAAQuS,EAAO+Q,MAEnC,CACJ,CAKA,SAAS3H,qBACL,OAAOlY,KAAKC,UAAU,CAClB6f,UAAWhnB,SAASinB,gBAAgBC,YACpCC,WAAY1e,KAAK2e,IACbpnB,SAAS+J,KAAKsd,aAAcrnB,SAASinB,gBAAgBI,aACrDrnB,SAAS+J,KAAKqS,aAAcpc,SAASinB,gBAAgB7K,aACrDpc,SAAS+J,KAAKud,aAActnB,SAASinB,gBAAgBK,YACzD,EACAC,aAAcvnB,SAASinB,gBAAgBO,YACvCC,cAAeznB,SAASinB,gBAAgBK,YAC5C,CAAC,CACL,CAGA,SAASpJ,oBAAoBnS,GACzB7K,IAAI+E,EAAM,GACoB,KAAA,IAAnB8F,EAASxD,QAChBwD,EAAWA,EAASxD,OACPmf,UACTzhB,EAAM8F,EAAS4b,UAMf1hB,EAHqB,KAAA,IAAlB8F,EAASnI,MAESiJ,KAAAA,KADzBd,EAAWA,EAASnI,MACPyC,QACH0F,EAAS1F,QAInBJ,KACAjG,SAASyS,cACL,IAAIC,YAAa,qBAAsB,CACnC2C,QAAS,CAAA,EACTE,OAAQ,CAAClP,QAASJ,CAAG,CACzB,CAAE,CACN,EAGA2hB,eAAeC,OAAS5hB,EACxB2hB,eAAend,KAAK,EAEU,GAA1B,CAACsB,EAAS+b,cACVliB,OAAOmiB,KAAK,CAGxB,CAGA,SAASC,0BAA0BC,GAE/BlY,YAAY,kBAAmBkY,CAAY,CAC/C,CAGA,SAASC,+BAA+B/Y,GACpCjO,IAAIgU,EAAY,SACH,WAAT/F,IACA+F,EAAY,UAEhBhU,IAAIuW,EAAQ,GAERoJ,EAAeuC,6BAA6B,EAChDvC,EAAe3Z,KAAKC,UAAU0Z,CAAY,EAQ1C,OAPAA,EAAe,sBAAwBN,KAAKM,CAAY,GACxDpJ,EAAQzX,SAASoE,cAAc,OAAO,GAChCmH,aAAa,OAAQ,2BAA2B,EACtDkM,EAAMlM,aAAa,QAASsV,CAAY,EACxCpJ,EAAMlM,aAAa,OAAQ2J,CAAS,EACpCuC,EAAM5V,UAAUC,IAAI,qBAAqB,EACzC2V,EAAM5V,UAAUC,IAAI,2BAA2B,EACxC2V,CACX,CAOA,SAAS2L,+BACLliB,IAWQinB,EAXJC,EAAoB5X,kBAAkBkE,iBAAiB,EACvD2T,EAAsB1T,oBAAoBD,iBAAiB,EAE/DxT,IAAIonB,EAAmB,CAACC,KAAM,EAAE,EAK5BC,GAJAxoB,SAASkf,YAAclf,SAASkf,WAAWtb,OAC3C0kB,EAAmB,CAACC,KAAMvoB,SAASkf,WAAWtb,IAAI,GAGnB,CAAC6kB,8BAA+B,EAAE,GAOrE,OALIzoB,SAAS2P,+BACLwY,EAA6BjhB,KAAKW,MAAMX,KAAKC,UAAUnH,SAAS2P,4BAA4B,CAAC,EACjG6Y,EAA+B,CAACC,8BAA+BN,CAA0B,GAGtF,CAAC,GAAGC,EAAmB,GAAGC,EAAqB,GAAGC,EAAkB,GAAGE,CAA4B,CAC9G,CAKA,SAASnL,iBACLnc,IAAI6N,EAAQ/O,SAAS+O,MACrB,OAAIA,GAGG,CAAA,CACX,CAOA,SAAS2Z,+BAA+BrS,GAEpCnV,IAAI8U,EAAS,CAAC2S,UAAa,EAAGpC,eAAkB,CAAC,EAkC7CqC,IAhC4C,GAA5C,CAACjY,SAASkY,+BACgC,QAAzCxS,EAAKnN,OAAOwE,SAAS,EAAEhJ,YAAY,GACiB,IAArD2R,EAAKpW,iBAAiB,kBAAkB,EAAEmB,QAC9B,kBAAZiV,EAAKyS,IACLzS,EAAKxU,UAAUqf,SAAS,iBAAiB,GACzC7K,EAAKvR,cAAcjD,UAAUqf,SAAS,aAAa,GACI,CAAC,IAAxD7K,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,kBAAkB,GAChD6R,EAAKyS,IAAkB,eAAZzS,EAAKyS,IAChBzS,EAAKxU,WAAawU,EAAKxU,UAAUqf,SAAS,eAAe,GACzD7K,EAAKxU,WAAawU,EAAKxU,UAAUqf,SAAS,WAAW,GACrD7K,EAAKyS,IAAkB,6BAAZzS,EAAKyS,IAChBzS,EAAKyS,IAAyD,CAAC,IAApDzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,kBAAkB,GACxD6R,EAAKyS,IAAiD,CAAC,IAA5CzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,UAAU,GAChD6R,EAAKyS,IACuD,CAAC,IAA1DzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,wBAAwB,GACtD6R,EAAKxS,MACyD,CAAC,IAA5DwS,EAAKxS,KAAK6J,SAAS,EAAElJ,QAAQ,wBAAwB,GAC9B,iDAA3B6R,EAAKxD,OAAOnF,SAAS,GACpB2I,EAAKxS,MAA2D,CAAC,IAApDwS,EAAKxS,KAAK6J,SAAS,EAAElJ,QAAQ,gBAAgB,GAC1D6R,EAAKyS,IAAkB,mBAAZzS,EAAKyS,IAChBzS,EAAKyS,IACU,mBAAZzS,EAAKyS,IACmD,CAAC,IAAzDzS,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,mBAAmB,GACrD6R,EAAKyS,IAAkB,yBAAZzS,EAAKyS,IAChBzS,EAAKyS,IAAkB,YAAZzS,EAAKyS,IACmE,CAAC,IAArFzS,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,+CAA+C,GACpC,OAA1C6R,EAAKtT,cAAc,iBAAiB,KAEpCiT,EAAOuQ,eAAiB,GAIAlQ,EAAKiN,YAgBjC,OAdIsF,GAAyBA,EAAsB/mB,UAAUqf,SAAS,UAAU,GAC7D,YAAd7K,EAAKxS,MAAsBwS,EAAKxU,UAAUqf,SAAS,cAAc,KAElElL,EAAO2S,UAAY,GAKnBtS,GAAQA,EAAKxU,UAAUqf,SAAS,wBAAwB,IAExDlL,EAAOuQ,eAAiB,EACxBvQ,EAAO2S,UAAY,GAGhB3S,CACX,CAUA,SAASkK,8BAA8B7J,EAAM0S,GACzC,IAAMC,EAAoC,UAAvB,OAAO3S,EAAW,OAAgBA,EAAKxD,OAAS,GAEnE,MAAIxO,CAAAA,CAAAA,QAAQgS,EAAKtT,cAAc,0BAA0B,CAAC,GAItDsT,CAAAA,CAAAA,EAAKxU,UAAUqf,SAAS,wBAAwB,GAIN,CAAC,IAA3C8H,EAAWxkB,QAAQ,iBAAiB,GAIF,CAAC,IAAnCwkB,EAAWxkB,QAAQ,SAAS,GAIC,UAA7B,OAAO,GACsD,CAAC,IAA9D,CAAC,iBAAkB,aAAaA,QAAQukB,CAAe,GAEhB,IADpBL,+BAA+BrS,CAAI,EACpC0S,EAI1B,CAKA,SAASjY,sCACL,GAAoC,SAAhCH,SAASP,mBAAb,CAIAlP,IAAI6N,EAAQsO,eAAe,EAE3B,GAAItO,EACA,IAAM7N,IAAIC,EAAI,EAAGA,EAAI4N,EAAM3N,OAAQD,CAAC,GAChC,GAAK+e,CAAAA,8BAA8BlgB,SAAS+O,MAAM5N,GAAI,WAAW,IAKhB,OAA7CnB,SAAS+O,MAAM5N,GAAGoC,aAAa,QAAQ,GACoB,SAA3DvD,SAAS+O,MAAM5N,GAAGoC,aAAa,QAAQ,EAAEmB,YAAY,GAAc,CAEnExD,IAAIqW,EAASxI,EAAM5N,GAAGlB,iBAAiB,4BAA4B,EACnE,IAAMiB,IAAI+nB,EAAI,EAAGA,EAAI1R,EAAOnW,OAAQ6nB,CAAC,GACjC1R,EAAO0R,GAAG1Z,UAAY,GAG1BvP,SAAS+O,MAAM5N,GAAGkE,OAAO6iB,+BAA+B,CAAC,CAC7D,CApBR,CAuBJ,CA9jCIvX,SAASiG,kBACTC,2BAA2B7W,SAAU,YAAa+Y,mBAAmB,EACrElC,2BAA2B7W,SAAU,YAAa6Y,kBAAkB,EACpEhC,2BAA2B7W,SAAU,UAAW6Y,kBAAkB,EAClEhC,2BAA2B7W,SAAU,SAAUmd,gBAAgB,GA8hB/DxM,SAASiG,kBACmB,YAAxB5W,SAASkM,WACTsS,YAAY,EAEZ3H,2BAA2B7W,SAAU,mBAAoBwe,WAAW,EAGxEhO,kBAAkBC,IAAI,aAAcE,SAASuY,eAAgB,CAAA,CAAK,GAuhBtE,IAAMC,aAAevjB,OAAOwjB,MACtBrI,YAAc9X,eAAepJ,UAAUyL,KAW7C,SAAS+d,6BACLvjB,WAAW,WACHwjB,oBAAoB,IACpB1jB,OAAOwjB,MAAQ,YAAY1mB,GACvB,IAKQme,EAOR,OAZIne,GACAA,EAAK,IACuB,YAA5B,OAAOA,EAAK,GAAG2X,UACf3X,EAAK,GAAG2X,SAAS,mBAAmB,IAEhCwG,EAAeC,gBAAgB,EAE/Bpe,IAAQA,EAAK,IAAMA,EAAK,GAAGqH,MAC3BrH,EAAK,GAAGqH,KAAK1E,OAAO,4BAA6Bwb,CAAY,EAI9DsI,aAAa1G,MAAM7c,OAAQlD,CAAI,CAC1C,EAER,EAAG,GAAI,CACX,CAKA,SAAS4mB,sBACL,IAAMC,EAAc,CAChB,wBAEJroB,IAAIsoB,EAAc,CAAA,EAGlB,IAAKtoB,IAAImV,KADKrW,SAAS+O,MAEnBwa,EAAYjZ,QAAQ,SAASmZ,GACrBpT,EAAKxU,UAAUqf,SAASuI,CAAS,IACjCD,EAAc,CAAA,EAEtB,CAAC,EAGL,OAAOA,CACX,CAMA,SAAS5I,uBAAuBvK,GAC5B,OAA8E,MAA1ErW,SAAS+C,cAAc,4CAA8C,GAGrEsT,EAAAA,CAAAA,GAAQA,CAAAA,EAAKxD,QAA2E,CAAC,IAAlEwD,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,4BAA4B,EAK1F,CAKA,SAASsc,kBACL5f,IAAIknB,EAAoB5X,kBAAkBkE,iBAAiB,EACvD2T,EAAsB1T,oBAAoBD,iBAAiB,EAC3DmM,EAAe,CAAC,GAAGuH,EAAmB,GAAGC,CAAmB,EAChExH,EAAe3Z,KAAKC,UAAU0Z,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS9B,sCACL,IAAM2K,EAAqB/U,oBAAoBb,IAAI,4BAA4B,EAGrD,CAAA,IAAtB4V,GAA+B1pB,SAASsH,SAASC,OAASmiB,GAC1D/U,oBAAoBlE,IAAI,qBAAsBiZ,EAAoB,CAAA,CAAK,EAI3E/U,oBAAoBlE,IAAI,6BAA8BzQ,SAASsH,SAASC,KAAM,CAAA,CAAK,CACvF,CAKA,SAASoX,2BAEL3e,SAASC,iBAAiB,uEAAuE,EAAEqQ,QAAQ,IACvGqZ,EAAGhnB,iBAAiB,QAAS,SAAS0P,GAClCnR,IAAIqG,EAAOoiB,EAAGpmB,aAAa,MAAM,EAEjCrC,IAAIqd,EAAa/N,kBAAkBsD,IAAI,0BAA0B,EAC5DyK,IAC0B,CAAC,IAAvBhX,EAAK/C,QAAQ,GAAG,EACjB+C,GAAQ,IAERA,GAAQ,IAEZA,GAAQ,+BAAiCgX,EACzCoL,EAAGpe,aAAa,OAAQhE,CAAI,EAEpC,CAAC,CACL,CAAC,CACL,CApH4B,YAAxBvH,SAASkM,WACTmd,2BAA2B,EAE3BxS,2BAA2B7W,SAAU,mBAAoBqpB,0BAA0B,EAoHvFnoB,IAAI0mB,eAAiB,CAGjBC,OAAQ,CAAA,EACR+B,QAAS,CAAA,EACTC,OAAQ,CAAA,EACRC,QAAS,CAAA,EACTC,iBAAkB,CAAA,EAGlBC,KAAM,SAAUnX,GACZ,IAEQ3P,EAFDzD,KAAKooB,SACRpoB,KAAKmqB,QAAU,CAAA,EACX1mB,EAAW,SAAU8S,EAAQpS,EAAM4E,EAAQ4K,GAC3CwU,eAAegC,QAAU,CAAA,EACzBhC,eAAeC,OAAS7R,EACxBhW,SAASyS,cACL,IAAIC,YAAa,8BAA+B,CAC5C2C,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAO4U,qBACRA,qBAEArX,uBAFsB,CAACC,OAAUA,CAAM,EAAG,CAAC3P,SAAYA,EAAUuJ,QAAW,CAAA,CAAI,CAAE,EAK9F,EAEAhC,KAAM,WAEc,SAAZyf,IACAhpB,IAAIipB,EAAS,GAEb,IAAM,IAAMhgB,KAAO1K,KAAK2qB,OACpBD,GAAUhgB,EAAM,IAAM1K,KAAK2qB,OAAOjgB,GAAO,IAE7C,OAAOggB,CACX,CAPAjpB,IAQImpB,EAAa,CACbD,OAAQ,CACJE,UAAW,aACXC,SAAY,QACZ7O,IAAO,IACPQ,KAAQ,IACRG,MAAS,OACTN,OAAU,OACVyO,WAAc,kBACd9oB,QAAW,OACX+oB,kBAAmB,SACnBC,cAAe,QACnB,EACAhd,SAAUwc,CACd,EACIS,EAAW,CACXP,OAAQ,CACJG,SAAY,WACZK,QAAW,OACXJ,WAAc,OACdK,OAAU,6BACVC,gBAAiB,MACjBC,aAAc,qCAClB,EACArd,SAAUwc,CACd,EACIc,EAAW,CACXZ,OAAQ,CACJG,SAAY,WACZC,WAAc,OACdnO,MAAS,OACTN,OAAU,OACV8O,OAAU,6BACVC,gBAAiB,OACjBtf,OAAU,UACVkQ,IAAO,OACPS,MAAS,OACT8O,aAAc,aAClB,EACAvd,SAAUwc,CACd,EACIgB,EAAiB,CACjBd,OAAQ,CACJhlB,QAAW,KACX1D,QAAW,QACX6oB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBzO,MAAS,MACTN,OAAU,OACVL,IAAO,MACPQ,KAAQ,MACRiP,UAAa,eACjB,EACAzd,SAAUwc,CACd,EACIkB,EAAgB,CAChBhB,OAAQ,CACJhlB,QAAW,KACX1D,QAAW,QACX6oB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBzO,MAAS,MACTN,OAAU,OACVL,IAAO,MACPQ,KAAQ,MACRiP,UAAa,gBACjB,EACAzd,SAAUwc,CACd,EACImB,EAAU,CACVjB,OAAQ,CACJkB,SAAY,QAChB,EACA5d,SAAUwc,CACd,EACIqB,EAAsBvrB,SAASoE,cAAe,OAAQ,EAUtDonB,GATJD,EAAoBhgB,aAAc,KAAM,wBAAyB,EACjEggB,EAAoB/b,UAAY,+BAAiC6b,EAAU,IAC3EE,EAAoB/b,WAAa,4BAA8B6a,EAAa,IAC5EkB,EAAoB/b,WAAa,0BAA4Bwb,EAAW,IACxEO,EAAoB/b,WAAa,iCAAmC0b,EAAiB,IACrFK,EAAoB/b,WAAa,gCAAkC4b,EAAgB,IACnFprB,SAAS+J,KAAK1E,OAAQkmB,CAAoB,EAG5BvrB,SAASoE,cAAe,KAAM,GAMxCqnB,GALJD,EAAQjgB,aAAc,KAAM,yBAA0B,EACtDvL,SAAS+J,KAAK1E,OAAQmmB,CAAQ,EAE9BxrB,SAAS+J,KAAKlI,UAAUC,IAAK,wBAAyB,EAE1C9B,SAASoE,cAAe,KAAM,GAKtCsnB,GAJJD,EAAMlgB,aAAc,KAAM,uBAAwB,EAClDkgB,EAAMlgB,aAAc,QAASof,CAAS,EACtCa,EAAQnmB,OAAQomB,CAAM,EAEVzrB,SAASoE,cAAe,KAAM,GAItCgB,GAHJsmB,EAAMngB,aAAc,KAAM,uBAAwB,EAClDkgB,EAAMpmB,OAAQqmB,CAAM,EAEN1rB,SAASoE,cAAe,KAAM,GACvC3E,KAAKooB,QACA8D,EAAW,uBACW,WACJ7Q,KAAKrb,KAAKooB,MAAM,GAAKpoB,KAAKsqB,iBAC9C3kB,EAAQoK,UAAY/P,KAAKooB,OAEzBziB,EAAQoK,UAAY/P,KAAKooB,OAAO9mB,QAAQ4qB,EAAU,qCAAqC,IAG3FvmB,EAAQoK,UAAY,aAEpB/P,KAAKuqB,KAAM,sBAAuB,GAEtC5kB,EAAQmG,aAAc,KAAM,yBAA0B,EACtDkgB,EAAMpmB,OAAQD,CAAQ,EAEtB3F,KAAKoqB,OAAS,CAAA,CAClB,EAEA6B,MAAO,WACH1rB,SAAS+J,KAAKlI,UAAUI,OAAQ,wBAAyB,EACzDjC,SAASya,eAAgB,yBAA0B,EAAExY,OAAO,EAC5DjC,SAASya,eAAgB,wBAAyB,EAAExY,OAAO,EAC3DjC,SAASyS,cACL,IAAIC,YAAa,uBAAwB,CACrC2C,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EA0LA,SAASuW,mBACL1qB,IAAI2qB,EAAkB7rB,SAASC,iBAAiB,gCAAgC,EACnD,EAAzB4rB,EAAgBzqB,QAChByqB,EAAgBvb,QAAQ,IACpB6E,EAAQtT,UAAUI,OAAO,SAAS,CACtC,CAAC,CAET,CA9LAjC,SAAS2C,iBAAiB,QAAS,SAAU0P,GACpCA,CAAAA,EAAEvP,QAA2B,4BAAhBuP,EAAEvP,OAAOgmB,IAAoD,0BAAhBzW,EAAEvP,OAAOgmB,IACpElB,eAAe8D,MAAM,CAE7B,CAAC,EACD1rB,SAAS2C,iBAAiB,8BAA+B,SAAU0P,GAC1DuV,eAAeiC,QAAUjC,eAAeC,SACzC7nB,SAASya,eAAgB,yBAA0B,EAAEjL,UAAYoY,eAAeC,OAExF,CAAC,EAED7nB,SAAS2C,iBAAiB,mBAAoB,WAC1CzB,IAAI4qB,EAAgBjf,KAAAA,EAChBkf,EAA2B,CAAA,EAgB/B,GAdyB,aAApB,OAAOpb,UAA0D,aAA9B,OAAOqb,oBAKd,KAAA,KAHzBF,EADqB,aAApB,OAAOnb,UAA4BA,SAASsb,cAC7Btb,SAASsb,cAGlBH,IACuB,aAA9B,OAAOE,oBACPA,mBAAmBC,gBAEnBH,EAAgBE,mBAAmBC,cACnCF,EAA2B,CAAA,GAI5BD,EAAP,CAKA5qB,IAAIgrB,EAAyB,wCACxBlsB,SAAS+C,cAAc,iDAAiD,IAEzEmpB,EAAyB,8CAE7BhrB,IAEMirB,EAAcnsB,SAASC,iBACzBisB,EAF4B,uFAIH,EAED,IAAvBC,EAAY/qB,SAIjB+qB,EAAY7b,QAAQ,CAAE6E,EAASiX,KAE3B,IAQIC,EAGAC,EAIAC,EAGAC,EAIAC,EAGAC,EAKIC,EA7Bc,aAAlB,OAAOC,SACPzX,EAAQrQ,cAAc/C,UAAUyC,QAAQ,OAAO,EAAI,GAChC,OAAnB2Q,EAAQ1Q,WAKR4nB,EAAYrsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uBAAuB,GAEnD+gB,EAAWtsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAOugB,EAAce,YAAY,EACvDP,EAAS/gB,aAAa,QAAS,2BAA2B,GAEtDghB,EAAiBvsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uBAAuB,GAExDihB,EAAwBxsB,SAASoE,cAAc,GAAG,GAChCmH,aAAa,QAAS,8BAA8B,EAC1EihB,EAAsBnnB,OAAOymB,EAAcgB,QAAQC,UAAU,GAEzDN,EAAwBzsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,mCAAmC,GAE3EmhB,EAA4B1sB,SAASoE,cAAc,MAAM,GACnCiB,OAAOymB,EAAcgB,QAAQE,YAAc,GAAG,EACxEN,EAA0BrnB,OAAOymB,EAAcgB,QAAQG,WAAW,EAE7DlB,KACGY,EAAgB3sB,SAASoE,cAAc,GAAG,GAChCmH,aAAa,OAAQugB,EAAcoB,cAAc,EAC/DP,EAAcphB,aAAa,SAAU,QAAQ,EAC7CohB,EAAcQ,KAAOrB,EAAcgB,QAAQM,oBAC3CV,EAA0BrnB,OAAO,GAAG,EACpCqnB,EAA0BrnB,OAAOsnB,CAAa,GAGlDF,EAAsBpnB,OAAOqnB,CAAyB,EACtDH,EAAelnB,OAAOmnB,EAAuBC,CAAqB,EAClEJ,EAAUhnB,OAAOinB,CAAQ,EACzBnX,EAAQ9P,OAAOgnB,CAAS,EACxBlX,EAAQ9P,OAAOknB,CAAc,EACjC,CAAC,EAEcvsB,SAASC,iBAAiB,wBAAwB,EAE1DqQ,QAAQ,IACXpP,IAAImsB,EAAcxgB,KAAAA,EAmCZygB,GAjCN7tB,KAAKsK,KAAKpH,iBAAiB,QAAS,SAAS0P,GAEY,CAAC,GAAlDA,EAAEvP,OAAOf,UAAUyC,QAAQ,iBAAiB,GACmB,CAAC,GAAhE6N,EAAEvP,OAAOgC,cAAc/C,UAAUyC,QAAQ,iBAAiB,GAE1DonB,iBAAiB,CAEzB,CAAC,EAED2B,EAAM5qB,iBAAiB,QAAS,WAC5B,IAAM2qB,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUM,OAAO,SAAS,CAExC,CAAC,EAEDorB,EAAM5qB,iBAAiB,aAAc,WACjCipB,iBAAiB,EACjB,IAAM0B,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUC,IAAI,SAAS,CAErC,CAAC,EAEDyrB,EAAM5qB,iBAAiB,aAAc,WACjC0qB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAEasrB,EAAMC,oBACpBF,EAAM3qB,iBAAiB,aAAc,WACjC8qB,aAAaJ,CAAW,EACxBC,EAAMzrB,UAAUC,IAAI,SAAS,CACjC,CAAC,EAEDwrB,EAAM3qB,iBAAiB,aAAc,WACjC0qB,EAAcvnB,WAAW,KACjBwnB,EAAMzrB,UAAUqf,SAAS,uBAAuB,GAChDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAGDsrB,EAAM5qB,iBAAiB,WAAY,WAC/B0qB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQ7tB,KAAK+tB,mBACbE,EAAY9nB,OAAOsJ,aAAa,EAElCoe,GAASI,GAAaJ,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACtC,IAAhCwM,EAAUhgB,SAAS,EAAEtM,OAErBksB,EAAMzrB,UAAUI,OAAO,SAAS,GAEhCwrB,aAAaJ,CAAW,EACxBrtB,SAAS2C,iBAAiB,kBAAmB,SAASgrB,IAClD,IAAMD,EAAY9nB,OAAOsJ,aAAa,EAClCwe,GAA6C,IAAhCA,EAAUhgB,SAAS,EAAEtM,SAElCisB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQC,EAAMC,mBAChBF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,EACPjC,SAAS2Y,oBAAoB,kBAAmBgV,CAAiB,EAEzE,CAAC,EAET,EAAG,GAAI,CACX,CAAC,CACL,CAAC,EAlJD,CAmJJ,CAAC,EAcD,IAAMC,gBAAkB5tB,SAASoE,cAAc,KAAK,EA4KpD,SAASypB,qBACL7tB,SAAS+C,cAAc,yBAAyB,EAAE+Y,YAAc,MAChE8R,gBAAgBntB,MAAM0b,MAAQ,QAC9ByR,gBAAgBntB,MAAMqtB,WAAa,OACnC9tB,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAMqtB,WAAa,OACrE9tB,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAM4b,MAAQ,OAChErc,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAMstB,WAAa,OACzE,CAKA,SAASC,oBACL,IAAK9sB,IAAIC,EAAI,EAAGA,EAAInB,SAAS+O,MAAM3N,OAAQD,CAAC,GACxC,GAAkD0L,KAAAA,IAA9C7M,SAAS+O,MAAM5N,GAAG8sB,yBAC4BphB,KAAAA,IAA9C7M,SAAS+O,MAAM5N,GAAG+sB,wBAAuC,CAEzD,IA2CcC,EA3CRC,EAAcpuB,SAAS+O,MAAM5N,GAGnC,GAAKktB,CAAAA,gBAAgBD,CAAW,EAKhC,GAAKE,iBAAiBF,CAAW,EAC7BG,yBAAyBH,EAAajtB,EAAGnB,QAAQ,OAG9C,GAEmC6M,KAAAA,IAAtCuhB,EAAY7X,QAAQiY,eACW,UAA9B,OAAOJ,EAAkB,QACkC,CAAC,IAAxDA,EAAYvb,OAAOrO,QAAQ,sBAAsB,GACvB,UAA9B,OAAO4pB,EAAkB,QAC1BA,EAAYrrB,cAAc,0BAA0B,GAElB,UAA9B,OAAOqrB,EAAkB,QACqB,CAAC,IAA/CA,EAAYvb,OAAOrO,QAAQ,aAAa,GACxC4pB,EAAY7qB,aAAa,kBAAkB,EAG/CkrB,qCAAqCL,EAAajtB,EAAGnB,QAAQ,OAE1D,GAC2B,UAA9B,OAAOouB,EAAkB,SACmB,CAAC,IAA3CA,EAAYvb,OAAOrO,QAAQ,SAAS,GACS,CAAC,IAA5C4pB,EAAYvb,OAAOrO,QAAQ,UAAU,GAC3C,CACEtD,IAAIwtB,EAAMN,EAAYvb,OAAO0M,MAAM,IAAI,GACvCmP,EAAMA,EAAI,GAAGnP,MAAM,GAAG,GACL,GAAG7a,YAAY,IAEnB4C,SAASqnB,SAASjqB,YAAY,KACjCkqB,EAAW5uB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChB+qB,EAASnrB,MAAQ2qB,EAAYvb,OAC7B+b,EAASzf,KAAO,SAChBif,EAAYS,YAAYD,CAAQ,GAE1BT,EAAWnuB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChBsqB,EAAS1qB,MAAQ2qB,EAAYllB,OAC7BilB,EAAShf,KAAO,SAEhBif,EAAYllB,OAAS,OAErBklB,EAAYS,YAAYV,CAAQ,EAEhCC,EAAYvb,OAAS7S,SAASsH,SAEtC,CACJ,CAGJwnB,oBAAoB,EAEpB1R,uBAAuB,CAC3B,CAOA,SAASiR,gBAAgBD,GA0BrBltB,IAAI8U,EAAS,CAAA,EAEb,IAEQoY,EAAYtpB,eACiC,EAA7CspB,EAAYtpB,cAAcjD,UAAUT,QACyB,CAAC,IAA9DgtB,EAAYtpB,cAAcjD,UAAU,GAAG2C,QAAQ,QAAQ,IACvDwR,EAAS,CAAA,GAG8B,OAAvCoY,EAAY7qB,aAAa,QAAQ,GAdd,CACvB,6BAcuB+M,QAAQ,SAASye,GACoC,CAAC,IAAjEX,EAAY7qB,aAAa,QAAQ,EAAEiB,QAAQuqB,CAAe,IAC1D/Y,EAAS,CAAA,EAEjB,CAAC,EAxCc,CACnB,YACA,UACA,2BACA,WAuCe1F,QAAQ,SAAS0e,GAC5B,IAAMpI,EAASwH,EAAY7qB,aAAa,IAAI,EACvCqjB,MAAAA,GAAsF,CAAC,IAAjCA,EAAOpiB,QAAQwqB,CAAW,IACjFhZ,EAAS,CAAA,EAEjB,CAAC,EArCqB,CACtB,cACA,UACA,uBACA,kBACA,iBACA,UACA,oBAgCkB1F,QAAQ,SAAS2e,GAC/B/tB,IAAIguB,EAAa,GAMjB,IAAMC,EAJFD,EADAd,EAAY7qB,aAAa,OAAO,EACnB6qB,EAAY7qB,aAAa,OAAO,EAEhC6rB,kBAAkBhB,EAAaa,CAAc,EAGzDE,MAAAA,GAAgG,CAAC,IAAvCA,EAAU3qB,QAAQyqB,CAAc,IAEvFjZ,EADAoY,CAAAA,EAAY7qB,aAAa,kBAAkB,EAMvD,CAAC,EA1DoB,CACrB,UA2DiB+M,QAAQ,SAAS+e,GAC9B,IAAMC,EAAWlB,EAAY7qB,aAAa,IAAI,EACzC+rB,MAAAA,GAA2F,CAAC,IAArCA,EAAS9qB,QAAQ6qB,CAAa,IACtFrZ,EAAS,CAAA,EAEjB,CAAC,CAGL,CAFE,MAAO3D,GACL7H,QAAQ+kB,MAAM,oCAAqCld,CAAC,CACxD,CAEA,OAAO2D,CACX,CAQA,SAASoZ,kBAAkBhB,EAAaa,GACpC,GAA2B,UAAvB,OAAM,GAA6Bb,EAAYrrB,cAAc,IAAMksB,CAAc,EACjF,OAAOA,CAEf,CAKA,SAASH,sBACL,IAAMU,EAASxvB,SAASyvB,qBAAqB,QAAQ,EAErD,GAAqB,EAAhBD,EAAOpuB,OACR,IAAMF,IAAI+nB,EAAI,EAAGA,EAAIuG,EAAOpuB,OAAQ6nB,CAAC,GACjC,GAAkC,MAA7BuG,EAAOvG,GAAGyG,gBAAf,CAIA,IAAMC,EAAcH,EAAOvG,GAAGyG,gBAAgB3gB,MAC9C,GAA4B,IAAvB4gB,EAAYvuB,OAIjB,IAAMF,IAAI0uB,EAAI,EAAGA,EAAID,EAAYvuB,OAAQwuB,CAAC,GAAK,CAC3C,IAAMxB,EAAcuB,EAAYC,GAC3BvB,gBAAgBD,CAAW,GAGhCG,yBAAyBH,EAAawB,EAAGJ,EAAOvG,GAAGyG,eAAe,CACtE,CAbA,CAgBZ,CAQA,SAASnB,yBAAyBH,EAAayB,EAAUC,GACrD,IAAMC,EAAuB/vB,SAASoE,cAAc,GAAG,EAOjD4rB,GANND,EAAqBhuB,UAAY,wBACjCguB,EAAqBtvB,MAAQ,gBAE7B2tB,EAAYtpB,cAAcmrB,aAAaF,EAAsB3B,CAAW,EAG3DA,EAAY8B,iBACnBC,EAAW/B,EAAY7e,UACvB6gB,EAAehC,EAMfiC,GAHNjC,EAAYtpB,cAAcub,YAAY+N,CAAW,EAG7BpuB,SAASoE,cAAc,KAAK,GAI1CksB,GAHND,EAAY7gB,UAAY2gB,EACxBH,EAAK7qB,MAAMkrB,EAAYE,iBAAiB,EAEpBvwB,SAASoE,cAAc,OAAO,GAClDksB,EAAYzsB,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SAEnB,IAAMqhB,EAAmBV,EAAe/gB,MAAM8gB,GAO1CY,GALJD,EAAiB3B,YAAYyB,CAAW,EACxCE,EAAiBE,UAAYV,EAC7BQ,EAAiBG,kBAAoBP,EAGP,CAAA,GACKvjB,KAAAA,IAA/B2jB,EAAiB3uB,WAES,CAAC,iBAAkB,iBAC3ByO,QAAQ,SAASsgB,GAC3BJ,EAAiB3uB,UAAUqf,SAAS0P,CAAe,IACnDH,EAA0BG,EAElC,CAAC,EAGDC,EAAyB,KACxBJ,EAEII,OADLA,EAAyBL,EAAiBztB,cAAc,uBAAuB,IAE3E8tB,EAAuBluB,iBAAiB,QAAS,SAASpD,GACtDA,EAAM4hB,eAAe,EACrB2P,yBAAyBN,CAAgB,CAC7C,CAAC,EAKTV,EAAe/gB,MAAM8gB,GAAUpP,SAAW,SAASlhB,GAC/CA,EAAM4hB,eAAe,EACrB2P,yBAAyBvxB,EAAMwxB,aAAa,CAChD,CACJ,CAQA,SAAStC,qCAAqCL,EAAayB,EAAUC,GACjE,IAOMjrB,EAWAyrB,EAKAE,EAvBAQ,EAAuB5C,EAAYrrB,cAAc,iBAAiB,EAClEkuB,EAAmB7C,EAAYrrB,cAAc,iBAAiB,EAAEsT,KAAKoK,SAEpEuQ,IAIDnsB,EAASmsB,EAAqBlsB,cAC9BosB,EAAmBF,EAAqBzhB,UAG9CyhB,EAAqB/uB,OAAO,GAGtBouB,EAAcrwB,SAASoE,cAAc,KAAK,GACpCoL,UAAY0hB,EACxBrsB,EAAOgqB,YAAYwB,EAAYE,iBAAiB,GAE1CD,EAActwB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,UAEbqhB,EAAmBV,EAAe/gB,MAAM8gB,IAE7BhB,YAAYyB,CAAW,EACxCE,EAAiBW,YAActsB,EAC/B2rB,EAAiBQ,qBAAuBA,EACxCR,EAAiBS,iBAAmBA,EAEpCnB,EAAe/gB,MAAM8gB,GAAUpP,SAAW,SAASlhB,GAC/CA,EAAM4hB,eAAe,EAGrBiQ,0BAA0B7xB,EAAMwxB,aAAa,EAE7CD,yBAAyBvxB,EAAMwxB,aAAa,CAChD,EACJ,CAMA,SAASK,0BAA0B/a,GAC/B,IAEU9M,EAFJ8nB,EAAgBhb,EAAKtT,cAAc,uBAAuB,EAC3DsuB,IACK9nB,EAAU8nB,EAActuB,cAAc,GAAG,EACzCuuB,EAAaD,EAActuB,cAAc,MAAM,EACjDwG,IAAW+nB,IACkB,GAAxB/nB,EAAQ9I,MAAM8wB,QACfD,EAAW7wB,MAAM+E,QAAU,EAC3B+D,EAAQ9I,MAAM8wB,OAAS,CAAC,EACxBhoB,EAAQ9I,MAAM+E,QAAU,IAExB8rB,EAAW7wB,MAAM+E,QAAU,EAC3B+D,EAAQ9I,MAAM8wB,OAAS,EACvBhoB,EAAQ9I,MAAM+E,QAAU,GAIxC,CAOA,SAASgsB,sCAAsCC,EAAYC,GACvD,IAAMC,EAAeF,EAAWxxB,iBAAiB,iCAAiC,EAClF,IAAM2xB,EAAeF,EAAWzxB,iBAAiB,iCAAiC,EAEV,CAAC,IAArEwxB,EAAWliB,UAAU/K,QAAQ,iCAAiC,GAC9DqtB,sBAAsBJ,CAAU,GAC8B,CAAC,IAA/DA,EAAWliB,UAAU/K,QAAQ,2BAA2B,GACQ,CAAC,IAAjEitB,EAAWliB,UAAU/K,QAAQ,6BAA6B,GACL,CAAC,IAAtDitB,EAAWliB,UAAU/K,QAAQ,kBAAkB,GACkB,CAAC,IAAlEitB,EAAWliB,UAAU/K,QAAQ,8BAA8B,EAE3DmtB,EAAarhB,QAAQ,IACjBshB,EAAathB,QAAQ,IACbwhB,EAAWjuB,OAASkuB,EAAWluB,OACP,aAApBkuB,EAAW5iB,MAA2C,UAApB4iB,EAAW5iB,KAC7C4iB,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWtuB,MAAQwuB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,EAKLH,EAAarhB,QAAQ,IACjBshB,EAAathB,QAAQ,IACbwhB,EAAWviB,YAAcwiB,EAAWxiB,YACZ,aAApBwiB,EAAW5iB,MAA2C,UAApB4iB,EAAW5iB,KAC7C4iB,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWtuB,MAAQwuB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,CACL,CAqBA,SAASI,uBACL,GAAKlyB,SAAS+C,cAAc,uDAAuD,EAAnF,CAIA7B,IAAIC,EAAIiY,YAAY,KAChB,IAAM+Y,EAAenyB,SAASC,iBAAiB,mBAAmB,EAC9DkyB,EAAa/wB,SACbuZ,cAAcxZ,CAAC,EACfgxB,EAAa7hB,QAAQ,CAAC+F,EAAM+V,KACxBgG,gCAAgC/b,EAAM+V,EAAOpsB,QAAQ,CACzD,CAAC,EAET,EAAG,GAAG,CAVN,CAWJ,CAQA,SAASoyB,gCAAgC/b,EAAMwZ,EAAUC,GACrD,IAYIuC,EAZEC,EAAMjc,EAAKtT,cAAc,kCAAkC,EAC5DuvB,IAGLA,EAAIC,SAAW,CAAA,GAETjC,EAActwB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SACnBkH,EAAKwY,YAAYyB,CAAW,GAExB+B,EAAQryB,SAASoE,cAAc,KAAK,GAClC0kB,GAAK,sBACXuJ,EAAM5xB,MAAM4b,MAAQ,OACpBgW,EAAM5xB,MAAMsb,OAAS,OACrBsW,EAAM5xB,MAAM+pB,WAAa,QACzB6H,EAAM5xB,MAAM+E,QAAU,EACtB6sB,EAAM5xB,MAAM8pB,SAAW,WACvB8H,EAAM5xB,MAAMib,IAAM,EAClB2W,EAAM5xB,MAAM+K,OAAS,UACrB6mB,EAAMG,QAAU,SAASngB,GACrBye,yBAAyBza,CAAI,CACjC,EACAic,EAAIhP,WAAW7iB,MAAM8pB,SAAW,WAChC+H,EAAIhP,WAAWuL,YAAYwD,CAAK,EACpC,CAKA,SAASI,yBACLvxB,IAAIwxB,EAAU1yB,SAASC,iBAAiB,QAAQ,EAC3B,EAAjByyB,EAAQtxB,QACRsxB,EAAQpiB,QAAQ,SAASqiB,GACjBA,EAA4C,CAAC,IAA7CA,EAAOC,IAAIpuB,QAAQ,mBAAmB,GACS,CAAC,IAAhDmuB,EAAOC,IAAIpuB,QAAQ,sBAAsB,GACU,CAAC,IAApDmuB,EAAOC,IAAIpuB,QAAQ,0BAA0B,GACD,CAAC,IAA7CmuB,EAAOC,IAAIpuB,QAAQ,mBAAmB,GACtCmuB,EAAO9wB,UAAUqf,SAAS,gBAAgB,GACD,CAAC,IAAxCyR,EAAOC,IAAIpuB,QAAQ,cAAc,GAA2D,CAAC,IAAhDmuB,EAAOC,IAAIpuB,QAAQ,sBAAsB,IAGpF,CAAA,IAAUgM,kBAAkBsD,IAAI,yBAAyB,GACC,EAA1DtD,kBAAkBsD,IAAI,yBAAyB,EAAE1S,QAC5B,KAAA,IAAduxB,EAAO7J,IAC0D,CAAC,IAAzEtY,kBAAkBsD,IAAI,yBAAyB,EAAEtP,QAAQmuB,EAAO7J,KAIpE+J,8BAA8BF,CAAM,CAE5C,CAAC,CAET,CA7oBA3yB,SAAS2C,iBAAiB,mBAAoB,WAC1CirB,gBAAgB7rB,UAAY,6BAC5Bb,IAAI4xB,EAAY,KA2BhB,SAASC,IACL7xB,IAAI8xB,EAAU,CAAC,MAAO,SAClBhd,EAASgd,EAAQvqB,KAAKC,MAAMD,KAAKE,OAAO,EAAIqqB,EAAQ5xB,MAAM,GAE9DpB,SAAS+C,cAAc,0BAA0B,EAAEd,OAAO,EAC1DjC,SAAS+C,cAAc,+BAA+B,EAAEd,OAAO,EAC/DjC,SAAS+C,cAAc,6BAA6B,EAAEtC,MAAMsb,OAAS,OAGrE7a,IAAI+xB,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQnd,GACR,IAAK,MACDxL,QAAQrE,IAAI,KAAK,EAEjB+sB,EAAM,wOACN,MACJ,IAAK,QACD1oB,QAAQrE,IAAI,OAAO,EACnB8sB,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAnzB,SAAS+C,cAAc,yBAAyB,EAAE+Y,YAAcmX,EAC1DG,EAAMpzB,SAASoE,cAAc,KAAK,EACxCgvB,EAAIrxB,UAAY,yBAChBqxB,EAAI5jB;cACE0jB;wDAC0CC;UAEhDvF,gBAAgBiB,YAAYuE,CAAG,CACnC,CA1DApzB,SAAS2C,iBAAiB,qBAAsB,WAC5CirB,gBAAgBntB,MAAMiB,QAAU,QAChCoxB,EAAY,IAAIptB,IACpB,CAAC,EAED1F,SAAS2C,iBAAiB,mBAAoB,WAC1C6H,QAAQrE,IAAI,kBAAkB,CAClC,CAAC,EAEDnG,SAAS2C,iBAAiB,sBAAuB,WACzCmwB,GAAa,IAAIptB,KAASotB,EAZR,IAalBhtB,WAAW,KACPitB,EAAW,CACf,EAfkB,KAeQ,IAAIrtB,KAASotB,EAAU,EAGrDhtB,WAAW,KACPitB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CD/yB,SAAS2C,iBAAiB,qBAAsB,WAC5C6H,QAAQrE,IAAI,oBAAoB,CACpC,CAAC,EAEDqE,QAAQrE,IAAI,kBAAkB,EAG9B,IAAM1F,EAAQT,SAASoE,cAAc,OAAO,EAmEtC6uB,GAlENxyB,EAAMqb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CN9b,SAASqzB,KAAKxE,YAAYpuB,CAAK,EAG/BmtB,gBAAgBntB,MAAM6yB;;;;;;;;;;;;;;;;;MAoBRtzB,SAASoE,cAAc,KAAK,GASpCmvB,GARNN,EAAMlxB,UAAY,yBAClBkxB,EAAMxyB,MAAM6yB;;MAGZL,EAAMnX,YAAc,cACpB8R,gBAAgBiB,YAAYoE,CAAK,EAGlBjzB,SAASoE,cAAc,KAAK,GAQrCovB,GAPND,EAAOxxB,UAAY,0BAGnB6rB,gBAAgBiB,YAAY0E,CAAM,EAClCvzB,SAAS+J,KAAK8kB,YAAYjB,eAAe,EAGrB5tB,SAASoE,cAAc,KAAK,GAChDovB,EAAYzxB,UAAY,+BACxByxB,EAAY/yB,MAAM6yB;;MAGlBE,EAAY1X,YAAc,gBAC1B8R,gBAAgBiB,YAAY2E,CAAW,CAC3C,CAAC,EAyYDhjB,kBAAkBC,IAAI,0BAA2B,EAAE,EACnD7K,OAAOjD,iBAAiB,OAAQ,WACrB,CAACgO,SAAS8iB,kCAIjB3tB,WAAW,WACPkoB,kBAAkB,EAClB0F,yBAAyB,EACzBC,4BAA4B,EAC5BlB,uBAAuB,CAC3B,EAAG,GAAI,EAEPP,qBAAqB,EACzB,CAAC,EAoFDhxB,IAAI0yB,4BAKJ,SAASf,8BAA8BF,GACnCzxB,IAAImxB,EAAQryB,SAASoE,cAAc,KAAK,EACxCiuB,EAAM5xB,MAAM4b,MAAQ,OACpBgW,EAAM5xB,MAAMsb,OAAS,OACrBsW,EAAM5xB,MAAM+pB,WAAa,QACzB6H,EAAM5xB,MAAM+E,QAAU,EACtB6sB,EAAM5xB,MAAM8pB,SAAW,WACvB8H,EAAM5xB,MAAMib,IAAM,EAClB2W,EAAMG,QAAU,SAASngB,GACrB,GAAoCxF,KAAAA,IAAhC+mB,4BAA2C,CAC3C1yB,IAAI2yB,EAAaxhB,EAAE0e,cAEf+C,GADJD,EAAWpzB,MAAM+E,QAAU,GACXxF,SAASoE,cAAc,KAAK,GAC5C0vB,EAAU/xB,UAAY,yBACtB8xB,EAAWhF,YAAYiF,CAAS,EAChC5yB,IAAI6yB,EAAmB,GACnB/zB,SAAS+C,cAAc,uCAAuC,IAC9DgxB,EAAmB/zB,SAAS+C,cAAc,uCAAuC,EAAEU,OASvFmP,sBANW,CACPC,OAAU,sCACVwP,0BAA6BvB,gBAAgB,EAC7C4C,4BAA+BqQ,CACnC,EAII,CACI5qB,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GAEc,EAD7B4d,4BAA8B,CAAA,KAC1B5d,EAAOzN,MAAMmf,QACb1nB,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,SAASqZ,GACrEA,EAAGrG,WAAWrhB,OAAO,CACzB,CAAC,GAEDjC,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,IAC5DqZ,EAAGrG,WAAW7iB,MAAMub,MAAQ,QAC5B2N,EAAGrG,WAAW9T,WAAawG,EAAOzN,MAAMof,OAC5C,CAAC,EACD3nB,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,IAC5DqZ,EAAG1nB,OAAO,CACd,CAAC,EAET,CACJ,CACJ,CACJ,CACJ,EACA0wB,EAAOrP,WAAW7iB,MAAM8pB,SAAW,WACnCoI,EAAOrP,WAAWuL,YAAYwD,CAAK,EACnCnxB,IAAIwxB,EAAUliB,kBAAkBsD,IAAI,yBAAyB,EACzD,CAAA,IAAU4e,IACVA,EAAU,IAEW,KAAA,IAAdC,EAAO7J,KACd4J,EAAQryB,KAAKsyB,EAAO7J,EAAE,EACtBtY,kBAAkBC,IAAI,0BAA2BiiB,CAAO,EAEhE,CAKA,SAASiB,8BACLzyB,IAAI8yB,EAAWh0B,SAASya,eAAe,4BAA4B,EAC/DuZ,GACAC,2BAA2BD,CAAQ,CAE3C,CAMA,SAASC,2BAA2BD,GAChC9yB,IAAIgzB,EAAgBF,EAAS/zB,iBAAiB,0BAA0B,EACpEk0B,EAAeH,EAAS/zB,iBAAiB,kCAAkC,EAC/Ei0B,EAAc5jB,QAAQ,IAClBqZ,EAAGpe,aAAa,2BAA4B,MAAM,EAClDoe,EAAGhnB,iBAAiB,QAAS,IACzBpD,EAAM4hB,eAAe,CACzB,CAAC,CACL,CAAC,EACDgT,EAAa7jB,QAAQ,IACjBqZ,EAAGhnB,iBAAiB,QAAS,IACzBpD,EAAM4hB,eAAe,EACrB5hB,EAAMyD,gBAAgB,EACtBoxB,YAAYzK,CAAE,CAClB,CAAC,CACL,CAAC,CACL,CAMA,SAAS0K,4BAA4BC,GACjCA,EAASxvB,cAAcyG,aAAa,2BAA4B,OAAO,EACvE+oB,EAASxvB,cAAcyvB,MAAM,CACjC,CAOA,SAASC,gCAAgCF,EAAUruB,GAC/C/E,IAKQuzB,EALJ3vB,EAAgBwvB,EAASxvB,cACiC,SAA1DA,EAAcvB,aAAa,0BAA0B,GACrDuB,EAAcyG,aAAa,2BAA4B,MAAM,EAE5DvL,SAAS+C,cAAc,mBAAmB,KACvC0xB,EAAaz0B,SAASoE,cAAc,KAAK,GAClCrC,UAAY,mBACvB0yB,EAAWh0B,MAAM+pB,WAAa,MAC9BiK,EAAWh0B,MAAMub,MAAQ,QACzByY,EAAWh0B,MAAMmqB,QAAU,MAC3B6J,EAAWjlB,UAAYvJ,EACvBnB,EAAc4vB,sBAAsB,cAAeD,CAAU,EAErE,CAMA,SAASL,YAAY9zB,GAMjBsS,sBALW,CACPC,OAAU,2BACVwP,0BAA6BriB,SAAS20B,kBAAkB,2BAA2B,EAAE,GAAGlxB,KAC5F,EAII,CACI0F,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GACc,CAAA,IAAzBA,EAAOzN,MAAMmf,QACb2M,4BAA4B/zB,CAAI,EAEhCk0B,gCAAgCl0B,EAAM0V,EAAOzN,MAAMof,OAAO,CAElE,CACJ,CACJ,CACJ,CAOA,SAAS2G,iBAAiBsG,GACtB,IAAM5L,EAAuC,UAA1B,OAAO4L,EAAc,OAAgBA,EAAQ/hB,OAAS,GACnE+T,EAAwC,OAA/BgO,EAAQrxB,aAAa,IAAI,EAAaqxB,EAAQrxB,aAAa,IAAI,EAAI,GAC5EsxB,EAA6C,UAA7B,OAAOD,EAAiB,UAAgBA,EAAQ7yB,UAAY,GAElF,MACI,CAAA,EACiD,CAAC,IAA9CinB,EAAWxkB,QAAQ,oBAAoB,GACD,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACM,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GAEDqI,KAAAA,IAAjC+nB,EAAQE,WAAWjzB,WACjB+yB,EAAQE,WAAWjzB,UAAUqf,SAAS,eAAe,GAChB,CAAC,IAA1C8H,EAAWxkB,QAAQ,gBAAgB,GACQ,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACA,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACY,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACQ,CAAC,IAA9CwkB,EAAWxkB,QAAQ,oBAAoB,GACJ,CAAC,IAApCwkB,EAAWxkB,QAAQ,UAAU,GACU,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACE,CAAC,IAApCwkB,EAAWxkB,QAAQ,UAAU,GACS,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACM,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACK,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACW,CAAC,IAA3CwkB,EAAWxkB,QAAQ,iBAAiB,GACH,CAAC,IAAlCwkB,EAAWxkB,QAAQ,QAAQ,GAA8C,CAAC,IAAnCoiB,EAAOpiB,QAAQ,aAAa,GACpB,CAAC,IAAhDoiB,EAAOpiB,QAAQ,0BAA0B,GACF,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACW,CAAC,IAA7CoiB,EAAOpiB,QAAQ,uBAAuB,GAMD,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACO,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GAChCqtB,sBAAsB+C,CAAO,GACa,CAAC,IAA3C5L,EAAWxkB,QAAQ,iBAAiB,GACA,CAAC,IAArCwkB,EAAWxkB,QAAQ,WAAW,GACa,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACa,CAAC,IAAnDwkB,EAAWxkB,QAAQ,yBAAyB,GAED,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACE,CAAC,IAApCqwB,EAAcrwB,QAAQ,OAAO,GAGPqI,KAAAA,IAAtB+nB,EAAQ/yB,WACR+yB,EAAQ/yB,UAAUqf,SAAS,sBAAsB,GAErD6T,iBAAiBH,EAAS,UAAU,EAM5C,CAOA,SAAS/C,sBAAsB+C,GAC3B1zB,IAAI8U,EAAS,CAAA,EACb,IAAMgf,EAAwBh1B,SAAS+C,cAAc,+BAA+B,EAUpF,OAFIiT,EANmB,UAAnB,OAAO4e,GAAoC,OAAZA,GACL,OAA1BI,GACAA,EAAsB5f,aAAa,mBAAmB,GACM,KAA5D4f,EAAsBzxB,aAAa,mBAAmB,GACuB,OAA7EyxB,EAAsBjyB,cAAc,mCAAmC,EAE9D6xB,IAAYI,EAAsBjyB,cAAc,mCAAmC,EAEzFiT,CACX,CAQA,SAAS8a,yBAAyBza,GAE9B,IAAM+J,EAAgB,GACtBA,EAAc,GAAKE,6BAA6BjK,CAAI,EACpDsK,gCAAiCP,CAAc,EAE/C,IAAMxc,EAAO,CACT8f,4BAA+BlT,kBAAkBsD,IAAI,0BAA0B,CACnF,EACImhB,EAAQ5e,EAAKjX,UAGjB61B,EAFQr1B,MAAMC,UAAUC,MAAMC,KAAKk1B,CAAK,GAElC3kB,QAAS,SAAUhQ,EAAMsvB,GACR,KAAdtvB,EAAKuD,KACND,EAAK,SAAWgsB,GAAKtvB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAEDmP,sBACIhP,EACA,CACIuF,MAAO,CAAA,EACPjG,SAAU,SAAU8S,EAAQpS,EAAM4E,EAAQ4K,GAEtCge,0BAA0B/a,CAAI,EAE9B,IAAM6e,EACF7e,EAAKjB,aAAa,QAAQ,GACyB,CAAC,IAApDiB,EAAK9S,aAAa,QAAQ,EAAEiB,QAAQ,SAAS,EAEjD,GAAsBqI,KAAAA,IAAjBmJ,EAAOzN,OAAuCsE,KAAAA,IAAhBmJ,EAAOpS,MACpBiJ,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAAE,CAACyN,EAAOzN,MAAMmf,QACjD,CAEE,IAAK,IAAMiC,KAAMtT,EAAKpW,iBAAiB,oCAAoC,EACvE0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,2CAA2C,EAC9E0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,yCAAyC,EAC5E0pB,EAAG1nB,OAAO,EAId,GAAuB4K,KAAAA,IAAnBwJ,EAAKxU,WAA2BwU,EAAKxU,UAAUqf,SAAS,cAAc,EAUtE,OATMmR,EAAQryB,SAASya,eAAe,qBAAqB,IAEvD4X,EAAMpwB,OAAO,EAGjB,MADMqwB,EAAMjc,EAAKtT,cAAc,kCAAkC,KAE7DuvB,EAAIC,SAAW,CAAA,EACfD,EAAIiC,MAAM,IAMlB,GAAoC1nB,KAAAA,IAA/BwJ,EAAKE,QAAQiY,cAA8B,CAC5CttB,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAMvD,OALAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAA5CnsB,KACAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAGA,GAAIle,EAAKjB,aAAa,QAAQ,GACuC,CAAC,IAAjEiB,EAAK9S,aAAa,QAAQ,EAAEiB,QAAQ,sBAAsB,EAC7D,CACEtD,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAOvD,OANAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAC5C3a,EAAKoK,SAAWpK,EAAK4a,iBADrBpsB,KAEAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAGA,GAAIW,EAAoB,CACpBh0B,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAOvD,OANAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAC5C3a,EAAKoK,SAAWpK,EAAK4a,iBADrBpsB,KAEAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAEA,IAmBW5K,EAIAA,EAvBLyL,EAAU/e,EAEV2Z,GADN3Z,EAAKvR,cAAcub,YAAYhK,CAAI,EACtBA,EAAKqa,WACZN,EAAe/Z,EAAKsa,kBAC1BzvB,IAAIm0B,EAAoB,CAAA,EAExB7D,sCAAsC4D,EAAShF,CAAY,EAGvDA,GAC2B,UAA3B,OAAOA,EAAatH,IACkB,CAAC,IAAvCsH,EAAatH,GAAGtkB,QAAQ,QAAQ,IAEhC6wB,EAAoB,CAAA,GAGxBrF,EAAK7qB,MAAOirB,CAAa,EAGzB,IAAWzG,KAAMyG,EAAanwB,iBAAiB,oCAAoC,EAC/E0pB,EAAG1nB,OAAO,EAGd,IAAW0nB,KAAMyG,EAAanwB,iBAAiB,2CAA2C,EACtF0pB,EAAG1nB,OAAO,EAIdf,IAAIo0B,EAAalF,EAAanwB,iBAAiB,qBAAqB,EACpE,GAA2B,IAAtBq1B,EAAWl0B,OAOZ,OANAk0B,EAAW,GAAGf,MAAM,EAApBe,KACID,GACAvvB,WAAW,WACPkoB,kBAAkB,CACtB,EAAG,IAAI,GAMf,GAA2B,KAD3BsH,EAAalF,EAAanwB,iBAAiB,oBAAoB,GAC/CmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAMxB,GAA2B,KAD3Be,EAAalF,EAAanwB,iBAAiB,+BAA+B,GAC1DmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAIxB,GAA2B,KAD3Be,EAAalF,EAAanwB,iBAAiB,4BAA4B,GACvDmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAMG,KAD3Be,EAAalF,EAAanwB,iBAAiB,oCAAoC,GAC/DmB,QACZk0B,EAAW,GAAGf,MAAM,CAE5B,EACsB1nB,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAACyN,EAAOzN,MAAMmf,SAC5B7a,KAAAA,IAAhBmJ,EAAOpS,MAA8CiJ,KAAAA,IAAxBmJ,EAAOpS,KAAKyC,WAE1C6X,oBAAoBlI,CAAM,EAEtBkf,IACApvB,WAAW,WACP9F,SAASsH,SAASiuB,OAAO,CAC7B,EAAG,GAAI,CAGnB,CACJ,CAAC,CACT,CAKA,SAAS7B,2BAGL8B,gCAFcx1B,SAASyvB,qBAAqB,MAAM,CAEb,EAFrC,IAIMD,EAASxvB,SAASyvB,qBAAqB,QAAQ,EACrD,GAAqB,EAAhBD,EAAOpuB,OACR,IAAMF,IAAI+nB,EAAI,EAAGA,EAAIuG,EAAOpuB,OAAQ6nB,CAAC,GACjC,GAAkC,MAA7BuG,EAAOvG,GAAGyG,gBAAf,CAIA,IAAMC,EAAcH,EAAOvG,GAAGyG,gBAAgB3gB,MAE9C,GAA4B,IAAvB4gB,EAAYvuB,OACb,OAGJo0B,gCAAgC7F,EAAaH,EAAOvG,GAAGyG,eAAe,CARtE,CAWZ,CAQA,SAAS8F,gCAAgCzmB,EAAO+gB,EAAiB9vB,UAC7D,IACWqW,EAYAuQ,EAbL6O,EAAgB,GACtB,IAAWpf,KAAQtH,EAAO,CACtB,IAAM2mB,EAAarf,EAAK9S,aAAa,IAAI,EACrCmyB,GAA+C,CAAC,IAAlCA,EAAWlxB,QAAQ,QAAQ,GACzCixB,EAAcp1B,KAAKq1B,CAAU,EAE7BA,GAAmD,CAAC,IAAtCA,EAAWlxB,QAAQ,YAAY,GACzBqI,KAAAA,IAAnBwJ,EAAKxU,WAA2BwU,EAAKxU,UAAUqf,SAAS,sBAAsB,GAE/EuU,EAAcp1B,KAAKq1B,CAAU,CAErC,CAEA,IAAW9O,KAAU6O,EAAe,CAChC,IAAMpf,EAAOyZ,EAAerV,eAAemM,CAAM,EACjDvQ,EAAKsf,6BAA+Btf,EAAKoK,SACzCpK,EAAKoK,SAAWmV,+BACpB,CACJ,CAMA,SAASA,gCAAgCvf,GACrCA,EAAK8K,eAAe,EACpB9K,EAAKwf,yBAAyB,EAC9B,IAAMC,EAAYzf,EAClBA,EAAOA,EAAKvT,OAEZ,IAAMwtB,EAActwB,SAASoE,cAAc,OAAO,EAO5Cgc,GANNkQ,EAAYzsB,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SACnBkH,EAAKwY,YAAYyB,CAAW,EAGN,IACtBlQ,EAAc,GAAKE,6BAA6BjK,CAAI,EACpDsK,gCAAgCP,CAAa,EAC7C/J,EAAKhR,OAAO6iB,+BAA+B,QAAQ,CAAC,EAEpD,IAAMtkB,EAAO,GACTqxB,EAAQ5e,EAAKjX,UAGjB61B,EAFQr1B,MAAMC,UAAUC,MAAMC,KAAKk1B,CAAK,GAElC3kB,QAAS,SAAUhQ,EAAMsvB,GACR,KAAdtvB,EAAKuD,KACND,EAAK,SAAWgsB,GAAKtvB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAEDmP,sBACIhP,EACA,CACIuF,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GACf,GAAsBnJ,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAAE,CAACyN,EAAOzN,MAAMmf,QAAU,CACzDrR,EAAKoK,SAAW,KAGhB,IAAK,IAAMkJ,KAAMtT,EAAKpW,iBAAiB,oCAAoC,EACvE0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,2CAA2C,EAC9E0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,yCAAyC,EAC5E0pB,EAAG1nB,OAAO,EAIVoU,EAAKsf,wCAAwC3U,WACzC+U,EAAUjwB,WAAW,WACrBuQ,EAAKsf,6BAA6B51B,KAAKsW,EAAMyf,CAAS,CAC1D,EAAG,GAAG,EACNrI,aAAasI,CAAO,GAJxB,IAOMT,EAAajf,EAAKtT,cAAc,sBAAsB,EAC5D,GAAIuyB,EAEA,OADAA,KAAAA,EAAWf,MAAM,CAGzB,CAEqB1nB,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAACyN,EAAOzN,MAAMmf,SAC5CxJ,oBAAoBlI,CAAM,CAElC,CACJ,CAAC,CACT,CAOA,SAASic,SAAStI,GACd,OAAIA,EAAG1H,SAAW0H,EAAGqM,SACVrM,EAAG1H,QACLle,OAAO,GAAYkyB,EAAOpmB,QAAQ,EAClCqmB,IAAI,GAAYD,EAAOxyB,KAAK,EACd,aAAZkmB,EAAGxa,MAAmC,UAAZwa,EAAGxa,KAC7Bwa,EAAGqI,SAAuB,KAE1BrI,EAAGlmB,KAElB,CASA,SAASsxB,iBAAiBH,EAASuB,GAC/Bj1B,IAAI2D,EAAS+vB,EAAQ9vB,cACrB,KAAOD,GAAQ,CACX,GAAIA,EAAOhD,UAAUqf,SAASiV,CAAY,EACtC,MAAO,CAAA,EAEXtxB,EAASA,EAAOC,aACpB,CACA,MAAO,CAAA,CACX,CAKA,SAASsxB,qCACL,IAAMC,EAAoB,CAAC,gBAAiB,gBAAiB,mBACvDC,EAAmBt2B,SAASoE,cAAc,KAAK,EACrDkyB,EAAiBz0B,UAAY,6BAC7B,IAAKX,IAAIC,EAAI,EAAGA,EAAIk1B,EAAkBj1B,OAAQD,CAAC,GAAI,CAC/C,IAAMo1B,EAAyBv2B,SAASoE,cAAc,MAAM,EAC5DmyB,EAAuB10B,UAAY,aAAew0B,EAAkBl1B,GACpEo1B,EAAuBC,UAAY,IACnCF,EAAiBjxB,OAAOkxB,CAAsB,CAClD,CACA,OAAOD,CACX,CAKA,SAASlV,0BAA0B7hB,EAAQ,CAAA,GACvC2B,IAAIu1B,EAAc,CAAA,EACdC,EAAgB,GAChBC,EAAe,GACK,aAApB,OAAOhmB,UACPlR,KAAKkZ,oBAAoB,QAASyI,yBAAyB,EAE3DqV,EAAch3B,KAEdkR,SAASimB,yBAA2B,CAAA,EACpCF,EAAgB/lB,SAASkmB,aACzBF,EAAehmB,SAASkP,mBACQ,aAAzB,OAAOiX,gBACdJ,EAAgBI,cAAcxqB,YAC9BqqB,EAAeG,cAAcC,kBAIjC/2B,SAAS+J,KAAKlI,UAAUC,IAAI,kBAAkB,EAE9CZ,IAQQ81B,EAQAC,EAOAC,EAWAC,EAlCJC,EAAep3B,SAASya,eAAe,aAAa,EACnD2c,GAiDDA,EAAa7rB,aAAa,QAAS,kBAAkB,EACpB,aAA7B,OAAOtD,mBAAqCA,kBAAkBovB,2BAC9Dr3B,SAASya,eAAe,kBAAkB,EAAEjL,UAAYvH,kBAAkBovB,2BAE1Er3B,SAASya,eAAe,kBAAkB,EAAEjL,UAAYsnB,cAAcO,8BAnDtEC,EAAet3B,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uCAAuC,EAC1E+rB,EAAa/rB,aAAa,KAAM,aAAa,GAGzCyrB,EAAqBh3B,SAASoE,cAAc,MAAM,GACnCvC,UAAY,uCAC3B01B,EAAcv3B,SAASoE,cAAc,GAAG,GAChCoyB,UAAYE,EACxBa,EAAYhsB,aAAa,QAAS,mCAAmC,EACrEyrB,EAAmB3xB,OAAOkyB,CAAW,GAGjCN,EAAmBj3B,SAASoE,cAAc,KAAK,GAClCmH,aAAa,KAAM,kBAAkB,EACtD0rB,EAAiB1rB,aAAa,QAAS,qCAAqC,EAC5E0rB,EAAiBx2B,MAAMub,MAAQ,SAI3Bkb,EAAmBl3B,SAASoE,cAAc,GAAG,GAChC0kB,GAAK,4CACW,aAA7B,OAAO7gB,mBAAqCA,kBAAkBovB,2BAC9DH,EAAiBV,UAAYvuB,kBAAkBovB,2BAE/CH,EAAiBV,UAAYM,cAAcO,2BAE/CH,EAAiB3rB,aAAa,QAAS,qCAAqC,GAIxE4rB,EAAoBn3B,SAASoE,cAAc,GAAG,GAChC0kB,GAAK,6CACU,aAA7B,OAAO7gB,mBAAqCA,kBAAkBuvB,0BAC9DL,EAAkBX,UAAYvuB,kBAAkBuvB,0BAEhDL,EAAkBX,UAAYM,cAAcU,0BAIhDP,EAAiB5xB,OAAO6xB,CAAgB,EACxCD,EAAiB5xB,OAAO8xB,CAAiB,EACzCG,EAAajyB,OAAO2xB,CAAkB,EACtCM,EAAajyB,OAAO4xB,CAAgB,EACpCK,EAAajyB,OAAO+wB,mCAAmC,CAAC,EACxDp2B,SAAS+J,KAAK1E,OAAOiyB,CAAY,GAUrCG,yBAAyBl4B,EAAOo3B,EAAcF,CAAW,CAC7D,CAOA,SAASgB,yBAAyBl4B,EAAOsgB,EAAmB4W,GACxD,GAAIl3B,GAASk3B,EAAa,CAEtB,IACI7yB,EAAO,CACPgS,sBAFyBxD,wBAAwB,EAGjDyD,SAAU7V,SAASsH,SAASC,KAC5BuO,SAAU9V,SAAS8V,SACnB4hB,cAAe,EACnB,EACIC,EAA0B,GAC9B,IAAKz2B,IAAIC,EAAI,EAAGA,EAAI0e,EAAkBze,OAAQD,CAAC,GAAI,CAGN,KAAA,IAA9B0e,EAAkB1e,GAAGoG,MACqB,IAAjDsY,EAAkB1e,GAAGoG,KAAK/C,QAAQ,SAAS,IAE3CjF,EAAM4hB,eAAe,EACrBxQ,SAASimB,yBAA2B,CAAA,GAIxC11B,IAAI02B,EAAe53B,SAASoE,cAAc,KAAK,EAC/CwzB,EAAarsB,aAAa,QAAS,eAAe,EAClDhD,MAAMsX,EAAkB1e,EAAE,EAAEkE,OAAOuyB,CAAY,EAG/CD,EAAwBx2B,GAAK0e,EAAkB1e,GAAGoV,QAAQshB,cAC9D,CAGAj0B,EAAK8zB,cAAgBxwB,KAAKC,UAAUwwB,CAAuB,EAGhB,SAAtC1vB,kBAAkBG,gBACnBuK,sBACI,qBACA,CACI/O,KAAMA,EACNsF,OAAQ,OACRhG,SAAU,SAAS8S,GAEfjG,YAAY,6BAA8BY,SAASmnB,oBAAqB,EAAE,EAC1EC,8BAA8B/hB,EAAQ6J,EAAmB4W,CAAW,CACxE,EACA/sB,gBAAiB,SAASsuB,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,GAIAp0B,EAAKiP,OAAS,qBACdD,sBACIhP,EACA,CACI6I,QAAS,CAAA,EACTvJ,SAAU,SAAS8S,GACfxL,QAAQrE,IAAI,QAAQ,EACpBqE,QAAQrE,IAAI6P,CAAM,EAGlBjG,YAAY,6BAA8BY,SAASmnB,oBAAqB,EAAE,EAC1EC,8BAA8B/hB,EAAQ6J,EAAmB4W,CAAW,CACxE,EACA/sB,gBAAiB,SAASsuB,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,EAER,KAAO,CACH,IAAMrB,EAAe9W,EAAkBtJ,QAAQshB,eAC3Cj0B,EAAO,CACP8zB,cAAexwB,KAAKC,UAAU,CAACgxB,EAAGxB,CAAY,CAAC,CACnD,EAGIiB,EAAe53B,SAASoE,cAAc,KAAK,EAC/CwzB,EAAarsB,aAAa,QAAS,eAAe,EAClDsU,EAAkBgP,YAAY+I,CAAY,EAE1C3N,qBACI,CACIpX,OAAU,qBACV6kB,cAAiB9zB,EAAK8zB,aAC1B,EACA,CACIx0B,SAAY,SAAS8S,GACjB+hB,8BAA8B/hB,EAAQ6J,EAAmB,CAAA,CAAK,CAClE,EACApT,QAAW,CAAA,CACf,CACJ,CACJ,CACJ,CAOA,SAASsrB,8BAA8B/hB,EAAQ6J,EAAmB4W,EAAc,CAAA,GACxEzgB,EAAOoiB,SAAyC,CAAA,IAA9BpiB,EAAOpS,KAAK,GAAGy0B,WAEjCvyB,WAAW,WAEP5E,IAAIosB,EAAQttB,SAASya,eAAe,aAAa,EACjD,GAAc,OAAV6S,EAAgB,CAChBpsB,IAAI6Z,EAAQ,GACZ,GAAI0b,EAAa,CACbv1B,IAAIo3B,EACJtiB,EAAOpS,KAAK0M,QAAQ,IACZioB,EAAIC,gBAAkB/B,EAAYlgB,QAAQshB,iBAC1CS,EAAoBC,EAE5B,CAAC,EAEDxd,EAAQud,EAAkBG,cAAclZ,MAAM,MAAM,EAAE,EAC1D,MACIxE,EAAQ/E,EAAOpS,KAAK,GAAG60B,cAG3Bv3B,IAAIw3B,EAAYpL,EAAMvqB,cAAc,4CAA4C,EAE5E41B,EAAkB34B,SAASoE,cAAc,GAAG,EAqB5CkS,GApBJqiB,EAAgBptB,aAAa,QAAS,wCAAwC,EAC9EotB,EAAgBnC,UAAYzb,EACK,aAA7B,OAAO9S,mBAAqCA,kBAAkB2wB,yBAC9DD,EAAgB1F,MAAQhrB,kBAAkB2wB,yBAE1CD,EAAgB1F,MAAQ6D,cAAc8B,yBAGtCF,IACiC,aAA7B,OAAOzwB,mBAAqCA,kBAAkB4wB,wBAC9DH,EAAUlpB,UAAYvH,kBAAkB4wB,wBACpC,SAAWF,EAAgBppB,UAE/BmpB,EAAUlpB,UAAYsnB,cAAc+B,wBAChC,SAAWF,EAAgBppB,UAGnCmpB,EAAUntB,aAAa,QAAS,sBAAsB,GAG5C+hB,EAAMvqB,cAAc,6BAA6B,GAK3D+1B,GAJAxiB,GACAA,EAAQrU,OAAO,EAGFqrB,EAAMvqB,cAAc,6CAA6C,GAK9Eg2B,GAJAD,GACAA,EAAW72B,OAAO,EAGFjC,SAASoE,cAAc,MAAM,GACjD20B,EAAcl3B,UAAY,sDACrB7B,SAAS+C,cAAc,oCAAoC,IACxDuG,EAAStJ,SAASoE,cAAc,QAAQ,EACX,aAA7B,OAAO6D,mBAAqCA,kBAAkB+wB,gBAC9D1vB,EAAOktB,UAAYvuB,kBAAkB+wB,gBAErC1vB,EAAOktB,UAAYM,cAAckC,gBAErC1vB,EAAOzH,UAAY,oCACnByH,EAAO3G,iBAAiB,QAAS,WAC7B3C,SAAS+J,KAAKlI,UAAUI,OAAO,kBAAkB,EACjDqrB,EAAM/hB,aAAa,QAAS,cAAc,EAC1C0tB,iBAAiBpZ,EAAmB7J,CAAM,EAElB,aAApB,OAAOrF,UAA4BA,SAASimB,0BAA4BH,GACxEA,EAAYlC,MAAM,CAE1B,CAAC,EACDwE,EAAc1zB,OAAOiE,CAAM,EAC3BgkB,EAAMjoB,OAAO0zB,CAAa,EAElC,CACJ,EAAG,GAAI,EAEHtC,EACIzgB,EAAOoiB,SACPH,kBAAkB,EACe,aAA7B,OAAOhwB,mBAAqCA,kBAAkBixB,iBAC9DhB,oBAAoBjwB,kBAAkBixB,iBAAmB,KAAOljB,EAAOpS,KAAK,GAAG+jB,OAAO,EAEtFuQ,oBAAoBpB,cAAcoC,iBAAmB,KAAOljB,EAAOpS,KAAK,GAAG+jB,OAAO,IAGtFsQ,kBAAkB,EACe,aAA7B,OAAOhwB,mBAAqCA,kBAAkBkxB,wBAC9DjB,oBAAoBjwB,kBAAkBkxB,wBAA0B,KAAOnjB,EAAOzN,MAAMof,OAAO,EAE3FuQ,oBAAoBpB,cAAcqC,wBAA0B,KAAOnjB,EAAOpS,KAAK,GAAG+jB,OAAO,GAIjGnd,QAAQrE,IAAI,SAAU6P,CAAM,CAGxC,CAKA,SAASiiB,oBACqC,KAAA,IAA/BtnB,SAASkP,mBAChBlP,SAASkP,kBAAkBvP,QAAQ,SAAS6E,GACxCA,EAAQxS,iBAAiB,QAASye,yBAAyB,CAC/D,CAAC,CAET,CAMA,SAAS8W,oBAAoBvQ,GAClBA,EAAAA,IAC8B,aAA7B,OAAO1f,mBAAqCA,kBAAkBmxB,uBACpDnxB,kBAEA6uB,eAFkBsC,uBAMpCl4B,IAAIosB,EAAQttB,SAASya,eAAe,aAAa,EACjDvZ,IAAIm4B,EAAYr5B,SAASya,eAAe,kBAAkB,EAC5C,OAAV6S,IACAttB,SAAS+J,KAAKlI,UAAUI,OAAO,kBAAkB,EAChB,aAA7B,OAAOgG,mBAAqCA,kBAAkBqxB,uBAC9DD,EAAU7C,UAAYvuB,kBAAkBqxB,uBAAyB,KAAO3R,EAExE0R,EAAU7C,UAAYM,cAAcwC,uBAAyB,KAAO3R,EAExE7hB,WAAW,WACPwnB,EAAM/hB,aAAa,QAAS,cAAc,CAC9C,EAAG,GAAI,EAEf,CAOA,SAAS0tB,iBAAiBM,EAAcC,GACpC,GAA0B,EAAtBD,EAAan4B,OACb,IAAKF,IAAIC,EAAI,EAAGA,EAAIo4B,EAAan4B,OAAQD,CAAC,GAAI,CAE1CD,IAAIo3B,EAOJ,GANAkB,EAAe51B,KAAK0M,QAAQ,IACpBioB,EAAIC,gBAAkBe,EAAap4B,GAAGoV,QAAQshB,iBAC9CS,EAAoBC,EAE5B,CAAC,EAEoC,CAAA,IAAjCD,EAAkBD,WAClB,OAGJ,GACoC,KAAA,IAAzBkB,EAAap4B,GAAGoG,MAEyB,IAA5CgyB,EAAap4B,GAAGoG,KAAK/C,QAAQ,SAAS,GACG,IAAzC+0B,EAAap4B,GAAGoG,KAAK/C,QAAQ,MAAM,EA6BvC+0B,EAAap4B,GAAGU,UAAUC,IAAI,SAAS,EAEvCgE,WAAW,KACP2zB,2BAA2BnB,EAAmBiB,EAAap4B,EAAE,CACjE,EAAG,GAAI,MA/BT,CACED,IAAIw4B,EACJ,GAAgD,IAA5CH,EAAap4B,GAAGoG,KAAK/C,QAAQ,SAAS,EACtCk1B,EAAiB,cACd,CAAA,GAA6C,IAAzCH,EAAap4B,GAAGoG,KAAK/C,QAAQ,MAAM,EAG1C,SAFAk1B,EAAiB,MAGrB,CACAx4B,IAAIy1B,EAAe4C,EAAap4B,GAAGoG,KAAKxG,QAAQ24B,EAAgB,EAAE,EAC9DC,EAAqBJ,EAAap4B,GAAGqO,UACzC+pB,EAAap4B,GAAGqO,UAAYmqB,EAAmB54B,QAC3C41B,EACA2B,EAAkBG,aACtB,EACAc,EAAap4B,GAAGoG,KAAOmyB,EAAiBpB,EAAkBG,cAE1Dc,EAAap4B,GAAGlB,iBAAiB,0BAA0B,EAAEqQ,QAAQ,IACjEpP,IAAI04B,EAA+B,GACnCJ,EAAe51B,KAAK0M,QAAQ,IACpBioB,EAAIC,gBAAkB7O,EAAGpT,QAAQshB,iBACjC+B,EAA+BrB,EAAIE,cAE3C,CAAC,EACD9O,EAAGna,UAAYoqB,CACnB,CAAC,CACL,CAQAL,EAAap4B,GAAGwX,oBAAoB,QAASyI,yBAAyB,CAC1E,KACG,CACHlgB,IAAIo3B,EAAoBkB,EAAe51B,KAAK,GAC5C21B,EAAa13B,UAAUC,IAAI,SAAS,EAEpCgE,WAAW,KACP2zB,2BAA2BnB,EAAmBiB,CAAY,CAC9D,EAAG,GAAI,EACPA,EAAa5gB,oBAAoB,QAASyI,yBAAyB,CACvE,CACJ,CAMA,SAASqY,2BAA2B1tB,EAAU8tB,GAC1CA,EAActuB,aAAa,QAAS,EAAE,EACtCsuB,EAAcjuB,gBAAgB,OAAO,EACrCkuB,mBAAmBD,EAAe9tB,EAAS0sB,aAAa,CAC5D,CAMA,SAASqB,mBAAmBh3B,EAAQiY,GAChCjY,EAAO0M,UAAY1M,EAAO0M,UAAUzO,QAAQ,kDAAmDga,EAAQ,IAAI,CAC/G"} \ No newline at end of file diff --git a/js/apbct-public-bundle_full-protection.min.js.map b/js/apbct-public-bundle_full-protection.min.js.map index 1f926ac51..2a164184d 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_int-protection.min.js.map b/js/apbct-public-bundle_int-protection.min.js.map index aa2562bc2..1a19e059f 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n \n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n \n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * \n */\n// eslint-disable-next-line no-unused-vars\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file diff --git a/js/src/apbct-public--8--browser-check.js b/js/src/apbct-public--8--browser-check.js index 0c1eb2e50..3734299c6 100644 --- a/js/src/apbct-public--8--browser-check.js +++ b/js/src/apbct-public--8--browser-check.js @@ -71,7 +71,7 @@ document.addEventListener('DOMContentLoaded', function() { }); console.log('DOMContentLoaded'); - + // Create and add styles const style = document.createElement('style'); style.textContent = ` @@ -147,7 +147,7 @@ document.addEventListener('DOMContentLoaded', function() { `; title.textContent = 'botDetector'; loaderContainer.appendChild(title); - + // Create loader element const loader = document.createElement('div'); loader.className = 'ct-browser-check-loader'; @@ -168,9 +168,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * + * eslint-disable-next-line no-unused-vars */ -// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle.js b/js/src/apbct-public-bundle.js index 2b76c2e68..144a55547 100644 --- a/js/src/apbct-public-bundle.js +++ b/js/src/apbct-public-bundle.js @@ -4325,7 +4325,7 @@ document.addEventListener('DOMContentLoaded', function() { }); console.log('DOMContentLoaded'); - + // Create and add styles const style = document.createElement('style'); style.textContent = ` @@ -4401,7 +4401,7 @@ document.addEventListener('DOMContentLoaded', function() { `; title.textContent = 'botDetector'; loaderContainer.appendChild(title); - + // Create loader element const loader = document.createElement('div'); loader.className = 'ct-browser-check-loader'; @@ -4422,9 +4422,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * + * eslint-disable-next-line no-unused-vars */ -// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle_ext-protection.js b/js/src/apbct-public-bundle_ext-protection.js index 133f573a1..fce029ab8 100644 --- a/js/src/apbct-public-bundle_ext-protection.js +++ b/js/src/apbct-public-bundle_ext-protection.js @@ -4325,7 +4325,7 @@ document.addEventListener('DOMContentLoaded', function() { }); console.log('DOMContentLoaded'); - + // Create and add styles const style = document.createElement('style'); style.textContent = ` @@ -4401,7 +4401,7 @@ document.addEventListener('DOMContentLoaded', function() { `; title.textContent = 'botDetector'; loaderContainer.appendChild(title); - + // Create loader element const loader = document.createElement('div'); loader.className = 'ct-browser-check-loader'; @@ -4422,9 +4422,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * + * eslint-disable-next-line no-unused-vars */ -// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle_full-protection.js b/js/src/apbct-public-bundle_full-protection.js index 46966f57a..afc3133a8 100644 --- a/js/src/apbct-public-bundle_full-protection.js +++ b/js/src/apbct-public-bundle_full-protection.js @@ -5924,7 +5924,7 @@ document.addEventListener('DOMContentLoaded', function() { }); console.log('DOMContentLoaded'); - + // Create and add styles const style = document.createElement('style'); style.textContent = ` @@ -6000,7 +6000,7 @@ document.addEventListener('DOMContentLoaded', function() { `; title.textContent = 'botDetector'; loaderContainer.appendChild(title); - + // Create loader element const loader = document.createElement('div'); loader.className = 'ct-browser-check-loader'; @@ -6021,9 +6021,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * + * eslint-disable-next-line no-unused-vars */ -// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; diff --git a/js/src/apbct-public-bundle_int-protection.js b/js/src/apbct-public-bundle_int-protection.js index 40b119248..a08be6692 100644 --- a/js/src/apbct-public-bundle_int-protection.js +++ b/js/src/apbct-public-bundle_int-protection.js @@ -4766,7 +4766,7 @@ document.addEventListener('DOMContentLoaded', function() { }); console.log('DOMContentLoaded'); - + // Create and add styles const style = document.createElement('style'); style.textContent = ` @@ -4842,7 +4842,7 @@ document.addEventListener('DOMContentLoaded', function() { `; title.textContent = 'botDetector'; loaderContainer.appendChild(title); - + // Create loader element const loader = document.createElement('div'); loader.className = 'ct-browser-check-loader'; @@ -4863,9 +4863,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * + * eslint-disable-next-line no-unused-vars */ -// eslint-disable-next-line no-unused-vars function ctBrowserCheckHide() { document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; From 2af72251dcbbf73b64fb7de88842f5d093747c9b Mon Sep 17 00:00:00 2001 From: svfcode Date: Mon, 5 May 2025 15:22:24 +0300 Subject: [PATCH 4/5] fix eslint --- js/apbct-public--8--browser-check.min.js.map | 2 +- js/apbct-public-bundle_ext-protection.min.js.map | 2 +- js/apbct-public-bundle_full-protection.min.js.map | 2 +- js/apbct-public-bundle_int-protection.min.js.map | 2 +- js/src/apbct-public--8--browser-check.js | 3 +-- js/src/apbct-public-bundle.js | 3 +-- js/src/apbct-public-bundle_ext-protection.js | 3 +-- js/src/apbct-public-bundle_full-protection.js | 3 +-- js/src/apbct-public-bundle_int-protection.js | 3 +-- 9 files changed, 9 insertions(+), 14 deletions(-) diff --git a/js/apbct-public--8--browser-check.min.js.map b/js/apbct-public--8--browser-check.min.js.map index 7449bf71c..0d82b46ed 100644 --- a/js/apbct-public--8--browser-check.min.js.map +++ b/js/apbct-public--8--browser-check.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EA4KpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAjLAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KA2BhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACR,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CA1DA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file +{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EA2KpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAhLAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KA2BhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACR,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CA1DA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file diff --git a/js/apbct-public-bundle_ext-protection.min.js.map b/js/apbct-public-bundle_ext-protection.min.js.map index 90bb30071..31d30cb53 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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":"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,IAAME,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,IAbKL,IAC3BM,EAAsBnE,SAASoE,cAAcP,CAAI,EAAErE,YAChD,CAAE6E,QAAS,CAAC,CAACC,YAAaC,oBAAoBC,QAAQL,CAAmB,CAAE,IAW/BJ,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,KACVC,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,KACVC,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,GAwBNC,GAvBAH,GAAOA,EAAII,QACXF,EAAIG,IAAM,CACNL,IAAOA,EAAII,QACXE,KAAUN,EAAIO,UAA0B,CAAA,EACxCC,GAAQR,EAAIS,YAAgCC,QAAkB,CAAA,EAC9DC,IAASX,EAAIY,cAAoCC,UAAsB,CAAA,EACvEC,WAAgBd,EAAIe,OAAoB,CAAA,EACxCC,MAAWf,CAAAA,CAAAA,GAAMgB,KAAKC,UAAUjB,CAAG,EACnCkB,SAAcC,OAAgB,CAAA,CAClC,GAEAlB,EAAIG,IAAM,CACNL,IAAOA,CACX,EAEMC,IACFC,EAAIG,IAAIC,KAAOL,IAIvBC,EAAID,IAAMN,OAAO0B,SAASC,KAC1BpB,EAAIqB,UAAY5B,OAAO6B,UAAUD,UAEhB,gBACjBtG,IAAIwG,EAAWC,aAAaC,QAAQxB,CAAU,EAC7B,OAAbsB,IAAmBA,EAAW,MAClCA,EAAWR,KAAKW,MAAMH,CAAQ,EAC9B,IAAKxG,IAAIC,EAAI,EAAGA,EAAIuG,EAAStG,OAAQD,CAAC,GAClC,GAAIuG,EAASvG,GAAGmF,IAAIL,MAAQE,EAAIG,IAAIL,IAChC,OAIRyB,EAASrH,KAAK8F,CAAG,EACjBwB,aAAaG,QAAQ1B,EAAYc,KAAKC,UAAUO,CAAQ,CAAC,CAC7D,CAoBA,SAASK,oBACL7G,IAAI8G,EAAe,GAEnB,OACIC,kBAAkBC,eAAe,cAAc,GACL,UAA1C,OAAOD,kBAAkBE,cACe,EAAxCF,kBAAkBE,aAAa/G,OAExB6G,kBAAkBE,cAIa,eAAtCF,kBAAkBG,iBAClBH,kBAAkBC,eAAe,aAAa,GACL,UAAzC,OAAOD,kBAAkBI,aACc,EAAvCJ,kBAAkBI,YAAYjH,SAE9B4G,EAAeC,kBAAkBI,aAQjCL,EALsC,SAAtCC,kBAAkBG,iBAClBH,kBAAkBC,eAAe,aAAa,GACL,UAAzC,OAAOD,kBAAkBK,aACc,EAAvCL,kBAAkBK,YAAYlH,OAEf6G,kBAAkBK,YAG9BN,EACX,CASA,SAASO,MAAMC,GACX,OAAO,IAAIxJ,WACNU,OAAO8I,CAAM,CACtB,CA3DwC,IAApCC,KAAKC,MAAsB,IAAhBD,KAAKE,OAAO,CAAO,IAC9B/C,OAAOgD,QAAU,SAASC,EAAW3C,GACjChF,IAAI4H,EAAc,CAAC,QAAS,YAC5B5H,IAAIE,EAAS0H,EAAY1H,OACzB,KAAOA,CAAM,IACsC,CAAC,IAA5CyH,EAAUrE,QAAQsE,EAAY1H,EAAO,GACrC4E,eAAe6C,EAAW3C,CAAG,EAIrC,MAAO,CAAA,CACX,SAqDE6C,SACFC,IAAM,IAAIC,eAGVC,OAAS,OACThD,IAAM,GACNiD,MAAQ,CAAA,EACRC,KAAO,KACPC,SAAW,KACXzF,KAAO,GAGP0F,OAAS,KACTC,QAAU,KACVC,YAAc,KACdC,QAAUhK,KACVyD,SAAW,KACXwG,gBAAkB,KAElBC,aAAe,OACfC,QAAU,GACVC,QAAU,KAEVC,+BAAiC,CAC7B,MACA,QAGJC,KAAO,KACPC,UAAY,EACZC,YAAc,GAGdzK,YAAY0K,GAER,IAAMhJ,IAAIiJ,KAAOD,EACa,KAAA,IAAdzK,KAAK0K,KACb1K,KAAK0K,GAAOD,EAAWC,IAa/B,GARA1K,KAAK2K,QAAQ,EAGRxJ,OAAOyJ,KAAK5K,KAAKmE,IAAI,EAAExC,SACxB3B,KAAK6K,yBAAyB7K,KAAKmE,IAAI,EACvCnE,KAAK8K,YAAY,GAGhB,CAAE9K,KAAKyG,IAGR,OAFAsE,QAAQrE,IAAI,2BACR,iCAAkC,mCAAmC,EAClE,CAAA,EAIX1G,KAAKuJ,IAAIyB,KAAKhL,KAAKyJ,OAAQzJ,KAAKyG,IAAKzG,KAAK0J,MAAO1J,KAAK2J,KAAM3J,KAAK4J,QAAQ,EACzE5J,KAAKiL,WAAW,EAEhBjL,KAAKuJ,IAAIW,aAAelK,KAAKkK,aAC7BlK,KAAKuJ,IAAIa,QAAUpK,KAAKoK,QAIxBpK,KAAKuJ,IAAI2B,mBAAqB,WACtBlL,KAAKmL,eAAe,EACpBnL,KAAKoL,yBAAyBX,CAAU,EAG5CzK,KAAKqL,mBAAmB,CAC5B,EAAEjI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAI+B,OAAS,WACdtL,KAAKuL,OAAO,CAChB,EAAEnI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIiC,WAAa,SAAS1L,GAC3BE,KAAKyL,WAAW3L,CAAK,CACzB,EAAEsD,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIJ,QAAU,WACfnJ,KAAK0L,QAAQ,CACjB,EAAEtI,KAAKpD,IAAI,EAEXA,KAAKuJ,IAAIoC,UAAY,WACjB3L,KAAK4L,UAAU,CACnB,EAAExI,KAAKpD,IAAI,EAGXA,KAAKuJ,IAAIsC,KAAK7L,KAAKsK,IAAI,CAC3B,CAKAK,UAEQ3K,KAAK6J,SACL7J,KAAK6J,OAAOiC,aAAa,WAAY,UAAU,EAC/C9L,KAAK6J,OAAO7I,MAAM+K,OAAS,eAI3B/L,KAAK8J,UACL9J,KAAK8J,QAAQ9I,MAAMiB,QAAU,SAErC,CAKA+J,WACIhM,KAAKuK,UAAYvK,KAAKuJ,IAAI0C,OAC1BjM,KAAKwK,YAAcxK,KAAKuJ,IAAI2C,WAGxBlM,KAAK6J,SACL7J,KAAK6J,OAAOsC,gBAAgB,UAAU,EACtCnM,KAAK6J,OAAO7I,MAAM+K,OAAS,QAI3B/L,KAAK8J,UACL9J,KAAK8J,QAAQ9I,MAAMiB,QAAU,QAG5BjC,KAAK+J,aACN/J,KAAK+J,YAAYzD,QAAQ,MAAM,CAEvC,CAKA+E,qBACuC,OAA/BrL,KAAKoM,uBAAwE,YAAtC,OAAOpM,KAAKoM,uBACnDpM,KAAKoM,sBAAsB,CAEnC,CAKAX,WAAW3L,GACkB,OAArBE,KAAKqM,aAAoD,YAA5B,OAAOrM,KAAKqM,aACzCrM,KAAKqM,YAAY,CAEzB,CAKAX,UACIX,QAAQrE,IAAI,OAAO,EAEnB1G,KAAKgM,SAAS,EACdhM,KAAK4H,MACD5H,KAAKuK,UACLvK,KAAKwK,WACT,EAE6B,OAAzBxK,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgBjK,KAAKwK,WAAW,CAE7C,CAKAoB,YACI5L,KAAKgM,SAAS,EACdhM,KAAK4H,MACD,EACA,SACJ,EAE6B,OAAzB5H,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgB,SAAS,CAEtC,CAKAsB,SAGI,GAFAvL,KAAKgM,SAAS,EAEY,SAAtBhM,KAAKkK,aAA0B,CAC/B,GAA0B,OAAtBlK,KAAKuJ,IAAI+C,SAET,OADAtM,KAAK4H,MAAM5H,KAAKuK,UAAWvK,KAAKwK,YAAa,aAAa,EACnD,CAAA,EACJ,GAAwC,KAAA,IAA5BxK,KAAKuJ,IAAI+C,SAAS1E,MAEjC,OADA5H,KAAK4H,MAAM5H,KAAKuK,UAAWvK,KAAKwK,YAAaxK,KAAKuJ,IAAI+C,SAAS1E,KAAK,EAC7D,CAAA,CAEf,CAEsB,OAAlB5H,KAAKyD,UAA8C,YAAzB,OAAOzD,KAAKyD,UACtCzD,KAAKyD,SAASnD,KAAKN,KAAKgK,QAAShK,KAAKuJ,IAAI+C,SAAUtM,KAAKmE,IAAI,CAErE,CAMAgH,iBACI1J,IAAI8K,EAAa,CAAA,EACbC,EAAa,CAAA,EAYjB,OAV2B,GAAvBxM,KAAKuJ,IAAIkD,aACTF,EACiC,UAA7B,OAAOvM,KAAKuJ,IAAI+C,UAA+C,OAAtBtM,KAAKuJ,IAAI+C,UAClDtM,KAAKuJ,IAAI+C,SAAS7D,eAAe,MAAM,GACvCzI,KAAKuJ,IAAI+C,SAASnI,KAAKsE,eAAe,QAAQ,GACZ,MAAlCzI,KAAKuJ,IAAI+C,SAASnI,KAAK8H,OAE3BO,EAAmC,OAAtBxM,KAAKuJ,IAAI+C,UAAyC,MAApBtM,KAAKuJ,IAAI0C,QAGjDM,GAAcC,CACzB,CAMApB,yBAAyBsB,GACrBjL,IAAIkL,EAAY,GAmBhB,IAKI5D,EApBA2D,EAAqBjE,eAAe,SAAS,GAC7CiE,EAAqBvC,QAAQ1B,eAAe,YAAY,IAExDkE,EAAYD,EAA8B,QAAE,eAY7B,MAJfC,EAHAD,EAAqBjE,eAAe,MAAM,GAC1CiE,EAAqBvI,KAAKsE,eAAe,aAAa,EAE1CiE,EAA2B,KAAe,YAIrDC,MAKD5D,EAAS,CACbU,OAAgB,MADF,GAEPtF,KAAO,CACVyI,wBAA2B,oBAC3BC,YAAe,WACfC,WAAcH,EACdI,uBAA0BL,CAC9B,EACA3D,EAAOiE,QAAU,CAAA,EACjBjE,EAAOtC,IAAM+B,kBAAkByE,SAE/BlE,EAAOtF,SAAW,YAAYR,GAE1BxB,IAAIyL,EAAmBjK,EAAK,GAC5BxB,IAAI0L,EAAmB,CAAA,GAGnBA,EADYC,KAAAA,IAAZnK,EAAK,IAAoBA,EAAK,GAAGwF,eAAe,wBAAwB,EACrDxF,EAAK,GAAG8J,uBAE3BI,IAAoBD,EAAiBzE,eAAe,SAAS,IAC7DD,kBAAkBE,aAAewE,EAAiBG,QACR,SAAtC7E,kBAAkBG,iBAClB,IAAIpJ,WAAYuD,KAAKqK,CAAgB,GAErC,IAAI5N,WAAYoD,KAAKwK,CAAgB,EAGjD,EAEA,IAAI7D,SAASP,CAAM,EACvB,CAOAnB,MAAM0F,EAAUpB,EAAYqB,GACxB9L,IAAI+L,EAAc,GAEE,YAAftB,EACDsB,GAAe,0BACM,MAAbF,EACY,gBAAfpB,EACDsB,GAAe,6DAEfA,GAAe,6BAA+BtB,EAAa,IAC7B,KAAA,IAAlBqB,IACRC,GAAe,2BAA6BD,IAIpDC,GADoB,MAAbF,EACQ,yBAEA,4BAA8BA,EAGjDtN,KAAKyN,YAAaD,CAAY,EAED,OAAzBxN,KAAKiK,iBAA4D,YAAhC,OAAOjK,KAAKiK,iBAC7CjK,KAAKiK,gBAAgBjK,KAAKwK,WAAW,CAE7C,CAKAiD,YAAYC,GACR3C,QAAQrE,IAAK,qBAAuBgH,EAAU,cAAe,cAAe,CAChF,CAKAzC,aAEI,IAAMxJ,IAAIkM,KAAc3N,KAAKmK,QACgB,KAAA,IAA7BnK,KAAKmK,QAAQwD,IACrB3N,KAAKuJ,IAAIqE,iBAAiBD,EAAY3N,KAAKmK,QAAQwD,EAAW,CAG1E,CAKA7C,cAEI,MAAK,CAAC9K,KAAKqK,+BAA+BtF,QAAS/E,KAAKyJ,MAAO,EACpDzJ,KAAK6N,iBAAiB,EAItB7N,KAAK8N,kBAAkB,CAEtC,CAKAD,mBACIpM,IAAIsM,EAAiB,IAAIC,gBAAgBhO,KAAKmE,IAAI,EAAE8J,SAAS,EACzDC,EAAelO,KAAKyG,IAAIhC,MAAM,8BAA8B,EAAI,IAAM,IAG1E,OAFAzE,KAAKyG,KAAOyH,EAAeH,EAEpB/N,KAAKyG,GAChB,CAKAqH,oBAEI,IAAKrM,IAAI0M,KADTnO,KAAKsK,KAAO,IAAI8D,SACIpO,KAAKmE,KACjBhD,OAAOC,OAAOpB,KAAKmE,KAAMgK,CAAO,GAChCnO,KAAKsK,KAAK1E,OACNuI,EAC8B,UAA9B,OAAOnO,KAAKmE,KAAKgK,GACb1G,KAAKC,UAAU1H,KAAKmE,KAAKgK,EAAQ,EACjCnO,KAAKmE,KAAKgK,EAClB,EAIR,OAAOnO,KAAKsK,IAChB,CAUAO,yBAAyBwD,GACrB,GAAuB,UAAlB,OAAOA,EACR,IAAK5M,IAAI6M,KAAaD,EAAQ,CAC1B,IAWYE,EAXRpN,OAAOC,OAAOiN,EAAQC,CAAS,IAEG,UAA7B,OAAOD,EAAOC,KACfD,EAAOC,GAAatO,KAAK6K,yBAAyBwD,EAAOC,EAAU,GAKtC,UAA7B,OAAOD,EAAOC,KACiC,OAA/CD,EAAOC,GAAW7J,MAAM,iBAAiB,GAGb,UAAvB,OADD8J,EAAc9G,KAAKW,MAAMiG,EAAOC,EAAU,KAE1CD,EAAOC,GAAaC,EAIpC,CAGJ,OAAOF,CACX,CACJ,OAEMxL,kBAAkByG,SAEpBvJ,eAAekD,IACXA,EAAOA,EAAK,IACPkB,KAAKyE,YAAcN,kBAAkB,EAC1CkG,MAAMvL,CAAI,CACd,CACJ,OAEMF,kBAAkBuG,SACpBmF,qBAAuBjG,kBAAkBkG,UAAY,yBACrDC,MAAQ,GAGR5O,eAAekD,GACXA,EAAOA,EAAK,GACZ,IAAM2L,EAAQtG,kBAAkB,EAChCrF,EAAKwD,IAAM1D,UAAU0L,cAAgBxL,EAAK0L,MAC1C1L,EAAKkH,QAAU,CACX0E,aAAcD,CAClB,EACAJ,MAAMvL,CAAI,CACd,CACJ,CAGK9B,OAAOf,UAAUgB,QAClBD,OAAO2N,eAAe3N,OAAOf,UAAW,SAAU,CAC9C4D,MAAO,SAAS+K,GACZ,OAAO5N,OAAOf,UAAUqI,eAAenI,KAAKN,KAAM+O,CAAQ,CAC9D,EACAC,WAAY,CAAA,EACZC,aAAc,CAAA,EACdC,SAAU,CAAA,CACd,CAAC,QAQCC,4BACFC,YAAc7O,SAAS+C,cAAc,MAAM,EAC3C+L,gBAAkB9O,SAAS+O,MAI3BvP,cACIC,KAAKuP,aAAa,CACtB,CAKAA,eACIvP,KAAKoP,YAAYlM,iBAAiB,QAAS,IACvClD,KAAKwP,oBAAoB1P,EAAO,WAAW,CAC/C,CAAC,EAEDE,KAAKoP,YAAYlM,iBAAiB,UAAW,IAErB,SADC3C,SAASkP,aAAa,EAAEC,KAAKzB,SAAS,GAEvDjO,KAAK2P,YAAY,CAEzB,CAAC,EAED3P,KAAKoP,YAAYlM,iBAAiB,YAAa,IAC3ClD,KAAKwP,oBAAoB1P,EAAO,oBAAoB,CACxD,CAAC,CACL,CAOA0P,oBAAoB1P,EAAO8P,GACvBnO,IAAIoO,EACJ,IAAKpO,IAAIC,EAAI,EAAGA,EAAI1B,KAAKqP,gBAAgB1N,OAAQD,CAAC,GAK1CmO,EAHgC,EAAhC/P,EAAMuD,OAAOyM,UAAUnO,QACoB,EAA3C3B,KAAKqP,gBAAgB3N,GAAGqO,UAAUpO,OAEpB3B,KAAKqP,gBAAgB3N,GAAGqO,UAAUhL,QAAQjF,EAAMuD,OAAOyM,SAAS,EAEhE,CAAC,EAIvB,OAAQF,GACR,IAAK,YACGC,EAAc,GACd7P,KAAKgQ,UAAU,EAEnB,MACJ,IAAK,qBACiB,CAAC,EAAfH,GACA7P,KAAKiQ,mBAAmB,CAKhC,CACJ,CAKAD,YACQzP,SAAS2P,6BACL3P,SAAS2P,6BAA6BC,OACtC5P,SAAS2P,6BAA6BC,MAAM,GAE5C5P,SAAS2P,6BAA6BC,OAAS,EAKvD5P,SAAS2P,6BAA+B,CAACC,OAAQ,CAAC,CACtD,CAKAR,cACQpP,SAAS2P,6BACL3P,SAAS2P,6BAA6BE,SACtC7P,SAAS2P,6BAA6BE,QAAQ,GAE9C7P,SAAS2P,6BAA6BE,SAAW,EAKzD7P,SAAS2P,6BAA+B,CAACE,SAAU,CAAC,CACxD,CAKAH,qBACS1P,SAAS2P,+BACV3P,SAAS2P,6BAA+B,IAEvC3P,SAAS2P,6BAA6BG,2BACvC9P,SAAS2P,6BAA6BG,yBAA2B,CAAA,GAGrE9P,SAAS2P,6BAA6BG,yBAA2B,CAAA,CACrE,CACJ,CAQA,SAASC,YAAaC,EAASvM,EAAOwM,GAClC/O,IAAIgP,EAA8B,CAC9B,kBACA,gBACA,0BACA,2BACA,2BACA,yBACA,8BAGAC,EAAU,CAAA,EAUd,GARwB,UAAnB,OAAOH,IACRG,EAAsB,oBAAZH,EACY,UAAjB,OAAOvM,GAAuC,UAAjB,OAAOA,IACrCuM,EAAU,CAAC,CAACA,EAASvM,EAAOwM,MAKU,SAAzChI,kBAAkBmI,mBAAgC,CACnDlP,IAAImP,EAAsB,GAC1BL,EAAQM,QAAS,SAASC,GAC+B,CAAC,IAAlDL,EAA4B1L,QAAQ+L,EAAK,EAAE,EAC3CF,EAAoBhQ,KAAKkQ,CAAI,EAE7BC,kBAAkBC,IAAIF,EAAK,GAAIA,EAAK,EAAE,CAE9C,CAAC,EAGiC,EAA7BF,EAAoBjP,QACrBsP,uBAAuBL,CAAmB,EAIzCM,SAASC,mBAAqB,CAACT,EAEhCO,uBAAuBV,EAAS,CAACa,gBAAiB,CAAA,CAAI,CAAC,EAEvDC,oCAAoC,CAI5C,KAAqD,WAAzC7I,kBAAkBmI,oBAErBO,SAASC,mBAAqB,CAACT,GAEhCO,uBAAuBV,EAAS,CAACa,gBAAiB,CAAA,CAAI,CAAC,EAE3Db,EAAQM,QAAS,SAASC,GACtB,IAAMQ,EAA8B,KAAA,IAAZR,EAAK,GAAqB,WAAaN,EAAU,KAAO,GAC5Ee,EAAiC,WAAtB1J,SAAS2J,SAAwB,WAAa,GAC7DjR,SAASkR,OAASjJ,kBAAkBkJ,aAChCZ,EAAK,GACL,IACAa,mBAAmBb,EAAK,EAAE,EAC1B,KACAQ,EACA,uBACAC,CACR,CAAC,GAGgD,gBAAzC/I,kBAAkBmI,oBAAyCD,GACnEO,uBAAuBV,CAAO,CAEtC,CAGA,SAASqB,gCACLnQ,IAAIoQ,EAAuE,EAAtDtR,SAASC,iBAAiB,iBAAiB,EAAEmB,OAC9DmQ,EAAwG,EAAtEvR,SAASC,iBAAiB,iCAAiC,EAAEmB,OAC/FoQ,EAAiF,EAAhExR,SAASC,iBAAiB,2BAA2B,EAAEmB,OACxEqQ,EAAkG,EAA5EzR,SAASC,iBAAiB,uCAAuC,EAAEmB,OACzFsQ,EAAkF,EAAjE1R,SAASC,iBAAiB,4BAA4B,EAAEmB,OACzEuQ,EAAkG,EAAxE3R,SAASC,iBAAiB,mCAAmC,EAAEmB,OACzFwQ,EAAqG,EAA1E5R,SAASC,iBAAiB,qCAAqC,EAAEmB,OAC5FyQ,EAA0F,EAAvE7R,SAASC,iBAAiB,kCAAkC,EAAEmB,OACjF0Q,EAAyF,EAA5E9R,SAASC,iBAAiB,uCAAuC,EAAEmB,OAChF2Q,EAAuF,EAA9D/R,SAASC,iBAAiB,yBAAyB,EAAEmB,OAC9E4Q,EAA4E,EAAhEhS,SAASC,iBAAiB,2BAA2B,EAAEmB,OACnE6Q,EAAgG,EAA7EjS,SAASC,iBAAiB,wCAAwC,EAAEmB,OAC3FuP,SAASC,kBAAoBY,GACzBF,GACAG,GACAF,GACAG,GACAC,GACAC,GACAC,GACAE,GACAD,GACAE,GACAC,EAEJnM,WAAW,WACP,IACQoM,EADHvB,SAASC,oBACNsB,EAA2F,EAA5ElS,SAASC,iBAAiB,uCAAuC,EAAEmB,OACtFuP,SAASC,kBAAoBsB,EAErC,EAAG,GAAI,CACX,CAGA,SAASxB,uBAAuBV,EAASxH,GACI,YAArC,OAAO,wBAEH5I,MAAMuS,QAAQnC,CAAO,IACrBA,EAAUoC,wBAAwBpC,CAAO,GAG7CxF,QAAQrE,IAAI,sDAAsD,EAGtE,IACI6J,EAAU9I,KAAKW,MAAMmI,CAAO,CAIhC,CAHE,MAAOqC,GAEL,OADA7H,KAAAA,QAAQrE,IAAI,iCAAmCkM,CAAC,CAEpD,CAEA,IAAMnP,EAAWsF,GAAUA,EAAOtF,UAAY,KACxCwG,EAAkBlB,GAAUA,EAAOkB,iBAAmB,KAEvDlB,GAAUA,EAAOqI,kBAClBb,EAAQsC,wBAA0B,CAAA,GAIK,SAAtCrK,kBAAkBG,iBAEoB,UAAnC,OAAO4H,EAAQuC,iBAC4B,CAAC,IAA5CvC,EAAQuC,gBAAgB/N,QAAQ,KAAK,IAErCwL,EAAQuC,gBAAkBC,mBAAmBxC,EAAQuC,eAAe,GAExEvS,SAASyS,cAAc,IAAIC,YAAY,oBAAoB,CAAC,EAC5DC,sBACI,eACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACoM,QAASA,CAAO,EACvB9M,SAAUA,EACVwG,gBAAiBA,CACrB,CACJ,EACA1J,SAASyS,cAAc,IAAIC,YAAY,qBAAqB,CAAC,GAEf,eAAtCzK,kBAAkBG,iBAC1BwK,sBACI,CACIC,OAAQ,gCACR7C,QAASA,CACb,EACA,CACIvD,QAAS,EACTvJ,SAAUA,EACVwG,gBAAiBA,EACjBoJ,WAAY,SAAS9J,GACjBA,EAAIqE,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAQA,SAAS0F,YAAYlP,GACbmP,EAAUhT,SAASkR,OAAOhN,MAAM,IAAI+O,OACpC,WAAapP,EAAK9C,QAAQ,+BAAgC,MAAM,EAAI,UACxE,CAAC,EACD,OAAOiS,EAAUR,mBAAmBQ,EAAQ,EAAE,EAAInG,KAAAA,CACtD,CAGA,SAASqG,eAAeC,GAEpB,IAKQnC,EALsC,SAAzC/I,kBAAkBmI,qBAI8B,WAAzCnI,kBAAkBmI,oBACtBY,EAAiC,WAAtB1J,SAAS2J,SAAwB,WAAa,GAC7DjR,SAASkR,OAASiC,EAAa,mEAAqEnC,GAG5F/I,kBAAkBmI,mBAGlC,CAGA,SAASwC,sBAAsBhP,EAAM4E,EAAQ4K,GAEzClS,IAAImS,EAAU,GAiBRhF,GAhBNgF,EAAkB,SAAI7K,EAAOtF,UAAY,KACzCmQ,EAAyB,gBAAI7K,EAAOkB,iBAAmB,KACvD2J,EAA0B,iBAAI7K,EAAO8K,kBAAoB,KACzDD,EAAyB,gBAAI7K,EAAO+K,iBAAmB,KACvDF,EAAe,MAAI7K,EAAOW,OAAS,CAAA,EACnCkK,EAAiB,QAAI7K,EAAOiE,SAAW,KACvC4G,EAAsB,aAAG7K,EAAOiE,QAAU,OAAS,OACnD4G,EAAiB,QAAI7K,EAAOqB,SAAW,KACvCwJ,EAAa,IAAID,GAAO,KACxBC,EAAgB,OAAI7K,EAAOc,QAAU,KACrC+J,EAAiB,QAAI7K,EAAOe,SAAW,KACvC8J,EAAqB,YAAI7K,EAAOgB,aAAe,KAC/C6J,EAAgB,OAAI7K,EAAOgL,QAAU,KACrCH,EAAkB,SAAI7K,EAAOiL,UAAY,KACzCJ,EAAc,KAAIzP,EAClByP,EAAa,IAAIpL,kBAAkByL,UACrB3L,kBAAkB,GAEV,UAAlB,OAAO,GACAsL,EAAkB,WACrBA,EAAc,KAAIA,EAAc,KAAI,gBAAkBhF,GAE1DgF,EAAc,KAAIA,EAAc,KAAI,aAAe5K,KAAKE,OAAO,IAExD0K,EAAkB,WACrBA,EAAc,KAAEhL,YAAcgG,GAElCgF,EAAc,KAAEM,SAAWlL,KAAKE,OAAO,IAG3C,IAAI3J,WAAYoD,KAAKiR,CAAO,CAChC,CAGA,SAASV,sBAAuBvE,EAAO5F,GACnCtH,IAAImS,EAAU,GACdA,EAAe,MAAIjF,EACnBiF,EAAkB,SAAI7K,EAAOtF,UAAY,KACzCmQ,EAAyB,gBAAI7K,EAAOkB,iBAAmB,KACvD2J,EAAc,KAAI7K,EAAO5E,MAAQ,GACjCyP,EAAgB,OAAI7K,EAAOU,QAAU,QAErC,IAAIlK,WAAYuD,KAAK8Q,CAAO,CAChC,CAOA,SAASO,wBACL,OAAOnL,KAAKE,OAAO,EAAE+E,SAAS,EAAE,EAAE3M,QAAQ,WAAY,EAAE,EAAE8S,OAAO,EAAG,EAAE,CAC1E,CAEA3S,IAAIsP,kBAAoB,CACpBsD,IAAK,SAAS3J,EAAKqE,GACU,KAAA,IAAbA,IACRA,EAAW,SAETuF,EAAepM,aAAaC,QAAQuC,CAAG,EAC7C,GAAsB,OAAjB4J,EACD,IACI,IAAMC,EAAO9M,KAAKW,MAAMkM,CAAY,EACpC,GAAKC,CAAAA,EAAK9L,eAAesG,CAAQ,EAS7B,OAAOwF,EARP,IAEI,OAAO9M,KAAKW,MAAOmM,EAAKxF,EAAU,CAItC,CAHE,MAAO6D,GAEL,OAAO2B,EAAKxF,GAAUd,SAAS,CACnC,CAMR,CAFE,MAAO2E,GACL,OAAO0B,CACX,CAEJ,MAAO,CAAA,CACX,EACAtD,IAAK,SAAStG,EAAK1G,EAAOwQ,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzQ,MAASyD,KAAKC,UAAU1D,CAAK,EAAG0Q,UAAa1L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EACrGzM,aAAaG,QAAQqC,EAAKjD,KAAKC,UAAU+M,CAAS,CAAC,GAEnDvM,aAAaG,QAAQqC,EAAK1G,CAAK,CAEvC,EACA4Q,QAAS,SAASlK,EAAKmK,GAKnB,OAJ4B,KAAA,IAAhBA,IACRA,EAAc,OAEG7U,KAAKqU,IAAI3J,EAAK,WAAW,EACxBmK,EAAc7L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAC9E,EACAG,MAAO,SAASpK,GACZ,OAAqC,OAA9BxC,aAAaC,QAAQuC,CAAG,CACnC,EACAqK,OAAQ,SAASrK,GACbxC,aAAa8M,WAAWtK,CAAG,CAC/B,EACAuK,iBAAkB,WACdxT,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEwG,aAAavG,OAAQD,CAAC,GAAI,CACtCD,IAAIiJ,EAAMxC,aAAawC,IAAIhJ,CAAC,EACF,CAAC,IAAvBgJ,EAAI3F,QAAQ,KAAK,GAAoC,CAAC,IAA1B2F,EAAI3F,QAAQ,QAAQ,IAChDZ,EAAKuG,EAAIuD,SAAS,GAAK8C,kBAAkBsD,IAAI3J,CAAG,EAExD,CACA,OAAOvG,CACX,CAEJ,EAEI+Q,oBAAsB,CACtBb,IAAK,SAAS3J,EAAKqE,GACU,KAAA,IAAbA,IACRA,EAAW,SAETuF,EAAea,eAAehN,QAAQuC,CAAG,EAC/C,GAAsB,OAAjB4J,EACD,IACI,IAAMC,EAAO9M,KAAKW,MAAMkM,CAAY,EACpC,OAAOC,EAAK9L,eAAesG,CAAQ,EAAItH,KAAKW,MAAMmM,EAAKxF,EAAS,EAAIwF,CAGxE,CAFE,MAAO3B,GACL,OAAO0B,CACX,CAEJ,MAAO,CAAA,CACX,EACAtD,IAAK,SAAStG,EAAK1G,EAAOwQ,EAAS,CAAA,GAC3BA,GACIC,EAAY,CAACzQ,MAASyD,KAAKC,UAAU1D,CAAK,EAAG0Q,UAAa1L,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EACrGQ,eAAe9M,QAAQqC,EAAKjD,KAAKC,UAAU+M,CAAS,CAAC,GAErDU,eAAe9M,QAAQqC,EAAK1G,CAAK,CAEzC,EACA8Q,MAAO,SAASpK,GACZ,OAAuC,OAAhCyK,eAAehN,QAAQuC,CAAG,CACrC,EACAqK,OAAQ,SAASrK,GACbyK,eAAeH,WAAWtK,CAAG,CACjC,EACAuK,iBAAkB,WACdxT,IAAI0C,EAAO,GACX,IAAK1C,IAAIC,EAAE,EAAGA,EAAEyT,eAAexT,OAAQD,CAAC,GAAI,CACxCD,IAAIiJ,EAAMyK,eAAezK,IAAIhJ,CAAC,EACJ,CAAC,IAAvBgJ,EAAI3F,QAAQ,KAAK,GAAoC,CAAC,IAA1B2F,EAAI3F,QAAQ,QAAQ,IAChDZ,EAAKuG,EAAIuD,SAAS,GAAKiH,oBAAoBb,IAAI3J,CAAG,EAE1D,CACA,OAAOvG,CACX,CACJ,EAUA,SAASiR,sBAAsBtV,IAC1B,oBAAsBA,EAAMuV,cACzBC,kBAAkCC,yBAAhBzV,EAAMuD,MAAM,CACtC,CAUA,SAASmS,aAAa1V,IACjB,0BAA4BA,EAAM2V,WAAe,SAAU3V,EACtByV,wBAAlCD,mBAA0DxV,EAAMuD,MAAM,CAC9E,CAWA,SAASiS,kBAAkBI,GACvB,IAGI5V,EAHA4V,EAAQC,aAAa,eAAe,IACxCD,EAAQ5J,aAAa,gBAAiB,EAAE,EAEpChM,EAAQ,IAAIqG,OAAO8M,YAAY,iBAAkB,CACjD2C,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAMC,OAAQ,IAC7C,CAAC,EAGIJ,EAAQ1C,cAAclT,CAAK,KAC5B4V,EAAQ1R,MAAQ,GAExB,CAWA,SAASuR,wBAAwBG,GACxBA,EAAQC,aAAa,eAAe,IACzCD,EAAQvJ,gBAAgB,eAAe,EAGvCuJ,EAAQ1C,cAAc,IAAI7M,OAAO8M,YAAY,iBAAkB,CAC3D2C,QAAS,CAAA,EAAMC,WAAY,CAAA,EAAOC,OAAQ,IAC9C,CAAC,CAAC,EACN,OAKMC,qBACFC,SAAW,GAKXjW,cACIC,KAAKgW,SAAWhW,KAAKiW,aAAa,EAE9BjW,KAAKgW,SAASrU,OAAS,GAI3B3B,KAAKkW,SAAS,CAClB,CAMAD,eACI,OAAO1V,SAASC,iBAAiB,6BAA6B,CAClE,CAMA0V,WACIzU,IAAI0C,EAAO,CACPgS,sBAAuBxD,wBAAwB,EAC/CyD,SAAU7V,SAASsH,SAASC,KAC5BuO,SAAU9V,SAAS8V,QACvB,EAE0C,SAAtC7N,kBAAkBG,gBAClBuK,sBAAsB,6BAA8B,CAChD/O,KAAAA,EACAsF,OAAQ,OACRhG,SAAU,GAAYzD,KAAKsW,iBAAiBC,CAAM,CACtD,CAAC,EAC4C,eAAtC/N,kBAAkBG,kBACzBxE,EAAKiP,OAAS,mCACdD,sBAAsBhP,EAAM,CAACV,SAAU,GAAYzD,KAAKsW,iBAAiBC,CAAM,CAAC,CAAC,EAEzF,CAOAD,iBAAiBC,GAEb,GAAIA,EAAOpS,MAAQoS,EAAOpS,KAAK8H,QAAiC,MAAvBsK,EAAOpS,KAAK8H,OACjDlB,QAAQrE,IAAI,gDAAgD,EAC5D1G,KAAKwW,YAAY,MAFrB,CAMA,GAAsB,UAAlB,OAAOD,EACP,IACIA,EAAS9O,KAAKW,MAAMmO,CAAM,CAK9B,CAJE,MAAO3D,GAGL,OAFA7H,QAAQrE,IAAI,yCAA0CkM,CAAC,EAAvD7H,KACA/K,KAAKwW,YAAY,CAErB,CAGkB,UAAlB,OAAOD,GAAuBA,EAAOE,OAA0B,IAAjBF,EAAOE,OACrDzW,KAAKwW,YAAY,EACjBjW,SAASyS,cAAc,IAAI0D,MAAM,6BAA6B,CAAC,GAE/D1W,KAAK2W,kBAAkBJ,EAAO3P,OAAO,CAhBzC,CAkBJ,CAMA4P,cACI/U,IAAImV,EAEJ5W,KAAKgW,SAASnF,QAAQ,IAClB+F,EAAOC,EAAQvT,cAAc,qBAAqB,EAAEwT,QAAQC,YAE5D,IACQH,GAAwB,UAAhB,OAAM,IACdC,EAAQ/G,UAAYkH,KAAKJ,CAAI,EAIrC,CAFE,MAAOhP,GACLmD,QAAQrE,IAAIkB,CAAK,CACrB,CACJ,CAAC,CACL,CAOA+O,kBAAkB/P,GACdnF,IAAImV,EAEJ5W,KAAKgW,SAASnF,QAAQ,KAClB+F,EAAOC,EAAQvT,cAAc,qBAAqB,EAAEwT,QAAQC,eAExDF,EAAQ/G,UAAY,0CAA4ClJ,EAAU,SAElF,CAAC,CACL,CACJ,CAKA,SAASqQ,oBACD/F,SAASgG,mCAAqE,KAAA,IAAzBnB,sBACrD,IAAIA,oBAEZ,CAEI7E,SAASiG,kBACmB,YAAxB5W,SAASkM,WACTwK,kBAAkB,EAElBG,2BAA2B7W,SAAU,mBAAoB0W,iBAAiB,SAoB5EI,WACFC,UAAY,CACRC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,WAAY,EACZC,kBAAmB,EACnBC,iBAAkB,EAClBC,UAAW,EACXC,WAAY,CAChB,EAEAC,OAASvX,SAASC,iBAAiB,wBAAwB,EAE3D2D,KAAO,GAKP4T,kBACmB5X,MAAMC,UAAUC,MAAMC,KAAKN,KAAK8X,MAAM,EAC5CjH,QAAQ,CAACmH,EAAOtW,KACrB1B,KAAKmE,KAAKvD,KAAKO,OAAO8W,OAAO,GAAIjY,KAAKsX,SAAS,CAAC,CACpD,CAAC,CACL,CAKA/H,eACIvP,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAG8V,YAAc,CAAA,CAC/B,CAAC,CACL,CAAC,EAEDxX,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,iBAAkB,KACrClD,KAAKmE,KAAKzC,GAAG6V,WAAa,CAAA,CAC9B,CAAC,CACL,CAAC,EAEDvX,KAAK8X,OAAOjH,QAAQ,CAACmH,EAAOtW,KACxBsW,EAAM9U,iBAAiB,QAAS,KAC5BlD,KAAKmE,KAAKzC,GAAGmW,UAAU,GACvBpW,IACIyW,EADApS,EAAO,CAAE,IAAIG,KAGe,IAA5BjG,KAAKmE,KAAKzC,GAAGmW,YACb7X,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGgW,kBAAoB5R,IAIrCoS,EAAepS,EAAO9F,KAAKmE,KAAKzC,GAAGiW,iBACH,IAA5B3X,KAAKmE,KAAKzC,GAAGmW,YACb7X,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGkW,UAAYM,GAIC,EAA1BlY,KAAKmE,KAAKzC,GAAGmW,aACb7X,KAAKmE,KAAKzC,GAAG+V,YAAczO,KAAKmP,IAAInY,KAAKmE,KAAKzC,GAAGkW,UAAYM,CAAY,EACzElY,KAAKmE,KAAKzC,GAAGiW,iBAAmB7R,EAChC9F,KAAKmE,KAAKzC,GAAGkW,UAAYM,GAEjC,CAAC,CACL,CAAC,CACL,CACJ,CAGA,IAAME,OAAS,IAAInS,KACboS,UAAW,IAAIpS,MAAO0O,QAAQ,EAChC2D,sBAAwB,CAAA,EACxBC,YAAc,GACdC,mBAAqB,EACrBC,gBAAkB,GAClBC,qBAAuB,GACvBC,oBACAC,yBACAC,uBACAC,yBAA2B,EAC3BC,kCAAoC,GAGxC,SAAS3B,2BAA2BvW,EAAMf,EAAO2D,GACN,YAAnC,OAAO0C,OAAOjD,iBAAiCrC,EAAKqC,iBAAiBpD,EAAO2D,CAAQ,EACnF5C,EAAKmY,YAAYlZ,EAAO2D,CAAQ,CACzC,CAEA,SAASwV,2BAA2BpY,EAAMf,EAAO2D,GACH,YAAtC,OAAO0C,OAAO+S,oBAAoCrY,EAAKqY,oBAAoBpZ,EAAO2D,CAAQ,EACzF5C,EAAKsY,YAAYrZ,EAAO2D,CAAQ,CACzC,CAGA,IAAM2V,mBAAqB,SAAgBtZ,GAEvCwQ,YAAY,mBADOtH,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CACb,EAC5C0E,uBAAuB,CAC3B,EAmCMC,qBA7BNC,iBAAiB,GAAI,EAIjB/Q,kBAAkBC,eAAe,4BAA4B,GACb,GAAhDD,kBAAkBgR,4BAClBhR,kBAAkBC,eAAe,iCAAiC,GACb,GAArDD,kBAAkBiR,iCAElBC,gCAAgC,GAAI,EAOpCxI,SAASiG,kBAETwB,oBAAsBgB,YAAY,WAC9BrB,sBAAwB,CAAA,CAC5B,EAAG,GAAG,EAGNM,yBAA2Be,YAAY,WACnCrJ,YAAY,kBAAmB7I,KAAKC,UAAU6Q,WAAW,CAAC,CAC9D,EAAG,IAAI,GAIiB,SAAgBzY,GACxC8Z,gBAAgB,EACc,CAAA,IAA1BtB,wBACAC,YAAY3X,KAAK,CACboI,KAAK6Q,MAAM/Z,EAAMga,OAAO,EACxB9Q,KAAK6Q,MAAM/Z,EAAMia,OAAO,EACxB/Q,KAAK6Q,OAAM,IAAI5T,MAAO0O,QAAQ,EAAI0D,QAAQ,EAC7C,EAEDG,kBAAkB,GAClBF,sBAAwB,CAAA,EACE,IAAtBE,qBACAwB,gBAAgB,CAG5B,GAMA,SAAST,iBAAiBU,EAAmB,KACzC5T,WAAW,WACPsT,YAAY,WACRO,uBAAuB,EACvBC,mCAAmC,CACvC,EAAG,GAAI,CACX,EAAGF,CAAgB,CACvB,CAQA,SAASP,gCAAgCO,EAAmB,IAAMG,EAAW,KACzE/T,WAAW,WACPsT,YAAY,WACR,IAAMU,EAAatJ,kBAAkBsD,IAAI,mCAAmC,EACxEiG,0BAA0BD,CAAU,IACpCvB,yBAA2BuB,EAAWE,gBAEtCtJ,uBAAuB,GAAI,CAACG,gBAAiB,CAAA,CAAI,CAAC,EAE1D,EAAGgJ,CAAQ,CACf,EAAGH,CAAgB,CACvB,CAOA,SAASK,0BAA0BD,GAC/B,GACIA,GAAcA,EAAW5R,eAAe,iBAAiB,GACzDqQ,2BAA6BuB,EAAWE,gBAExC,IACI,IAAK9Y,IAAIC,EAAI,EAAGA,EAAI2Y,EAAWG,QAAQ7Y,OAAQD,CAAC,GAAI,CAChD,IAAM+Y,EAAcJ,EAAWG,QAAQ9Y,GAAGgZ,cAAcC,SAExD,GAAoBvN,KAAAA,IAAhBqN,GAA6B1B,CAAAA,kCAAkC6B,SAASH,CAAW,EAKvF,OADA1B,kCAAkCnY,KAAK6Z,CAAW,EAC3C,CAAA,CACX,CAGJ,CAFE,MAAO7H,GACL7H,QAAQrE,IAAI,6CAA+CkM,EAAE3E,SAAS,CAAC,CAC3E,CAEJ,MAAO,CAAA,CACX,CAKA,SAASkM,qCAIL,IAScU,EATRC,EACyD,EAA3Dva,SAASwa,uBAAuB,gBAAgB,EAAEpZ,QACqB,EAAvEpB,SAASwa,uBAAuB,4BAA4B,EAAEpZ,QACd,OAAhDpB,SAASya,eAAe,kBAAkB,EAG9C,IACSF,IAEKD,EAAQ9J,kBAAkBsD,IAAI,0BAA0B,EAC5B,YAA9B,OAAO4G,qBAA+C7N,KAAAA,IAAVyN,GAAwC,KAAjBA,EAAMlZ,QACzEsZ,mBAAmBJ,CAAK,CAMpC,CAFE,MAAOjI,GACL7H,QAAQrE,IAAIkM,EAAE3E,SAAS,CAAC,CAC5B,CACJ,CAKA,SAAS+L,kBACLf,2BAA2B1Y,SAAU,YAAa+Y,mBAAmB,EACrE4B,cAAcvC,mBAAmB,EACjCuC,cAActC,wBAAwB,CAC1C,CAKA,SAASS,yBACLJ,2BAA2B1Y,SAAU,YAAa6Y,kBAAkB,EACpEH,2BAA2B1Y,SAAU,UAAW6Y,kBAAkB,CACtE,CAKA,SAAS+B,WAAWvI,GAChBnR,IAAI2Z,EAAexI,EAAEvP,OAAOW,MAEtB,CAAA,6BAA6BqX,KAAKD,CAAY,GAIhDA,CAAAA,GAAkBA,KAAgB3C,kBAES,SAAtCjQ,kBAAkBG,gBACnBuK,sBACI,0BACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACmX,MAASF,CAAY,EAC5B3X,SAAU,SAAS8S,GACXA,EAAOA,SACPkC,gBAAgB2C,GAAgB,CAC5B7E,OAAUA,EAAOA,OACjB7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EACAjL,YAAY,oBAAqB7I,KAAKC,UAAU+Q,eAAe,CAAC,EAExE,CACJ,CACJ,EAE8C,eAAtCjQ,kBAAkBG,iBAC1BwK,sBACI,CACIC,OAAQ,gCACRkI,MAAOF,CACX,EACA,CACI3X,SAAU,SAAS8S,GACXA,EAAOA,SACPkC,gBAAgB2C,GAAgB,CAC5B7E,OAAUA,EAAOA,OACjB7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EACAjL,YAAY,oBAAqB7I,KAAKC,UAAU+Q,eAAe,CAAC,EAExE,CACJ,CACJ,EAGZ,CAKA,SAAS+C,gBAAgB5I,GACrBnR,IAAI2Z,EAAexI,EAAEvP,OAAOW,MAC5BvC,IAOQga,EALHL,GAAiBA,EAAazZ,OAY7B,6BAA6B0Z,KAAKD,CAAY,IAIhDA,KAAgB1C,sBAChBnC,EAASmC,qBAAqB0C,GAC9BM,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,IAKpDO,oBAAoB/I,EAAG,MAAM,GAG7BpK,kBAAkBG,gBAAkB,UAChCH,kBAAkBG,gBAClBuK,sBACI,yBACA,CACIzJ,OAAQ,OACRtF,KAAM,CAACmX,MAASF,CAAY,EAC5B3X,SAAU,SAAS8S,GACfmF,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,CACpD,CACJ,CACJ,EAKsC,eAAtC5S,kBAAkBG,iBAClBwK,sBACI,CACIC,OAAQ,+BACRkI,MAAOF,CACX,EACA,CACI3X,SAAU,SAAS8S,GACfmF,yBAAyB9I,EAAG2D,EAAQ6E,CAAY,CACpD,CACJ,CACJ,MApDIQ,EAAWrb,SAASya,eAAe,+BAA+B,IAElEY,EAASpZ,OAAO,GAEhBiZ,EAAOlb,SAASya,eAAe,2CAA2C,IAE1ES,EAAKjZ,OAAO,EAgDxB,CAOA,SAASkZ,yBAAyB9I,EAAG2D,EAAQ6E,GACpC7E,GAAWA,EAAOA,SAIvBA,EAASA,EAAOA,OAEhBmC,qBAAqB0C,GAAgB,CACjC7E,OAAUA,EACV7B,UAAazO,KAAKsV,IAAI,EAAI,IAAM,CACpC,EAEqB,UAAjBhF,EAAOA,OACPoF,oBAAoB/I,EAAG,aAAc2D,EAAOsF,WAAW,EAEvDF,oBAAoB/I,EAAG,YAAa2D,EAAOsF,WAAW,EAG1DvL,YAAY,0BAA2B7I,KAAKC,UAAUgR,oBAAoB,CAAC,EAC/E,CAOA,SAASiD,oBAAoB/I,EAAGkJ,EAAOC,GAC/B1W,EAAgBuN,EAAEvP,OAAOgC,cAC7B5D,IAAIua,EAAa3W,EAAc/B,cAAc,iBAAiB,EAE9D,GAAK0Y,EAAL,CAIAva,IAAIma,EACAH,EAmCJ,OAhCIlb,SAASya,eAAe,+BAA+B,EACvDY,EAAWrb,SAASya,eAAe,+BAA+B,IAElEY,EAAWrb,SAASoE,cAAc,KAAK,GAC9BmH,aAAa,QAAS,+BAA+B,EAC9D8P,EAAS9P,aAAa,KAAM,+BAA+B,EAC3D3F,OAAOjD,iBAAiB,SAAU,WAC9B0Y,EAAS5a,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,IAClE,CAAC,EACD5W,EAAcK,MAAMkW,CAAQ,GAI5Brb,SAASya,eAAe,2CAA2C,EACnES,EAAOlb,SAASya,eAAe,2CAA2C,IAE1ES,EAAOlb,SAASoE,cAAc,KAAK,GAC9BmH,aAAa,QAAS,2CAA2C,EACtE2P,EAAK3P,aAAa,KAAM,2CAA2C,EACnE3F,OAAOjD,iBAAiB,SAAU,WAC9BuY,EAAKza,MAAMib,IAAML,EAASM,sBAAsB,EAAED,IAAM,IAC5D,CAAC,EAEDL,EAASlW,MAAM+V,CAAI,GAGvBU,iCAAiC,EAEjChW,OAAOjD,iBAAiB,SAAU,SAASpD,GACvCqc,iCAAiC,CACrC,CAAC,EAEOL,GACR,IAAK,OACDF,EAASxZ,UAAUI,OAAO,qCAAsC,mCAAmC,EACnGoZ,EAASxZ,UAAUC,IAAI,8BAA8B,EACrD,MAEJ,IAAK,aACDuZ,EAASxZ,UAAUI,OAAO,+BAAgC,mCAAmC,EAC7FoZ,EAASxZ,UAAUC,IAAI,oCAAoC,EAE3DuZ,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKza,MAAMiB,QAAU,QACrBwZ,EAAKza,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKza,MAAMub,MAAQ,SACvB,EAEAX,EAASY,WAAa,WAClBf,EAAKza,MAAMiB,QAAU,MACzB,EAEA,MAEJ,IAAK,YACD2Z,EAASxZ,UAAUI,OAAO,+BAAgC,oCAAoC,EAC9FoZ,EAASxZ,UAAUC,IAAI,mCAAmC,EAE1DuZ,EAASQ,YAAc,WACnBX,EAAKY,YAAcN,EACnBN,EAAKza,MAAMiB,QAAU,QACrBwZ,EAAKza,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAMR,EAAKS,sBAAsB,EAAEI,OAAS,KAChGb,EAAKza,MAAMub,MAAQ,SACvB,EAEAX,EAASY,WAAa,WAClBf,EAAKza,MAAMiB,QAAU,MACzB,CAMJ,CAhFA,CAiFJ,CAOA,SAASka,mCACL,IAaMV,EAZAO,EAAazb,SAAS+C,cAAc,gDAAgD,EACrF0Y,KAGCJ,EAAWrb,SAASya,eAAe,+BAA+B,KAEpEY,EAAS5a,MAAMib,IAAMD,EAAWE,sBAAsB,EAAED,IAAM,KAC9DL,EAAS5a,MAAMyb,KAAOT,EAAWE,sBAAsB,EAAEQ,MARvC,GAQ+D,GAAK,KACtFd,EAAS5a,MAAMsb,OAASN,EAAWW,aAAe,KAClDf,EAAS5a,MAAM4b,MAAQC,QAGrBpB,EAAOlb,SAASya,eAAe,2CAA2C,KAE5ES,EAAKza,MAAM4b,MAAQZ,EAAWc,YAAc,KAC5CrB,EAAKza,MAAMyb,KAAOT,EAAWE,sBAAsB,EAAEO,KAAO,KAEpE,CAKA,SAASM,gBACL,OAA+B,KAA3B7L,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,wCAIxC,CAAC/L,SAASgM,gBACoB,SAAhChM,SAASP,oBAAyF,IAAxDpQ,SAASC,iBAAiB,iBAAiB,EAAEmB,QACvD,gBAAhCuP,SAASP,oBAAgG,IAAxDpQ,SAASC,iBAAiB,iBAAiB,EAAEmB,OACvG,CAMA,SAASwb,cAAcC,GACnB,GAA+B,KAA3BlM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAGX,IAEYI,EAHZ/M,YAAY,kBAAmB8M,CAAQ,EAClCL,cAAc,GACRxc,CAAAA,SAASya,eAAe,aAAa,KACpCqC,EAAc9c,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAO,iBAAiB,EACjDuR,EAAYvR,aAAa,QAAS,iBAAiB,EACnDuR,EAAYvR,aAAa,KAAM,aAAa,EAC5CuR,EAAYvR,aAAa,QAAS,+BAA+B,EACjEuR,EAAYvR,aAAa,MAAOsR,CAAQ,EACxCtU,MAAM,MAAM,EAAElD,OAAOyX,CAAW,EAG5C,CAMA,SAASC,8BAA8BF,GACnC,GAA+B,KAA3BlM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAEX,IAEYI,EAFPN,cAAc,GACRxc,CAAAA,SAASya,eAAe,aAAa,KACpCqC,EAAc9c,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAO,iBAAiB,EACjDuR,EAAYvR,aAAa,QAAS,iBAAiB,EACnDuR,EAAYvR,aAAa,KAAM,aAAa,EAC5CuR,EAAYvR,aAAa,QAAS,+BAA+B,EACjEuR,EAAYvR,aAAa,MAAOiH,mBAAmBqK,CAAQ,CAAC,EAC5DtU,MAAM,MAAM,EAAElD,OAAOyX,CAAW,EAG5C,CAMA,SAASE,gBACL,GAA+B,KAA3BrM,SAAS8L,gBAA0E,KAAjD9L,SAAS+L,qCAC3C,MAAO,CAAA,EAIXxb,IAAI+b,EAAuBzM,kBAAkBsD,IAAI,iBAAiB,EAClE,GAA8B,CAAA,IAAzBmJ,EAAiC,CAClC,GAAOzM,kBAAkB6D,QAAQ,kBAAmB,KAAQ,EAKxD,OADA0I,KAAAA,8BAA8BE,CAAoB,EAHlDzM,kBAAkBgE,OAAO,iBAAiB,CAMlD,CAE2C,SAAtCvM,kBAAkBG,gBACnBuK,sBACI,sBACA,CACIzJ,OAAQ,OACRhG,SAAU,SAAS8S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBkH,SAAuC,IAA5BlH,EAAOxR,QAAQ,OAAO,IAE3EgM,kBAAkBsD,IAAI,iBAAiB,IAE1CtD,kBAAkBC,IAAI,kBAAmBuF,CAAM,EAE/ClF,oCAAoC,GAGxC8L,cAAc5G,CAAM,EAE5B,CACJ,CACJ,EAGApD,sBACI,CACIC,OAAQ,qBACZ,EACA,CACIpG,QAAS,CAAA,EACTvJ,SAAU,SAAS8S,GACXA,IACmB,UAAlB,OAAOA,GAAuBA,aAAkBkH,SAAuC,IAA5BlH,EAAOxR,QAAQ,OAAO,IAE3EgM,kBAAkBsD,IAAI,iBAAiB,IAE1CtD,kBAAkBC,IAAI,kBAAmBuF,CAAM,EAE/ClF,oCAAoC,GAGxC8L,cAAc5G,CAAM,EAE5B,EACAlD,WAAY,SAAS9J,GACjBA,EAAIqE,iBAAiB,eAAgB,mBAAmB,CAC5D,CACJ,CACJ,CAER,CAKA,SAAS8P,mBACE3M,kBAAkB+D,MAAM,iBAAiB,GAAO/D,kBAAkBsD,IAAI,iBAAiB,IAC1F/D,YAAY,kBAAmB,MAAM,EACrCS,kBAAkBC,IAAI,kBAAmB,CAAA,CAAI,GAGb,WAAhCE,SAASP,oBAC0BvD,KAAAA,IAAnCkG,YAAY,iBAAiB,GAE7BhD,YAAY,kBAAmB,MAAM,CAE7C,CAKA,SAASsJ,kBACE7I,kBAAkB+D,MAAM,gBAAgB,GAAO/D,kBAAkBsD,IAAI,gBAAgB,IACxF/D,YAAY,iBAAkB,MAAM,EACpCS,kBAAkBC,IAAI,iBAAkB,CAAA,CAAI,GAGZ,WAAhCE,SAASP,oBACyBvD,KAAAA,IAAlCkG,YAAY,gBAAgB,GAE5BhD,YAAY,iBAAkB,MAAM,CAE5C,CAKA,SAAS4J,yBACAnJ,kBAAkB+D,MAAM,sBAAsB,GAAM/D,kBAAkB+D,MAAM,eAAe,GAC5F6I,uBAAuB,CAE/B,CAKA,SAASA,yBACL,GACK5M,CAAAA,kBAAkB+D,MAAM,eAAe,GAAK/D,CAAAA,kBAAkBsD,IAAI,eAAe,GACjFtD,CAAAA,kBAAkB+D,MAAM,sBAAsB,GAAK/D,CAAAA,kBAAkBsD,IAAI,sBAAsB,GAE5D,WAAhCnD,SAASP,oBAC+BvD,KAAAA,IAAxCkG,YAAY,sBAAsB,GACDlG,KAAAA,IAAjCkG,YAAY,eAAe,EANnC,CAaA7R,IAAI6N,EAAQsO,eAAe,EAG3B,GAFA1M,SAAS2M,eAAiB,GAEP,EAAfvO,EAAM3N,OACN,IAAKF,IAAIC,EAAI,EAAGA,EAAI4N,EAAM3N,OAAQD,CAAC,GAAI,CAEnC,IAAMoc,EAAoBxO,EAAM5N,GAAGlB,iBAAiB,gBAAgB,EACpE,IAAKiB,IAAIC,EAAI,EAAGA,EAAIoc,EAAkBnc,OAAQD,CAAC,GACT,WAA9Boc,EAAkBpc,GAAGgO,OAErBwB,SAAS2M,eAAejd,KAAKkd,EAAkBpc,EAAE,EAEjD0V,2BAA2B0G,EAAkBpc,GAAI,QAASqc,yBAAyB,EACnF3G,2BAA2B0G,EAAkBpc,GAAI,QAASsc,kBAAkB,EAGxF,CAlBJ,CAoBJ,CAOA,SAASC,sBAAsBC,EAAWC,GACtC,GAAuC,KAAA,IAA5BjN,SAAS2M,gBAAmE,EAAjC3M,SAAS2M,eAAelc,OAC1E,IAAKF,IAAIC,EAAI,EAAGA,EAAIwP,SAAS2M,eAAelc,OAAQD,CAAC,GACjDuX,2BAA2B/H,SAAS2M,eAAenc,GAAIwc,EAAWC,CAAY,CAG1F,CAEA1c,IAAIsc,0BAA4B,SAAgBje,GAC5Cse,qBAAqB,EACrBH,sBAAsB,QAASF,yBAAyB,CAC5D,EAEIC,mBAAqB,SAAgBle,GACrCue,cAAc,EACdJ,sBAAsB,QAASD,kBAAkB,CACrD,EAKA,SAASI,uBACErN,kBAAkB+D,MAAM,sBAAsB,GAAO/D,kBAAkBsD,IAAI,sBAAsB,GACpGtD,kBAAkBC,IAAI,uBAAwB,CAAA,CAAI,GAKV,WAAhCE,SAASP,oBAC+BvD,KAAAA,IAAxCkG,YAAY,sBAAsB,GAEN,gBAAhCpC,SAASP,oBAGuB,SAAhCO,SAASP,qBAEiC,KAAA,IAA/BO,SAASC,mBACgB/D,KAAAA,IAA/B8D,SAASC,mBAAmCD,SAASC,qBAI9Db,YAAY,uBAAwB,MAAM,CAElD,CAKA,SAAS+N,gBACEtN,kBAAkB+D,MAAM,eAAe,GAAO/D,kBAAkBsD,IAAI,eAAe,GACtFtD,kBAAkBC,IAAI,gBAAiB,CAAA,CAAI,GAKH,WAAhCE,SAASP,oBACwBvD,KAAAA,IAAjCkG,YAAY,eAAe,GAEC,gBAAhCpC,SAASP,oBAGuB,SAAhCO,SAASP,qBAEiC,KAAA,IAA/BO,SAASC,mBACgB/D,KAAAA,IAA/B8D,SAASC,mBAAmCD,SAASC,qBAI9Db,YAAY,gBAAiB,MAAM,CAE3C,CAYA,SAASgO,gCAEL,SAASC,EAAsBhV,GAC3B,GAAIA,EAAIiV,cACmC,CAAC,IAAxCjV,EAAIiV,aAAazZ,QAAQ,QAAQ,GACO,CAAC,IAAzCwE,EAAIiV,aAAazZ,QAAQ,SAAS,EAElC,IACI0Z,oBAAoBhX,KAAKW,MAAMmB,EAAIiV,YAAY,CAAC,CAGpD,CAFE,MAAO5L,GACL7H,QAAQrE,IAAIkM,EAAE3E,SAAS,CAAC,CAC5B,CAER,CAEsB,aAAlB,OAAOyQ,OAEwC,YAA3C,OAAOA,OAAOne,QAAQ,EAAEoe,aAAa,EACrCD,OAAOne,QAAQ,EAAEyC,GAAG,eAAgB,SAASlD,EAAOyJ,EAAKqV,GACrDL,EAAsBhV,CAAG,CAC7B,CAAC,EAEDmV,OAAOne,QAAQ,EAAEoe,aAAc,SAAS7e,EAAOyJ,EAAKqV,GAChDL,EAAsBhV,CAAG,CAC7B,CAAC,EAIyB,aAA1B,OAAOC,gBAEPjJ,SAAS2C,iBAAiB,mBAAoB,SAASpD,GACnB,IAA5BA,EAAMuD,OAAOoJ,YACb8R,EAAsBze,EAAMuD,MAAM,CAE1C,CAAC,CAGb,CAMA,SAASwb,kCACLhG,uBAAyBc,YAAa,WAClC,IAIImF,EAJoD,MAApD/N,kBAAkBsD,IAAI,wBAAwB,EAC9C6G,cAAcrC,sBAAsB,GAGpCiG,EAAa/N,kBAAkBsD,IAAI,0BAA0B,KAE7DpD,uBAAuB,CAAC,CAAC,8BAA+B6N,IAAc,CAAC1N,gBAAiB,CAAA,CAAI,CAAC,EAC7FL,kBAAkBC,IAAI,yBAA0B,GAAG,EACnDkK,cAAcrC,sBAAsB,EAG5C,EAAG,GAAI,CACX,CAOA,SAASkG,cACLxe,SAAS2C,iBAAiB,oBAAqB,WAED,KAAA,IAA/BgO,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,qBAEzDE,oCAAoC,EACF,YAA9B,OAAO4J,qBAAwE,YAAnC,OAAO+D,yBACnD/D,mBAAmB+D,wBAAwB3K,IAAI,0BAA0B,CAAC,CAGtF,CAAC,EACMnD,SAAS+N,qBACZC,yBAAyB,EAG7BZ,8BAA8B,EAGzBpJ,oBAAoBJ,MAAM,kBAAkB,EAW7C/D,kBAAkBC,IAAI,kBAAmBlP,OAAOiP,kBAAkBsD,IAAI,iBAAiB,CAAC,EAAI,CAAC,GAVvF8K,EAAYhL,sBAAsB,EACxCe,oBAAoBlE,IAAI,mBAAoBmO,EAAW,CAAA,CAAK,EAC5DpO,kBAAkBC,IAAI,kBAAmB,CAAC,EACtCzQ,SAAS8V,UACQ,IAAI+I,IAAI7e,SAAS8V,QAAQ,EAC3BgJ,OAASxX,SAASwX,MAC7BnK,oBAAoBlE,IAAI,qBAAsBzQ,SAAS8V,SAAU,CAAA,CAAK,GAOlFiJ,oCAAoC,EAdpC,IAgBMC,EAAcxO,kBAAkBsD,IAAI,iBAAiB,EAoBrDmL,GAnBCD,GAAeA,IAAgBrO,SAASP,qBAC3CI,kBAAkBC,IAAI,kBAAmBE,SAASP,kBAAkB,EACpEI,kBAAkBgE,OAAO,gBAAgB,EACzChE,kBAAkBgE,OAAO,iBAAiB,GAGV,gBAAhC7D,SAASP,qBACTgN,uBAAuB,EAEvBtX,WAAWsX,uBAAwB,GAAI,GAG3CxX,OAAOjD,iBAAiB,iBAAkBkS,sBAAuB,CAAA,CAAI,EACrEjP,OAAOjD,iBAAiB,QAASsS,aAAc,CAAA,CAAI,EACnDjV,SAASkf,WAAa,IAAIpI,WAC1B9W,SAASkf,WAAW1H,gBAAgB,EACpCxX,SAASkf,WAAWlQ,aAAa,EAGb,CAChB,CAAC,kBAAmBvG,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,GAC1D,CAAC,mBAAoB,KACrB,CAAC,kBAAmB,KAEpB,CAAC,cAAeyD,OAAOsH,kBAAkB,EAAE,GAAG,CAAE,GAChD,CAAC,iBAAkBC,mBAAmB,GACtC,CAAC,iBAAkB3X,UAAU4X,aAWjC,GARA7O,kBAAkBC,IAAI,kBAAmBhI,KAAKC,OAAM,IAAIhD,MAAO0O,QAAQ,EAAI,GAAI,CAAC,EAChF5D,kBAAkBC,IAAI,mBAAoB,GAAG,EAC7CD,kBAAkBC,IAAI,kBAAmB,GAAG,EAE5CD,kBAAkBC,IAAI,cAAeoH,OAAOsH,kBAAkB,EAAE,GAAG,CAAE,CAAG,EACxE3O,kBAAkBC,IAAI,iBAAkB2O,mBAAmB,CAAC,EAC5D5O,kBAAkBC,IAAI,iBAAkBhJ,UAAU4X,SAAS,EAEtB,WAAhC1O,SAASP,mBACV6O,EAAY5e,KAAK,CAAC,uBAAwB,IAAI,MAC3C,CAEHa,IAAIoe,EAAetf,SAASkR,OAAOqO,MAAM,GAAG,EAC5C,GAA6B,IAAxBD,EAAale,OACd,IAAMF,IAAIC,EAAI,EAAGA,EAAIme,EAAale,OAAQD,CAAC,GAAK,CAC5CD,IACIiS,EADgBmM,EAAane,GAAGqe,KAAK,EACVD,MAAM,GAAG,EAAE,GACW,IAAhDpM,EAAW3O,QAAQ,uBAAuB,GAC3C0O,eAAeC,CAAU,CAEjC,CAER,CAGI,CAAA,CAACxC,SAAS8L,gBACoB,GAA5B,CAAC9L,SAAS8L,gBAAwE,GAAjD9L,SAAS+L,uCAEvCF,cAAc,EACfQ,cAAc,EAEdiC,EAAY5e,KAAK,CAAC,kBAAmBsQ,SAAS8O,WAAW,GAI5D,CAAC9O,SAAS+O,gCACXT,EAAY5e,KAAK,CAAC,oBAAqB,IAAI,EAC3CkI,MAAM,+BAAiC,EAAE9F,GAAG,OAAQmY,UAAU,GAG7D,CAACjK,SAASgP,+BACXV,EAAY5e,KAAK,CAAC,0BAA2B,IAAI,EACjDkI,MAAM,iDAAmD,EAAE9F,GAAG,OAAQwY,eAAe,GAGrFzK,kBAAkB+D,MAAM,YAAY,EACpC0K,EAAY5e,KAAK,CAAC,aAAcmQ,kBAAkBsD,IAAI,YAAY,EAAE,EAEpEmL,EAAY5e,KAAK,CAAC,aAAc,EAAE,EAItCgR,8BAA8B,EAG9BnQ,IAAI0e,EAAmBpP,kBAAkBsD,IAAI,0BAA0B,EAqGnE+L,GApGsC,KAAA,IAA/BlP,SAASC,mBAChBD,SAASC,mBACTD,SAAS+L,uCAETlM,kBAAkBC,IAAI,yBAA0B,GAAG,EAC/CmP,GACAX,EAAY5e,KAAK,CAAC,8BAA+Buf,EAAiB,EAClEpP,kBAAkBC,IAAI,yBAA0B,GAAG,GAEnD6N,gCAAgC,GAIxCvO,YAAYkP,CAAW,EAEvBnZ,WAAW,WAEkC,KAAA,IAA9B6K,SAASC,oBACgB,cAA/BD,SAASC,mBAAsCD,SAASC,oBAEzDE,oCAAoC,EAIG,KAAA,IAAhCH,SAASP,oBACgB,SAAhCO,SAASP,qBAET0P,0CAA0C,EAC1CC,mBAAmB,GAGvB,IAAK7e,IAAIC,EAAI,EAAGA,EAAInB,SAAS+O,MAAM3N,OAAQD,CAAC,GAAI,CAC5CD,IA0BI8e,EAIAC,EA9BA5J,EAAOrW,SAAS+O,MAAM5N,GAGtB+e,8BAA8BlgB,SAAS+O,MAAM5N,GAAI,gBAAgB,GAGjEkV,EAAKtT,cAAc,qCAAqC,GACxDsT,EAAKtT,cAAc,8CAA8C,GACjEsT,EAAKtT,cAAc,8CAA8C,GAOb8J,KAAAA,IAApD7M,SAAS+O,MAAM5N,GAAG/B,SAAS+gB,sBAC8B,EAAzDngB,SAAS+O,MAAM5N,GAAG/B,SAAS+gB,qBAAqB/e,SAKhDiV,EAAKtT,cAAc,oCAAoC,IACnDqd,EAAgB/J,EAAKtT,cAAc,oCAAoC,EAC3EsT,EAAKgK,YAAYD,CAAa,IAG9BJ,EAAchgB,SAASoE,cAAe,OAAQ,GACtCmH,aAAc,OAAQ,QAAS,EAC3CyU,EAAYzU,aAAc,KAAM,wBAA0BpK,CAAE,EAC5D6e,EAAYzU,aAAc,OAAQ,sBAAsB,GACpD0U,EAAuB,IACN,GAAKK,6BAA6BjK,CAAI,EAC3D2J,EAAYvc,MAAQ8c,KAAKrZ,KAAKC,UAAU8Y,CAAoB,CAAC,EAC7D5J,EAAKhR,OAAQ2a,CAAY,EAEzB3J,EAAKmK,cAAgBnK,EAAKoK,SAE1BpK,EAAKqK,YAAcvf,EACnBkV,EAAKoK,SAAW,SAASlhB,GACgB,WAAhCoR,SAASP,oBAAuE,KAAA,IAA7B7Q,EAAMuD,OAAO4d,aACjEC,gCAAiCL,6BAA6B7gB,IAAI,EAAGF,EAAMuD,OAAO4d,WAAY,EAG9D,SAAhC/P,SAASP,oBAAiCwQ,uBAAuBrhB,EAAMuD,MAAM,IAC7E8C,OAAOqD,eAAepJ,UAAUyL,KAAO,SAAS1H,GAC5C1C,IACA2f,EAAe,uCADIC,gBAAgB,EACoC,IACvEC,YAAYhhB,KAAKN,KAAMohB,EAAejd,CAAI,EAC1CkC,WAAW,KACPF,OAAOqD,eAAepJ,UAAUyL,KAAOyV,WAC3C,EAAG,CAAC,CACR,GAIAxhB,EAAMuD,OAAO0d,yBAAyBQ,UAAY,CAACC,0BAA0B1hB,EAAMuD,MAAM,IAC1D+J,KAAAA,IAA3BtN,EAAMuD,OAAOjB,WAA2BtC,EAAMuD,OAAOjB,UAAUqf,SAAS,iBAAiB,GACzF3hB,EAAM4hB,eAAe,EAEzBrb,WAAW,WACPvG,EAAMuD,OAAO0d,cAAczgB,KAAKR,EAAMuD,OAAQvD,CAAK,CACvD,EAAG,CAAC,EAEZ,EACJ,CACJ,EAAG,GAAI,EAGiBS,SAASC,iBAAiB,wBAAwB,GAE1E,IADA0Q,SAASkP,kBAAoBA,GACPze,OAClB,IAAKF,IAAIC,EAAI,EAAGA,EAAI0e,EAAkBze,OAAQ,EAAED,EAC5C0e,EAAkB1e,GAAGwB,iBAAiB,QAASye,yBAAyB,EAKhF,IAAK,IAAMC,KAASrhB,SAAS+O,MAED,aAApB,OAAO4B,UACqC,GAA5C,CAAEA,SAAS2Q,8BACX,EACiC,eAA7BD,EAAM9d,aAAa,IAAI,GACU,OAAhC8d,EAAM9d,aAAa,OAAO,GAAqE,CAAC,IAAxD8d,EAAM9d,aAAa,OAAO,EAAEiB,QAAQ,aAAa,GAC1D,OAA/B6c,EAAM9d,aAAa,MAAM,GAA+D,CAAC,IAAlD8d,EAAM9d,aAAa,MAAM,EAAEiB,QAAQ,QAAQ,IAInF6c,EAAMte,cAAc,8BAA8B,GAKrB,qBAA7Bse,EAAM9d,aAAa,IAAI,GACS,2BAAhC8d,EAAM9d,aAAa,OAAO,IAM9B8d,EAAME,wBAA0BF,EAAMZ,SACtCY,EAAMZ,SAAW,GAAOe,4BAA4BnP,EAAGgP,CAAK,GAKpEI,yBAAyB,EAGzB,IAAI7S,4BAOA+B,SAAS+Q,6BACTC,sBAAsB,CAE9B,CAKA,SAASA,wBACL,GAAIhR,SAAS+L,qCAAsC,CAC/C,IAAMkF,EAA4BxI,YAAY,KACdzR,CAAAA,aAAaka,2BAGrC9R,YAAY,2BAA4B,IAAK,MAAM,EACnD4K,cAAciH,CAAyB,EAE/C,EAAG,GAAG,CACV,CACJ,CAKA,SAAS7B,qBA2BDna,OAAOsC,eAAe,IAAI,GAC1BtC,OAAOkc,GAAG5Z,eAAe,UAAU,GACD,YAAlC,OAAOtC,OAAOkc,GAAGC,SAASC,KAE1Bpc,OAAOkc,GAAGC,SAASC,IA9BI,CAACC,EAASC,KACV,UAAnB,OAAOD,GAAoC,OAAZA,GAC9BA,EAAQ/Z,eAAe,MAAM,GAAM+Z,EAAQ/Z,eAAe,MAAM,IAMjE+Z,EAAQre,KAAKsE,eAAe,UAAU,GACP,EAA/B+Z,EAAQre,KAAKue,SAAS/gB,QACtB6gB,EAAQre,KAAKue,SAAS,GAAGja,eAAe,MAAM,GACZ,+BAAlC+Z,EAAQre,KAAKue,SAAS,GAAGC,OAEzBH,EAAQre,KAAKue,SAAS,GAAGve,KAAKye,0BAA4BvB,gBAAgB,EAC1EmB,EAAQre,KAAKue,SAAS,GAAGve,KAAK0e,YAAc3a,aAAaC,QAAQ,0BAA0B,GAI1E,0BAAjBqa,EAAQG,QACRH,EAAQre,KAAKye,0BAA4BvB,gBAAgB,EACzDmB,EAAQre,KAAK0e,YAAc3a,aAAaC,QAAQ,0BAA0B,GAGvEsa,EAAKD,CAAO,EAOsB,CAEjD,CAKA,SAASR,2BAEL,GAAqD,OAAhDzhB,SAAS+C,cAAc,mBAAmB,EAAa,CACxD,IAAMwf,EAAetZ,eAAepJ,UAAUyL,KAC9CrC,eAAepJ,UAAUyL,KAAO,SAASvB,GAErC,GACIA,GACgB,UAAhB,OAAOA,GAEmD,CAAC,IAAvDA,EAAKvF,QAAQ,mCAAmC,EAEtD,CACEtD,IAAIshB,EAA0B,GAC1BjE,EAAa5W,aAAaC,QAAQ,0BAA0B,EAChE,IACI2W,EAAarX,KAAKW,MAAM0W,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CAEmB,OAAfA,GACe,CAAA,IAAfA,GACAA,EAAWrW,eAAe,OAAO,GACZ,KAArBqW,EAAW9a,QAEX8a,EAAaA,EAAW9a,MACxB+e,GAA2B,0CAAiDjE,GAGhFrd,IAAI2f,EAAeC,gBAAgB,EAGnC/W,GAFAyY,GAA2B,wCAA+C3B,CAK9E,CACA,OAAO0B,EAAaE,MAAMhjB,KAAM,CAACsK,EAAK,CAC1C,CACJ,CACJ,CAMA,SAAS2Y,4CAA4CC,GAE5CA,IAC0C,SAAtC1a,kBAAkBG,gBACnBuK,sBAAsB,iCAAkC,EAAE,EACZ,eAAtC1K,kBAAkBG,iBAC1BwK,sBAAsB,CAACC,OAAQ,gCAAgC,EAAG,EAAE,EAGhF,CAUA,SAASiN,4CAIL5e,IAAIqd,EAAa,CAAA,EACM,aAAlB,OAAOJ,QAAsD,YAA5B,OAAOA,OAAOyE,WAChDzE,OAAOyE,UAAU,CACb9P,WAAY,SAAS9J,EAAKqV,GACtBnd,IAAI2hB,EAAa,CAAA,EA0BjB,GAxB8B,UAAzB,OAAOxE,EAASza,OAC8B,CAAC,IAA5Cya,EAASza,KAAKY,QAAQ,eAAe,IACrCqe,EAAa,iBAGgC,CAAC,IAA9CxE,EAASza,KAAKY,QAAQ,iBAAiB,IACvCqe,EAAa,mBAIyC,CAAC,IAAvDxE,EAASza,KAAKY,QAAQ,0BAA0B,GACI,CAAC,IAArD6Z,EAASza,KAAKY,QAAQ,wBAAwB,IAE9Cqe,EAAa,4BAG0C,CAAC,IAAxDxE,EAASza,KAAKY,QAAQ,2BAA2B,IACjDqe,EAAa,6BAG4C,CAAC,IAA1DxE,EAASza,KAAKY,QAAQ,6BAA6B,KACnDqe,EAAa,+BAGQ,UAAxB,OAAOxE,EAASnY,KACmC,CAAC,IAAjDmY,EAASnY,IAAI1B,QAAQ,qBAAqB,IAC1Cqe,EAAa,sBAC4C,OAArDlb,aAAaC,QAAQ,0BAA0B,GAAY,CAC3D2W,EAAa5W,aAAaC,QAAQ,0BAA0B,EAC5D,IACI2W,EAAarX,KAAKW,MAAM0W,CAAU,CAGtC,CAFE,MACEA,EAAa,CAAA,CACjB,CACmB,CAAA,IAAfA,GAAwBA,EAAWrW,eAAe,OAAO,GAA0B,KAArBqW,EAAW9a,QACzE8a,EAAaA,EAAW9a,MAEhC,CAIR,IACQod,EADJgC,IACIhC,EAAeC,gBAAgB,EAE/BvC,EADsB,UAAtB,OAAOA,EACM,yCAA2CA,EAAa,IAExD,GAIjBF,EAASza,MAFTid,EAAe,uCAAyCA,EAAe,KAExCtC,EAAaF,EAASza,KAE7D,CACJ,CAAC,CAET,CAGA,SAASqd,0BAA0B5K,GAC/B,MAAIA,CAAAA,CAAAA,EAAKxU,UAAUqf,SAAS,wBAAwB,CAKxD,CAgBA,SAASM,4BAA4BnP,EAAGyQ,GACpC,IAEI,IAAMC,EAAgBD,EAAW/f,cAAc,4BAA4B,EACvEigB,EAAU,KAEQ,OAAlBD,GACwB,OAAxBA,EAActf,QAEduf,EAAUD,EAActf,OAI5BvC,IAQU+hB,EAWF3D,EAmBE4D,EAtCNC,EAA4BC,6BAA6B,EAGzDC,EAAyB7S,kBAAkBsD,IAAI,0BAA0B,EAG1C,OAA9BqP,GAAwD,OAAlBJ,GAAqD,OAA3BM,IACjEhR,EAAE8O,eAAe,EACX8B,EAAW,KACS,OAAlBF,GACAA,EAAcO,WAAWjD,YAAY0C,CAAa,EAEJ,YAA9C,OAAOD,EAAWvB,wBAClBuB,EAAWvB,wBAAwB,EAEnCgC,gBAAgB1jB,UAAU2jB,OAAOzjB,KAAK+iB,CAAU,CAExD,EAEIxD,EAAe6D,EAGF,OAAZH,IACD1D,EAAamE,kCAAoCT,GAIrD1D,EAAaoE,4BAA8BL,EAIC,UAAxC,OAAO/D,EAAa/M,iBAC4B,CAAC,IAAjD+M,EAAa/M,gBAAgB/N,QAAQ,KAAK,IAE1C8a,EAAa/M,gBAAkBC,mBAAmB8M,EAAa/M,eAAe,GAOpD,KAAA,KAHxB2Q,EAAgBhc,KAAKC,UAAUmY,CAAY,IAGqB,IAAzB4D,EAAc9hB,OACvDsP,uBACIwS,EACA,CAAChgB,SAAU+f,EAAUvZ,gBAAiBuZ,EAAUpS,gBAAiB,CAAA,CAAI,CACzE,EAEAoS,EAAS,EAKrB,CAFE,MAAO5b,GACLmD,QAAQmZ,KAAK,6CAA+Ctc,CAAK,CACrE,CACJ,CAMA,SAAS+K,wBAAwBwR,EAAgB,IAC7C1iB,IAAI2iB,EAAiB,GAErBA,EAAeC,kBAAoB/Q,YAAY9K,kBAAkBkJ,aAAe,mBAAmB,EACnG0S,EAAeE,wBAA0BhR,YAAY9K,kBAAkBkJ,aAAe,yBAAyB,EAC/G0S,EAAeG,WAAajR,YAAY9K,kBAAkBkJ,aAAe,YAAY,EACrF0S,EAAeI,iBAAmBlR,YAAY9K,kBAAkBkJ,aAAe,kBAAkB,EACjG0S,EAAeK,gBAAkBnR,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAC/F0S,EAAeM,gBAAkBpR,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAC/F0S,EAAeO,eAAiBrR,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EAC7F0S,EAAeQ,YAActR,YAAY9K,kBAAkBkJ,aAAe,aAAa,EAGvF,IAAMmT,EAA2B9T,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,gBAAgB,EAClGoT,EAA4B/T,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACpGqT,EAA4BhU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACpGsT,EAAgBjU,kBAAkBsD,IAAI,iBAAiB,EACvD4Q,EAAmB/P,oBAAoBb,IAAI,oBAAoB,EAC/D6Q,EAAmBhQ,oBAAoBb,IAAI,oBAAoB,EAC/D8Q,EAAyBpU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,cAAc,EAC9F0T,EAAarU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,iBAAiB,EACrF2T,EAAgBtU,kBAAkBsD,IAAI7L,kBAAkBkJ,aAAe,gBAAgB,EACvF4T,EAA+BvU,kBAAkBsD,IACnD7L,kBAAkBkJ,aAAe,mCACrC,EAGM6T,EAAqBjS,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EAClF8T,EAAsBlS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EACpF+T,EAAsBnS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EACpFgU,EAAoBpS,YAAY9K,kBAAkBkJ,aAAe,iBAAiB,EAClFiU,EAAsB,CAAC,CAACrS,YAAY9K,kBAAkBkJ,aAAe,gBAAgB,EA8B3F,GA3BA0S,EAAewB,eAA8CxY,KAAAA,IAA7ByX,EAC5BA,EAA2BU,EAC/BnB,EAAeyB,gBAAgDzY,KAAAA,IAA9B0X,EAC7BA,EAA4BU,EAChCpB,EAAe0B,gBAAgD1Y,KAAAA,IAA9B2X,EAC7BA,EAA4BU,EAChCrB,EAAetR,gBAAiC1F,KAAAA,IAAfgY,EAC7BA,EAAaM,EACjBtB,EAAe2B,eAAmC3Y,KAAAA,IAAlBiY,EAC5BA,EAAgBM,EACpBvB,EAAe4B,kCAAqE5Y,KAAAA,IAAjCkY,EAC/CA,EAA+B,GAC/BlB,EAAetR,iBAA6D,UAA1C,OAAOsR,EAA8B,iBACnEA,EAAetR,gBAAgB/N,QAAQ,QAAQ,IAC/Cqf,EAAetR,gBAAkBC,mBAAmBqR,EAAetR,eAAe,GAI1FsR,EAAe6B,gBAAkBjB,EACjCZ,EAAe8B,mBAAqBjB,EACpCb,EAAe+B,mBAAqBjB,EACpCd,EAAegC,mBAAqBjB,EAE/Bf,EAAetR,kBAChBsR,EAAetR,gBAAkB5B,SAAS8O,YAGd,UAA3B,OAAO,EACR,IAAKve,IAAIC,EAAI,EAAGA,EAAIyiB,EAAcxiB,OAAQ,EAAED,EACF,UAAjC,OAAQyiB,EAAcziB,GAAG,GAE1B0iB,EAAeD,EAAcziB,GAAG,GAAG,IAAMyiB,EAAcziB,GAAG,GAAG,GAE7D0iB,EAAeD,EAAcziB,GAAG,IAAMyiB,EAAcziB,GAAG,QAI/DqJ,QAAQrE,IAAI,+CAA+C,EAO/D,OAHA0d,EAAiBiC,yBAAyBjC,CAAc,EAGjD3c,KAAKC,UAAU0c,CAAc,CACxC,CAUA,SAASiC,yBAAyBhY,GAC9B,GAAuB,UAAlB,OAAOA,EAER,IAAK5M,IAAI6M,KAAaD,EAAQ,CAO1B,IAIUE,EATwB,UAA7B,OAAOF,EAAOC,KACfD,EAAOC,GAAa+X,yBAAyBhY,EAAOC,EAAU,GAKjC,UAA7B,OAAOD,EAAOC,IACiC,OAA/CD,EAAOC,GAAW7J,MAAM,iBAAiB,GAGb,UAAvB,OADC8J,EAAc9G,KAAKW,MAAMiG,EAAOC,EAAU,KAE5CD,EAAOC,GAAaC,EAGhC,CAGJ,OAAOF,CACX,CAGA,SAASwS,6BAA8BjK,GAEnCnV,IAAI6kB,EAAS,GACTC,EAAgB,GAChBC,EAAqB,EACrBC,EAAkB,GAClBC,EAAuB,EACvBC,EAA2B,GAE/B,IAAKllB,IAAIiJ,KAAOkM,EAAKjX,SACZinB,MAAM,CAAClc,CAAG,IACX4b,EAAO5b,GAAOkM,EAAKjX,SAAS+K,IAsDpC,OAjDA4b,EAASA,EAAOhiB,OAAO,SAASzD,GAE5B,MAAuE,CAAC,IAAnE8lB,EAAyB5hB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IAI5D,CAAC,IAAM,CAAC,QAAS,YAAYiB,QAASlE,EAAKiD,aAAa,MAAM,CAAE,IACjE6iB,EAAyB/lB,KAAMC,EAAKiD,aAAa,MAAM,CAAE,EAClD,CAAA,GAGf,CAAC,GAGM+M,QAAQ,SAAShQ,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,EAAEgmB,YACY,MAAnChlB,iBAAiBhB,CAAI,EAAEkF,SACO,WAA9BlF,EAAKiD,aAAa,MAAM,GAEnBjD,EAAKuB,UAAUqf,SAAS,gBAAgB,GAW7C8E,GAAiB,IAAM1lB,EAAKiD,aAAa,MAAM,EAC/C0iB,CAAkB,KARdC,GAAmB,IAAM5lB,EAAKiD,aAAa,MAAM,EACjD4iB,CAAoB,IAShC,CAAC,EAEDD,EAAkBA,EAAgB1G,KAAK,EAGhC,CACH+G,eAHJP,EAAgBA,EAAcxG,KAAK,EAI/BgH,qBAAsBP,EACtBQ,iBAAkBP,EAClBQ,uBAAwBP,CAC5B,CACJ,CAGA,SAASxF,gCAAiCgG,EAAyBC,GAC/D1lB,IAAI2lB,EAAgD,UAAnC,OAAOF,GAAoE,OAA5BA,EAC5DA,EAA0B,GAE9B,GAAqC,WAAhChW,SAASP,mBAEV,IAAMlP,IAAIC,KAAK0lB,EAAa,CACxB,GAAS,GAAJ1lB,EAED,OAGJ4O,YAAY,yBADqBlD,KAAAA,IAAX+Z,EAAuBA,EAASzlB,GACC+F,KAAKC,UAAW0f,EAAW1lB,EAAG,CAAE,CAC3F,MAEA4O,YAAY,uBAAwB7I,KAAKC,UAAW0f,CAAW,CAAE,CAEzE,CAGA,SAASC,+BAA+B9Q,EAAQpS,EAAM4E,EAAQ4K,GAC1D,GAA8D,EAAzDpT,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,MAAQuS,EAAO+Q,MAEnC,CACJ,CAKA,SAAS3H,qBACL,OAAOlY,KAAKC,UAAU,CAClB6f,UAAWhnB,SAASinB,gBAAgBC,YACpCC,WAAY1e,KAAK2e,IACbpnB,SAAS+J,KAAKsd,aAAcrnB,SAASinB,gBAAgBI,aACrDrnB,SAAS+J,KAAKqS,aAAcpc,SAASinB,gBAAgB7K,aACrDpc,SAAS+J,KAAKud,aAActnB,SAASinB,gBAAgBK,YACzD,EACAC,aAAcvnB,SAASinB,gBAAgBO,YACvCC,cAAeznB,SAASinB,gBAAgBK,YAC5C,CAAC,CACL,CAGA,SAASpJ,oBAAoBnS,GACzB7K,IAAI+E,EAAM,GACoB,KAAA,IAAnB8F,EAASxD,QAChBwD,EAAWA,EAASxD,OACPmf,UACTzhB,EAAM8F,EAAS4b,UAMf1hB,EAHqB,KAAA,IAAlB8F,EAASnI,MAESiJ,KAAAA,KADzBd,EAAWA,EAASnI,MACPyC,QACH0F,EAAS1F,QAInBJ,KACAjG,SAASyS,cACL,IAAIC,YAAa,qBAAsB,CACnC2C,QAAS,CAAA,EACTE,OAAQ,CAAClP,QAASJ,CAAG,CACzB,CAAE,CACN,EAGA2hB,eAAeC,OAAS5hB,EACxB2hB,eAAend,KAAK,EAEU,GAA1B,CAACsB,EAAS+b,cACVliB,OAAOmiB,KAAK,CAGxB,CAGA,SAASC,0BAA0BC,GAE/BlY,YAAY,kBAAmBkY,CAAY,CAC/C,CAGA,SAASC,+BAA+B/Y,GACpCjO,IAAIgU,EAAY,SACH,WAAT/F,IACA+F,EAAY,UAEhBhU,IAAIuW,EAAQ,GAERoJ,EAAeuC,6BAA6B,EAChDvC,EAAe3Z,KAAKC,UAAU0Z,CAAY,EAQ1C,OAPAA,EAAe,sBAAwBN,KAAKM,CAAY,GACxDpJ,EAAQzX,SAASoE,cAAc,OAAO,GAChCmH,aAAa,OAAQ,2BAA2B,EACtDkM,EAAMlM,aAAa,QAASsV,CAAY,EACxCpJ,EAAMlM,aAAa,OAAQ2J,CAAS,EACpCuC,EAAM5V,UAAUC,IAAI,qBAAqB,EACzC2V,EAAM5V,UAAUC,IAAI,2BAA2B,EACxC2V,CACX,CAOA,SAAS2L,+BACLliB,IAWQinB,EAXJC,EAAoB5X,kBAAkBkE,iBAAiB,EACvD2T,EAAsB1T,oBAAoBD,iBAAiB,EAE/DxT,IAAIonB,EAAmB,CAACC,KAAM,EAAE,EAK5BC,GAJAxoB,SAASkf,YAAclf,SAASkf,WAAWtb,OAC3C0kB,EAAmB,CAACC,KAAMvoB,SAASkf,WAAWtb,IAAI,GAGnB,CAAC6kB,8BAA+B,EAAE,GAOrE,OALIzoB,SAAS2P,+BACLwY,EAA6BjhB,KAAKW,MAAMX,KAAKC,UAAUnH,SAAS2P,4BAA4B,CAAC,EACjG6Y,EAA+B,CAACC,8BAA+BN,CAA0B,GAGtF,CAAC,GAAGC,EAAmB,GAAGC,EAAqB,GAAGC,EAAkB,GAAGE,CAA4B,CAC9G,CAKA,SAASnL,iBACLnc,IAAI6N,EAAQ/O,SAAS+O,MACrB,OAAIA,GAGG,CAAA,CACX,CAOA,SAAS2Z,+BAA+BrS,GAEpCnV,IAAI8U,EAAS,CAAC2S,UAAa,EAAGpC,eAAkB,CAAC,EAkC7CqC,IAhC4C,GAA5C,CAACjY,SAASkY,+BACgC,QAAzCxS,EAAKnN,OAAOwE,SAAS,EAAEhJ,YAAY,GACiB,IAArD2R,EAAKpW,iBAAiB,kBAAkB,EAAEmB,QAC9B,kBAAZiV,EAAKyS,IACLzS,EAAKxU,UAAUqf,SAAS,iBAAiB,GACzC7K,EAAKvR,cAAcjD,UAAUqf,SAAS,aAAa,GACI,CAAC,IAAxD7K,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,kBAAkB,GAChD6R,EAAKyS,IAAkB,eAAZzS,EAAKyS,IAChBzS,EAAKxU,WAAawU,EAAKxU,UAAUqf,SAAS,eAAe,GACzD7K,EAAKxU,WAAawU,EAAKxU,UAAUqf,SAAS,WAAW,GACrD7K,EAAKyS,IAAkB,6BAAZzS,EAAKyS,IAChBzS,EAAKyS,IAAyD,CAAC,IAApDzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,kBAAkB,GACxD6R,EAAKyS,IAAiD,CAAC,IAA5CzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,UAAU,GAChD6R,EAAKyS,IACuD,CAAC,IAA1DzS,EAAKyS,GAAGpb,SAAS,EAAElJ,QAAQ,wBAAwB,GACtD6R,EAAKxS,MACyD,CAAC,IAA5DwS,EAAKxS,KAAK6J,SAAS,EAAElJ,QAAQ,wBAAwB,GAC9B,iDAA3B6R,EAAKxD,OAAOnF,SAAS,GACpB2I,EAAKxS,MAA2D,CAAC,IAApDwS,EAAKxS,KAAK6J,SAAS,EAAElJ,QAAQ,gBAAgB,GAC1D6R,EAAKyS,IAAkB,mBAAZzS,EAAKyS,IAChBzS,EAAKyS,IACU,mBAAZzS,EAAKyS,IACmD,CAAC,IAAzDzS,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,mBAAmB,GACrD6R,EAAKyS,IAAkB,yBAAZzS,EAAKyS,IAChBzS,EAAKyS,IAAkB,YAAZzS,EAAKyS,IACmE,CAAC,IAArFzS,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,+CAA+C,GACpC,OAA1C6R,EAAKtT,cAAc,iBAAiB,KAEpCiT,EAAOuQ,eAAiB,GAIAlQ,EAAKiN,YAgBjC,OAdIsF,GAAyBA,EAAsB/mB,UAAUqf,SAAS,UAAU,GAC7D,YAAd7K,EAAKxS,MAAsBwS,EAAKxU,UAAUqf,SAAS,cAAc,KAElElL,EAAO2S,UAAY,GAKnBtS,GAAQA,EAAKxU,UAAUqf,SAAS,wBAAwB,IAExDlL,EAAOuQ,eAAiB,EACxBvQ,EAAO2S,UAAY,GAGhB3S,CACX,CAUA,SAASkK,8BAA8B7J,EAAM0S,GACzC,IAAMC,EAAoC,UAAvB,OAAO3S,EAAW,OAAgBA,EAAKxD,OAAS,GAEnE,MAAIxO,CAAAA,CAAAA,QAAQgS,EAAKtT,cAAc,0BAA0B,CAAC,GAItDsT,CAAAA,CAAAA,EAAKxU,UAAUqf,SAAS,wBAAwB,GAIN,CAAC,IAA3C8H,EAAWxkB,QAAQ,iBAAiB,GAIF,CAAC,IAAnCwkB,EAAWxkB,QAAQ,SAAS,GAIC,UAA7B,OAAO,GACsD,CAAC,IAA9D,CAAC,iBAAkB,aAAaA,QAAQukB,CAAe,GAEhB,IADpBL,+BAA+BrS,CAAI,EACpC0S,EAI1B,CAKA,SAASjY,sCACL,GAAoC,SAAhCH,SAASP,mBAAb,CAIAlP,IAAI6N,EAAQsO,eAAe,EAE3B,GAAItO,EACA,IAAM7N,IAAIC,EAAI,EAAGA,EAAI4N,EAAM3N,OAAQD,CAAC,GAChC,GAAK+e,CAAAA,8BAA8BlgB,SAAS+O,MAAM5N,GAAI,WAAW,IAKhB,OAA7CnB,SAAS+O,MAAM5N,GAAGoC,aAAa,QAAQ,GACoB,SAA3DvD,SAAS+O,MAAM5N,GAAGoC,aAAa,QAAQ,EAAEmB,YAAY,GAAc,CAEnExD,IAAIqW,EAASxI,EAAM5N,GAAGlB,iBAAiB,4BAA4B,EACnE,IAAMiB,IAAI+nB,EAAI,EAAGA,EAAI1R,EAAOnW,OAAQ6nB,CAAC,GACjC1R,EAAO0R,GAAG1Z,UAAY,GAG1BvP,SAAS+O,MAAM5N,GAAGkE,OAAO6iB,+BAA+B,CAAC,CAC7D,CApBR,CAuBJ,CA9jCIvX,SAASiG,kBACTC,2BAA2B7W,SAAU,YAAa+Y,mBAAmB,EACrElC,2BAA2B7W,SAAU,YAAa6Y,kBAAkB,EACpEhC,2BAA2B7W,SAAU,UAAW6Y,kBAAkB,EAClEhC,2BAA2B7W,SAAU,SAAUmd,gBAAgB,GA8hB/DxM,SAASiG,kBACmB,YAAxB5W,SAASkM,WACTsS,YAAY,EAEZ3H,2BAA2B7W,SAAU,mBAAoBwe,WAAW,EAGxEhO,kBAAkBC,IAAI,aAAcE,SAASuY,eAAgB,CAAA,CAAK,GAuhBtE,IAAMC,aAAevjB,OAAOwjB,MACtBrI,YAAc9X,eAAepJ,UAAUyL,KAW7C,SAAS+d,6BACLvjB,WAAW,WACHwjB,oBAAoB,IACpB1jB,OAAOwjB,MAAQ,YAAY1mB,GACvB,IAKQme,EAOR,OAZIne,GACAA,EAAK,IACuB,YAA5B,OAAOA,EAAK,GAAG2X,UACf3X,EAAK,GAAG2X,SAAS,mBAAmB,IAEhCwG,EAAeC,gBAAgB,EAE/Bpe,IAAQA,EAAK,IAAMA,EAAK,GAAGqH,MAC3BrH,EAAK,GAAGqH,KAAK1E,OAAO,4BAA6Bwb,CAAY,EAI9DsI,aAAa1G,MAAM7c,OAAQlD,CAAI,CAC1C,EAER,EAAG,GAAI,CACX,CAKA,SAAS4mB,sBACL,IAAMC,EAAc,CAChB,wBAEJroB,IAAIsoB,EAAc,CAAA,EAGlB,IAAKtoB,IAAImV,KADKrW,SAAS+O,MAEnBwa,EAAYjZ,QAAQ,SAASmZ,GACrBpT,EAAKxU,UAAUqf,SAASuI,CAAS,IACjCD,EAAc,CAAA,EAEtB,CAAC,EAGL,OAAOA,CACX,CAMA,SAAS5I,uBAAuBvK,GAC5B,OAA8E,MAA1ErW,SAAS+C,cAAc,4CAA8C,GAGrEsT,EAAAA,CAAAA,GAAQA,CAAAA,EAAKxD,QAA2E,CAAC,IAAlEwD,EAAKxD,OAAOnF,SAAS,EAAElJ,QAAQ,4BAA4B,EAK1F,CAKA,SAASsc,kBACL5f,IAAIknB,EAAoB5X,kBAAkBkE,iBAAiB,EACvD2T,EAAsB1T,oBAAoBD,iBAAiB,EAC3DmM,EAAe,CAAC,GAAGuH,EAAmB,GAAGC,CAAmB,EAChExH,EAAe3Z,KAAKC,UAAU0Z,CAAY,EAE1C,MAAO,sBAAwBN,KAAKM,CAAY,CACpD,CAMA,SAAS9B,sCACL,IAAM2K,EAAqB/U,oBAAoBb,IAAI,4BAA4B,EAGrD,CAAA,IAAtB4V,GAA+B1pB,SAASsH,SAASC,OAASmiB,GAC1D/U,oBAAoBlE,IAAI,qBAAsBiZ,EAAoB,CAAA,CAAK,EAI3E/U,oBAAoBlE,IAAI,6BAA8BzQ,SAASsH,SAASC,KAAM,CAAA,CAAK,CACvF,CAKA,SAASoX,2BAEL3e,SAASC,iBAAiB,uEAAuE,EAAEqQ,QAAQ,IACvGqZ,EAAGhnB,iBAAiB,QAAS,SAAS0P,GAClCnR,IAAIqG,EAAOoiB,EAAGpmB,aAAa,MAAM,EAEjCrC,IAAIqd,EAAa/N,kBAAkBsD,IAAI,0BAA0B,EAC5DyK,IAC0B,CAAC,IAAvBhX,EAAK/C,QAAQ,GAAG,EACjB+C,GAAQ,IAERA,GAAQ,IAEZA,GAAQ,+BAAiCgX,EACzCoL,EAAGpe,aAAa,OAAQhE,CAAI,EAEpC,CAAC,CACL,CAAC,CACL,CApH4B,YAAxBvH,SAASkM,WACTmd,2BAA2B,EAE3BxS,2BAA2B7W,SAAU,mBAAoBqpB,0BAA0B,EAoHvFnoB,IAAI0mB,eAAiB,CAGjBC,OAAQ,CAAA,EACR+B,QAAS,CAAA,EACTC,OAAQ,CAAA,EACRC,QAAS,CAAA,EACTC,iBAAkB,CAAA,EAGlBC,KAAM,SAAUnX,GACZ,IAEQ3P,EAFDzD,KAAKooB,SACRpoB,KAAKmqB,QAAU,CAAA,EACX1mB,EAAW,SAAU8S,EAAQpS,EAAM4E,EAAQ4K,GAC3CwU,eAAegC,QAAU,CAAA,EACzBhC,eAAeC,OAAS7R,EACxBhW,SAASyS,cACL,IAAIC,YAAa,8BAA+B,CAC5C2C,QAAS,CAAA,CACb,CAAE,CACN,CACJ,GAEqC,YAAhC,OAAO4U,qBACRA,qBAEArX,uBAFsB,CAACC,OAAUA,CAAM,EAAG,CAAC3P,SAAYA,EAAUuJ,QAAW,CAAA,CAAI,CAAE,EAK9F,EAEAhC,KAAM,WAEc,SAAZyf,IACAhpB,IAAIipB,EAAS,GAEb,IAAM,IAAMhgB,KAAO1K,KAAK2qB,OACpBD,GAAUhgB,EAAM,IAAM1K,KAAK2qB,OAAOjgB,GAAO,IAE7C,OAAOggB,CACX,CAPAjpB,IAQImpB,EAAa,CACbD,OAAQ,CACJE,UAAW,aACXC,SAAY,QACZ7O,IAAO,IACPQ,KAAQ,IACRG,MAAS,OACTN,OAAU,OACVyO,WAAc,kBACd9oB,QAAW,OACX+oB,kBAAmB,SACnBC,cAAe,QACnB,EACAhd,SAAUwc,CACd,EACIS,EAAW,CACXP,OAAQ,CACJG,SAAY,WACZK,QAAW,OACXJ,WAAc,OACdK,OAAU,6BACVC,gBAAiB,MACjBC,aAAc,qCAClB,EACArd,SAAUwc,CACd,EACIc,EAAW,CACXZ,OAAQ,CACJG,SAAY,WACZC,WAAc,OACdnO,MAAS,OACTN,OAAU,OACV8O,OAAU,6BACVC,gBAAiB,OACjBtf,OAAU,UACVkQ,IAAO,OACPS,MAAS,OACT8O,aAAc,aAClB,EACAvd,SAAUwc,CACd,EACIgB,EAAiB,CACjBd,OAAQ,CACJhlB,QAAW,KACX1D,QAAW,QACX6oB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBzO,MAAS,MACTN,OAAU,OACVL,IAAO,MACPQ,KAAQ,MACRiP,UAAa,eACjB,EACAzd,SAAUwc,CACd,EACIkB,EAAgB,CAChBhB,OAAQ,CACJhlB,QAAW,KACX1D,QAAW,QACX6oB,SAAY,WACZC,WAAc,OACdM,gBAAiB,MACjBzO,MAAS,MACTN,OAAU,OACVL,IAAO,MACPQ,KAAQ,MACRiP,UAAa,gBACjB,EACAzd,SAAUwc,CACd,EACImB,EAAU,CACVjB,OAAQ,CACJkB,SAAY,QAChB,EACA5d,SAAUwc,CACd,EACIqB,EAAsBvrB,SAASoE,cAAe,OAAQ,EAUtDonB,GATJD,EAAoBhgB,aAAc,KAAM,wBAAyB,EACjEggB,EAAoB/b,UAAY,+BAAiC6b,EAAU,IAC3EE,EAAoB/b,WAAa,4BAA8B6a,EAAa,IAC5EkB,EAAoB/b,WAAa,0BAA4Bwb,EAAW,IACxEO,EAAoB/b,WAAa,iCAAmC0b,EAAiB,IACrFK,EAAoB/b,WAAa,gCAAkC4b,EAAgB,IACnFprB,SAAS+J,KAAK1E,OAAQkmB,CAAoB,EAG5BvrB,SAASoE,cAAe,KAAM,GAMxCqnB,GALJD,EAAQjgB,aAAc,KAAM,yBAA0B,EACtDvL,SAAS+J,KAAK1E,OAAQmmB,CAAQ,EAE9BxrB,SAAS+J,KAAKlI,UAAUC,IAAK,wBAAyB,EAE1C9B,SAASoE,cAAe,KAAM,GAKtCsnB,GAJJD,EAAMlgB,aAAc,KAAM,uBAAwB,EAClDkgB,EAAMlgB,aAAc,QAASof,CAAS,EACtCa,EAAQnmB,OAAQomB,CAAM,EAEVzrB,SAASoE,cAAe,KAAM,GAItCgB,GAHJsmB,EAAMngB,aAAc,KAAM,uBAAwB,EAClDkgB,EAAMpmB,OAAQqmB,CAAM,EAEN1rB,SAASoE,cAAe,KAAM,GACvC3E,KAAKooB,QACA8D,EAAW,uBACW,WACJ7Q,KAAKrb,KAAKooB,MAAM,GAAKpoB,KAAKsqB,iBAC9C3kB,EAAQoK,UAAY/P,KAAKooB,OAEzBziB,EAAQoK,UAAY/P,KAAKooB,OAAO9mB,QAAQ4qB,EAAU,qCAAqC,IAG3FvmB,EAAQoK,UAAY,aAEpB/P,KAAKuqB,KAAM,sBAAuB,GAEtC5kB,EAAQmG,aAAc,KAAM,yBAA0B,EACtDkgB,EAAMpmB,OAAQD,CAAQ,EAEtB3F,KAAKoqB,OAAS,CAAA,CAClB,EAEA6B,MAAO,WACH1rB,SAAS+J,KAAKlI,UAAUI,OAAQ,wBAAyB,EACzDjC,SAASya,eAAgB,yBAA0B,EAAExY,OAAO,EAC5DjC,SAASya,eAAgB,wBAAyB,EAAExY,OAAO,EAC3DjC,SAASyS,cACL,IAAIC,YAAa,uBAAwB,CACrC2C,QAAS,CAAA,CACb,CAAE,CACN,CACJ,CAEJ,EA0LA,SAASuW,mBACL1qB,IAAI2qB,EAAkB7rB,SAASC,iBAAiB,gCAAgC,EACnD,EAAzB4rB,EAAgBzqB,QAChByqB,EAAgBvb,QAAQ,IACpB6E,EAAQtT,UAAUI,OAAO,SAAS,CACtC,CAAC,CAET,CA9LAjC,SAAS2C,iBAAiB,QAAS,SAAU0P,GACpCA,CAAAA,EAAEvP,QAA2B,4BAAhBuP,EAAEvP,OAAOgmB,IAAoD,0BAAhBzW,EAAEvP,OAAOgmB,IACpElB,eAAe8D,MAAM,CAE7B,CAAC,EACD1rB,SAAS2C,iBAAiB,8BAA+B,SAAU0P,GAC1DuV,eAAeiC,QAAUjC,eAAeC,SACzC7nB,SAASya,eAAgB,yBAA0B,EAAEjL,UAAYoY,eAAeC,OAExF,CAAC,EAED7nB,SAAS2C,iBAAiB,mBAAoB,WAC1CzB,IAAI4qB,EAAgBjf,KAAAA,EAChBkf,EAA2B,CAAA,EAgB/B,GAdyB,aAApB,OAAOpb,UAA0D,aAA9B,OAAOqb,oBAKd,KAAA,KAHzBF,EADqB,aAApB,OAAOnb,UAA4BA,SAASsb,cAC7Btb,SAASsb,cAGlBH,IACuB,aAA9B,OAAOE,oBACPA,mBAAmBC,gBAEnBH,EAAgBE,mBAAmBC,cACnCF,EAA2B,CAAA,GAI5BD,EAAP,CAKA5qB,IAAIgrB,EAAyB,wCACxBlsB,SAAS+C,cAAc,iDAAiD,IAEzEmpB,EAAyB,8CAE7BhrB,IAEMirB,EAAcnsB,SAASC,iBACzBisB,EAF4B,uFAIH,EAED,IAAvBC,EAAY/qB,SAIjB+qB,EAAY7b,QAAQ,CAAE6E,EAASiX,KAE3B,IAQIC,EAGAC,EAIAC,EAGAC,EAIAC,EAGAC,EAKIC,EA7Bc,aAAlB,OAAOC,SACPzX,EAAQrQ,cAAc/C,UAAUyC,QAAQ,OAAO,EAAI,GAChC,OAAnB2Q,EAAQ1Q,WAKR4nB,EAAYrsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uBAAuB,GAEnD+gB,EAAWtsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,MAAOugB,EAAce,YAAY,EACvDP,EAAS/gB,aAAa,QAAS,2BAA2B,GAEtDghB,EAAiBvsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uBAAuB,GAExDihB,EAAwBxsB,SAASoE,cAAc,GAAG,GAChCmH,aAAa,QAAS,8BAA8B,EAC1EihB,EAAsBnnB,OAAOymB,EAAcgB,QAAQC,UAAU,GAEzDN,EAAwBzsB,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,mCAAmC,GAE3EmhB,EAA4B1sB,SAASoE,cAAc,MAAM,GACnCiB,OAAOymB,EAAcgB,QAAQE,YAAc,GAAG,EACxEN,EAA0BrnB,OAAOymB,EAAcgB,QAAQG,WAAW,EAE7DlB,KACGY,EAAgB3sB,SAASoE,cAAc,GAAG,GAChCmH,aAAa,OAAQugB,EAAcoB,cAAc,EAC/DP,EAAcphB,aAAa,SAAU,QAAQ,EAC7CohB,EAAcQ,KAAOrB,EAAcgB,QAAQM,oBAC3CV,EAA0BrnB,OAAO,GAAG,EACpCqnB,EAA0BrnB,OAAOsnB,CAAa,GAGlDF,EAAsBpnB,OAAOqnB,CAAyB,EACtDH,EAAelnB,OAAOmnB,EAAuBC,CAAqB,EAClEJ,EAAUhnB,OAAOinB,CAAQ,EACzBnX,EAAQ9P,OAAOgnB,CAAS,EACxBlX,EAAQ9P,OAAOknB,CAAc,EACjC,CAAC,EAEcvsB,SAASC,iBAAiB,wBAAwB,EAE1DqQ,QAAQ,IACXpP,IAAImsB,EAAcxgB,KAAAA,EAmCZygB,GAjCN7tB,KAAKsK,KAAKpH,iBAAiB,QAAS,SAAS0P,GAEY,CAAC,GAAlDA,EAAEvP,OAAOf,UAAUyC,QAAQ,iBAAiB,GACmB,CAAC,GAAhE6N,EAAEvP,OAAOgC,cAAc/C,UAAUyC,QAAQ,iBAAiB,GAE1DonB,iBAAiB,CAEzB,CAAC,EAED2B,EAAM5qB,iBAAiB,QAAS,WAC5B,IAAM2qB,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUM,OAAO,SAAS,CAExC,CAAC,EAEDorB,EAAM5qB,iBAAiB,aAAc,WACjCipB,iBAAiB,EACjB,IAAM0B,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUC,IAAI,SAAS,CAErC,CAAC,EAEDyrB,EAAM5qB,iBAAiB,aAAc,WACjC0qB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQ7tB,KAAK+tB,mBACfF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAEasrB,EAAMC,oBACpBF,EAAM3qB,iBAAiB,aAAc,WACjC8qB,aAAaJ,CAAW,EACxBC,EAAMzrB,UAAUC,IAAI,SAAS,CACjC,CAAC,EAEDwrB,EAAM3qB,iBAAiB,aAAc,WACjC0qB,EAAcvnB,WAAW,KACjBwnB,EAAMzrB,UAAUqf,SAAS,uBAAuB,GAChDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,CACX,CAAC,EAGDsrB,EAAM5qB,iBAAiB,WAAY,WAC/B0qB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQ7tB,KAAK+tB,mBACbE,EAAY9nB,OAAOsJ,aAAa,EAElCoe,GAASI,GAAaJ,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACtC,IAAhCwM,EAAUhgB,SAAS,EAAEtM,OAErBksB,EAAMzrB,UAAUI,OAAO,SAAS,GAEhCwrB,aAAaJ,CAAW,EACxBrtB,SAAS2C,iBAAiB,kBAAmB,SAASgrB,IAClD,IAAMD,EAAY9nB,OAAOsJ,aAAa,EAClCwe,GAA6C,IAAhCA,EAAUhgB,SAAS,EAAEtM,SAElCisB,EAAcvnB,WAAW,KACrB,IAAMwnB,EAAQC,EAAMC,mBAChBF,GAASA,EAAMzrB,UAAUqf,SAAS,uBAAuB,GACzDoM,EAAMzrB,UAAUI,OAAO,SAAS,CAExC,EAAG,GAAI,EACPjC,SAAS2Y,oBAAoB,kBAAmBgV,CAAiB,EAEzE,CAAC,EAET,EAAG,GAAI,CACX,CAAC,CACL,CAAC,EAlJD,CAmJJ,CAAC,EAcD,IAAMC,gBAAkB5tB,SAASoE,cAAc,KAAK,EA4KpD,SAASypB,qBACL7tB,SAAS+C,cAAc,yBAAyB,EAAE+Y,YAAc,MAChE8R,gBAAgBntB,MAAM0b,MAAQ,QAC9ByR,gBAAgBntB,MAAMqtB,WAAa,OACnC9tB,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAMqtB,WAAa,OACrE9tB,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAM4b,MAAQ,OAChErc,SAAS+C,cAAc,yBAAyB,EAAEtC,MAAMstB,WAAa,OACzE,CAKA,SAASC,oBACL,IAAK9sB,IAAIC,EAAI,EAAGA,EAAInB,SAAS+O,MAAM3N,OAAQD,CAAC,GACxC,GAAkD0L,KAAAA,IAA9C7M,SAAS+O,MAAM5N,GAAG8sB,yBAC4BphB,KAAAA,IAA9C7M,SAAS+O,MAAM5N,GAAG+sB,wBAAuC,CAEzD,IA2CcC,EA3CRC,EAAcpuB,SAAS+O,MAAM5N,GAGnC,GAAKktB,CAAAA,gBAAgBD,CAAW,EAKhC,GAAKE,iBAAiBF,CAAW,EAC7BG,yBAAyBH,EAAajtB,EAAGnB,QAAQ,OAG9C,GAEmC6M,KAAAA,IAAtCuhB,EAAY7X,QAAQiY,eACW,UAA9B,OAAOJ,EAAkB,QACkC,CAAC,IAAxDA,EAAYvb,OAAOrO,QAAQ,sBAAsB,GACvB,UAA9B,OAAO4pB,EAAkB,QAC1BA,EAAYrrB,cAAc,0BAA0B,GAElB,UAA9B,OAAOqrB,EAAkB,QACqB,CAAC,IAA/CA,EAAYvb,OAAOrO,QAAQ,aAAa,GACxC4pB,EAAY7qB,aAAa,kBAAkB,EAG/CkrB,qCAAqCL,EAAajtB,EAAGnB,QAAQ,OAE1D,GAC2B,UAA9B,OAAOouB,EAAkB,SACmB,CAAC,IAA3CA,EAAYvb,OAAOrO,QAAQ,SAAS,GACS,CAAC,IAA5C4pB,EAAYvb,OAAOrO,QAAQ,UAAU,GAC3C,CACEtD,IAAIwtB,EAAMN,EAAYvb,OAAO0M,MAAM,IAAI,GACvCmP,EAAMA,EAAI,GAAGnP,MAAM,GAAG,GACL,GAAG7a,YAAY,IAEnB4C,SAASqnB,SAASjqB,YAAY,KACjCkqB,EAAW5uB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChB+qB,EAASnrB,MAAQ2qB,EAAYvb,OAC7B+b,EAASzf,KAAO,SAChBif,EAAYS,YAAYD,CAAQ,GAE1BT,EAAWnuB,SAASoE,cAAc,OAAO,GACtCP,KAAO,0BAChBsqB,EAAS1qB,MAAQ2qB,EAAYllB,OAC7BilB,EAAShf,KAAO,SAEhBif,EAAYllB,OAAS,OAErBklB,EAAYS,YAAYV,CAAQ,EAEhCC,EAAYvb,OAAS7S,SAASsH,SAEtC,CACJ,CAGJwnB,oBAAoB,EAEpB1R,uBAAuB,CAC3B,CAOA,SAASiR,gBAAgBD,GA0BrBltB,IAAI8U,EAAS,CAAA,EAEb,IAEQoY,EAAYtpB,eACiC,EAA7CspB,EAAYtpB,cAAcjD,UAAUT,QACyB,CAAC,IAA9DgtB,EAAYtpB,cAAcjD,UAAU,GAAG2C,QAAQ,QAAQ,IACvDwR,EAAS,CAAA,GAG8B,OAAvCoY,EAAY7qB,aAAa,QAAQ,GAdd,CACvB,6BAcuB+M,QAAQ,SAASye,GACoC,CAAC,IAAjEX,EAAY7qB,aAAa,QAAQ,EAAEiB,QAAQuqB,CAAe,IAC1D/Y,EAAS,CAAA,EAEjB,CAAC,EAxCc,CACnB,YACA,UACA,2BACA,WAuCe1F,QAAQ,SAAS0e,GAC5B,IAAMpI,EAASwH,EAAY7qB,aAAa,IAAI,EACvCqjB,MAAAA,GAAsF,CAAC,IAAjCA,EAAOpiB,QAAQwqB,CAAW,IACjFhZ,EAAS,CAAA,EAEjB,CAAC,EArCqB,CACtB,cACA,UACA,uBACA,kBACA,iBACA,UACA,oBAgCkB1F,QAAQ,SAAS2e,GAC/B/tB,IAAIguB,EAAa,GAMjB,IAAMC,EAJFD,EADAd,EAAY7qB,aAAa,OAAO,EACnB6qB,EAAY7qB,aAAa,OAAO,EAEhC6rB,kBAAkBhB,EAAaa,CAAc,EAGzDE,MAAAA,GAAgG,CAAC,IAAvCA,EAAU3qB,QAAQyqB,CAAc,IAEvFjZ,EADAoY,CAAAA,EAAY7qB,aAAa,kBAAkB,EAMvD,CAAC,EA1DoB,CACrB,UA2DiB+M,QAAQ,SAAS+e,GAC9B,IAAMC,EAAWlB,EAAY7qB,aAAa,IAAI,EACzC+rB,MAAAA,GAA2F,CAAC,IAArCA,EAAS9qB,QAAQ6qB,CAAa,IACtFrZ,EAAS,CAAA,EAEjB,CAAC,CAGL,CAFE,MAAO3D,GACL7H,QAAQ+kB,MAAM,oCAAqCld,CAAC,CACxD,CAEA,OAAO2D,CACX,CAQA,SAASoZ,kBAAkBhB,EAAaa,GACpC,GAA2B,UAAvB,OAAM,GAA6Bb,EAAYrrB,cAAc,IAAMksB,CAAc,EACjF,OAAOA,CAEf,CAKA,SAASH,sBACL,IAAMU,EAASxvB,SAASyvB,qBAAqB,QAAQ,EAErD,GAAqB,EAAhBD,EAAOpuB,OACR,IAAMF,IAAI+nB,EAAI,EAAGA,EAAIuG,EAAOpuB,OAAQ6nB,CAAC,GACjC,GAAkC,MAA7BuG,EAAOvG,GAAGyG,gBAAf,CAIA,IAAMC,EAAcH,EAAOvG,GAAGyG,gBAAgB3gB,MAC9C,GAA4B,IAAvB4gB,EAAYvuB,OAIjB,IAAMF,IAAI0uB,EAAI,EAAGA,EAAID,EAAYvuB,OAAQwuB,CAAC,GAAK,CAC3C,IAAMxB,EAAcuB,EAAYC,GAC3BvB,gBAAgBD,CAAW,GAGhCG,yBAAyBH,EAAawB,EAAGJ,EAAOvG,GAAGyG,eAAe,CACtE,CAbA,CAgBZ,CAQA,SAASnB,yBAAyBH,EAAayB,EAAUC,GACrD,IAAMC,EAAuB/vB,SAASoE,cAAc,GAAG,EAOjD4rB,GANND,EAAqBhuB,UAAY,wBACjCguB,EAAqBtvB,MAAQ,gBAE7B2tB,EAAYtpB,cAAcmrB,aAAaF,EAAsB3B,CAAW,EAG3DA,EAAY8B,iBACnBC,EAAW/B,EAAY7e,UACvB6gB,EAAehC,EAMfiC,GAHNjC,EAAYtpB,cAAcub,YAAY+N,CAAW,EAG7BpuB,SAASoE,cAAc,KAAK,GAI1CksB,GAHND,EAAY7gB,UAAY2gB,EACxBH,EAAK7qB,MAAMkrB,EAAYE,iBAAiB,EAEpBvwB,SAASoE,cAAc,OAAO,GAClDksB,EAAYzsB,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SAEnB,IAAMqhB,EAAmBV,EAAe/gB,MAAM8gB,GAO1CY,GALJD,EAAiB3B,YAAYyB,CAAW,EACxCE,EAAiBE,UAAYV,EAC7BQ,EAAiBG,kBAAoBP,EAGP,CAAA,GACKvjB,KAAAA,IAA/B2jB,EAAiB3uB,WAES,CAAC,iBAAkB,iBAC3ByO,QAAQ,SAASsgB,GAC3BJ,EAAiB3uB,UAAUqf,SAAS0P,CAAe,IACnDH,EAA0BG,EAElC,CAAC,EAGDC,EAAyB,KACxBJ,EAEII,OADLA,EAAyBL,EAAiBztB,cAAc,uBAAuB,IAE3E8tB,EAAuBluB,iBAAiB,QAAS,SAASpD,GACtDA,EAAM4hB,eAAe,EACrB2P,yBAAyBN,CAAgB,CAC7C,CAAC,EAKTV,EAAe/gB,MAAM8gB,GAAUpP,SAAW,SAASlhB,GAC/CA,EAAM4hB,eAAe,EACrB2P,yBAAyBvxB,EAAMwxB,aAAa,CAChD,CACJ,CAQA,SAAStC,qCAAqCL,EAAayB,EAAUC,GACjE,IAOMjrB,EAWAyrB,EAKAE,EAvBAQ,EAAuB5C,EAAYrrB,cAAc,iBAAiB,EAClEkuB,EAAmB7C,EAAYrrB,cAAc,iBAAiB,EAAEsT,KAAKoK,SAEpEuQ,IAIDnsB,EAASmsB,EAAqBlsB,cAC9BosB,EAAmBF,EAAqBzhB,UAG9CyhB,EAAqB/uB,OAAO,GAGtBouB,EAAcrwB,SAASoE,cAAc,KAAK,GACpCoL,UAAY0hB,EACxBrsB,EAAOgqB,YAAYwB,EAAYE,iBAAiB,GAE1CD,EAActwB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,UAEbqhB,EAAmBV,EAAe/gB,MAAM8gB,IAE7BhB,YAAYyB,CAAW,EACxCE,EAAiBW,YAActsB,EAC/B2rB,EAAiBQ,qBAAuBA,EACxCR,EAAiBS,iBAAmBA,EAEpCnB,EAAe/gB,MAAM8gB,GAAUpP,SAAW,SAASlhB,GAC/CA,EAAM4hB,eAAe,EAGrBiQ,0BAA0B7xB,EAAMwxB,aAAa,EAE7CD,yBAAyBvxB,EAAMwxB,aAAa,CAChD,EACJ,CAMA,SAASK,0BAA0B/a,GAC/B,IAEU9M,EAFJ8nB,EAAgBhb,EAAKtT,cAAc,uBAAuB,EAC3DsuB,IACK9nB,EAAU8nB,EAActuB,cAAc,GAAG,EACzCuuB,EAAaD,EAActuB,cAAc,MAAM,EACjDwG,IAAW+nB,IACkB,GAAxB/nB,EAAQ9I,MAAM8wB,QACfD,EAAW7wB,MAAM+E,QAAU,EAC3B+D,EAAQ9I,MAAM8wB,OAAS,CAAC,EACxBhoB,EAAQ9I,MAAM+E,QAAU,IAExB8rB,EAAW7wB,MAAM+E,QAAU,EAC3B+D,EAAQ9I,MAAM8wB,OAAS,EACvBhoB,EAAQ9I,MAAM+E,QAAU,GAIxC,CAOA,SAASgsB,sCAAsCC,EAAYC,GACvD,IAAMC,EAAeF,EAAWxxB,iBAAiB,iCAAiC,EAClF,IAAM2xB,EAAeF,EAAWzxB,iBAAiB,iCAAiC,EAEV,CAAC,IAArEwxB,EAAWliB,UAAU/K,QAAQ,iCAAiC,GAC9DqtB,sBAAsBJ,CAAU,GAC8B,CAAC,IAA/DA,EAAWliB,UAAU/K,QAAQ,2BAA2B,GACQ,CAAC,IAAjEitB,EAAWliB,UAAU/K,QAAQ,6BAA6B,GACL,CAAC,IAAtDitB,EAAWliB,UAAU/K,QAAQ,kBAAkB,GACkB,CAAC,IAAlEitB,EAAWliB,UAAU/K,QAAQ,8BAA8B,EAE3DmtB,EAAarhB,QAAQ,IACjBshB,EAAathB,QAAQ,IACbwhB,EAAWjuB,OAASkuB,EAAWluB,OACP,aAApBkuB,EAAW5iB,MAA2C,UAApB4iB,EAAW5iB,KAC7C4iB,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWtuB,MAAQwuB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,EAKLH,EAAarhB,QAAQ,IACjBshB,EAAathB,QAAQ,IACbwhB,EAAWviB,YAAcwiB,EAAWxiB,YACZ,aAApBwiB,EAAW5iB,MAA2C,UAApB4iB,EAAW5iB,KAC7C4iB,EAAWC,QAAUC,SAASH,CAAU,EAExCC,EAAWtuB,MAAQwuB,SAASH,CAAU,EAGlD,CAAC,CACL,CAAC,CACL,CAqBA,SAASI,uBACL,GAAKlyB,SAAS+C,cAAc,uDAAuD,EAAnF,CAIA7B,IAAIC,EAAIiY,YAAY,KAChB,IAAM+Y,EAAenyB,SAASC,iBAAiB,mBAAmB,EAC9DkyB,EAAa/wB,SACbuZ,cAAcxZ,CAAC,EACfgxB,EAAa7hB,QAAQ,CAAC+F,EAAM+V,KACxBgG,gCAAgC/b,EAAM+V,EAAOpsB,QAAQ,CACzD,CAAC,EAET,EAAG,GAAG,CAVN,CAWJ,CAQA,SAASoyB,gCAAgC/b,EAAMwZ,EAAUC,GACrD,IAYIuC,EAZEC,EAAMjc,EAAKtT,cAAc,kCAAkC,EAC5DuvB,IAGLA,EAAIC,SAAW,CAAA,GAETjC,EAActwB,SAASoE,cAAc,OAAO,GACtCP,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SACnBkH,EAAKwY,YAAYyB,CAAW,GAExB+B,EAAQryB,SAASoE,cAAc,KAAK,GAClC0kB,GAAK,sBACXuJ,EAAM5xB,MAAM4b,MAAQ,OACpBgW,EAAM5xB,MAAMsb,OAAS,OACrBsW,EAAM5xB,MAAM+pB,WAAa,QACzB6H,EAAM5xB,MAAM+E,QAAU,EACtB6sB,EAAM5xB,MAAM8pB,SAAW,WACvB8H,EAAM5xB,MAAMib,IAAM,EAClB2W,EAAM5xB,MAAM+K,OAAS,UACrB6mB,EAAMG,QAAU,SAASngB,GACrBye,yBAAyBza,CAAI,CACjC,EACAic,EAAIhP,WAAW7iB,MAAM8pB,SAAW,WAChC+H,EAAIhP,WAAWuL,YAAYwD,CAAK,EACpC,CAKA,SAASI,yBACLvxB,IAAIwxB,EAAU1yB,SAASC,iBAAiB,QAAQ,EAC3B,EAAjByyB,EAAQtxB,QACRsxB,EAAQpiB,QAAQ,SAASqiB,GACjBA,EAA4C,CAAC,IAA7CA,EAAOC,IAAIpuB,QAAQ,mBAAmB,GACS,CAAC,IAAhDmuB,EAAOC,IAAIpuB,QAAQ,sBAAsB,GACU,CAAC,IAApDmuB,EAAOC,IAAIpuB,QAAQ,0BAA0B,GACD,CAAC,IAA7CmuB,EAAOC,IAAIpuB,QAAQ,mBAAmB,GACtCmuB,EAAO9wB,UAAUqf,SAAS,gBAAgB,GACD,CAAC,IAAxCyR,EAAOC,IAAIpuB,QAAQ,cAAc,GAA2D,CAAC,IAAhDmuB,EAAOC,IAAIpuB,QAAQ,sBAAsB,IAGpF,CAAA,IAAUgM,kBAAkBsD,IAAI,yBAAyB,GACC,EAA1DtD,kBAAkBsD,IAAI,yBAAyB,EAAE1S,QAC5B,KAAA,IAAduxB,EAAO7J,IAC0D,CAAC,IAAzEtY,kBAAkBsD,IAAI,yBAAyB,EAAEtP,QAAQmuB,EAAO7J,KAIpE+J,8BAA8BF,CAAM,CAE5C,CAAC,CAET,CA7oBA3yB,SAAS2C,iBAAiB,mBAAoB,WAC1CirB,gBAAgB7rB,UAAY,6BAC5Bb,IAAI4xB,EAAY,KA2BhB,SAASC,IACL7xB,IAAI8xB,EAAU,CAAC,MAAO,SAClBhd,EAASgd,EAAQvqB,KAAKC,MAAMD,KAAKE,OAAO,EAAIqqB,EAAQ5xB,MAAM,GAE9DpB,SAAS+C,cAAc,0BAA0B,EAAEd,OAAO,EAC1DjC,SAAS+C,cAAc,+BAA+B,EAAEd,OAAO,EAC/DjC,SAAS+C,cAAc,6BAA6B,EAAEtC,MAAMsb,OAAS,OAGrE7a,IAAI+xB,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQnd,GACR,IAAK,MACDxL,QAAQrE,IAAI,KAAK,EAEjB+sB,EAAM,wOACN,MACJ,IAAK,QACD1oB,QAAQrE,IAAI,OAAO,EACnB8sB,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAnzB,SAAS+C,cAAc,yBAAyB,EAAE+Y,YAAcmX,EAC1DG,EAAMpzB,SAASoE,cAAc,KAAK,EACxCgvB,EAAIrxB,UAAY,yBAChBqxB,EAAI5jB;cACE0jB;wDAC0CC;UAEhDvF,gBAAgBiB,YAAYuE,CAAG,CACnC,CA1DApzB,SAAS2C,iBAAiB,qBAAsB,WAC5CirB,gBAAgBntB,MAAMiB,QAAU,QAChCoxB,EAAY,IAAIptB,IACpB,CAAC,EAED1F,SAAS2C,iBAAiB,mBAAoB,WAC1C6H,QAAQrE,IAAI,kBAAkB,CAClC,CAAC,EAEDnG,SAAS2C,iBAAiB,sBAAuB,WACzCmwB,GAAa,IAAIptB,KAASotB,EAZR,IAalBhtB,WAAW,KACPitB,EAAW,CACf,EAfkB,KAeQ,IAAIrtB,KAASotB,EAAU,EAGrDhtB,WAAW,KACPitB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CD/yB,SAAS2C,iBAAiB,qBAAsB,WAC5C6H,QAAQrE,IAAI,oBAAoB,CACpC,CAAC,EAEDqE,QAAQrE,IAAI,kBAAkB,EAG9B,IAAM1F,EAAQT,SAASoE,cAAc,OAAO,EAmEtC6uB,GAlENxyB,EAAMqb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CN9b,SAASqzB,KAAKxE,YAAYpuB,CAAK,EAG/BmtB,gBAAgBntB,MAAM6yB;;;;;;;;;;;;;;;;;MAoBRtzB,SAASoE,cAAc,KAAK,GASpCmvB,GARNN,EAAMlxB,UAAY,yBAClBkxB,EAAMxyB,MAAM6yB;;MAGZL,EAAMnX,YAAc,cACpB8R,gBAAgBiB,YAAYoE,CAAK,EAGlBjzB,SAASoE,cAAc,KAAK,GAQrCovB,GAPND,EAAOxxB,UAAY,0BAGnB6rB,gBAAgBiB,YAAY0E,CAAM,EAClCvzB,SAAS+J,KAAK8kB,YAAYjB,eAAe,EAGrB5tB,SAASoE,cAAc,KAAK,GAChDovB,EAAYzxB,UAAY,+BACxByxB,EAAY/yB,MAAM6yB;;MAGlBE,EAAY1X,YAAc,gBAC1B8R,gBAAgBiB,YAAY2E,CAAW,CAC3C,CAAC,EAyYDhjB,kBAAkBC,IAAI,0BAA2B,EAAE,EACnD7K,OAAOjD,iBAAiB,OAAQ,WACrB,CAACgO,SAAS8iB,kCAIjB3tB,WAAW,WACPkoB,kBAAkB,EAClB0F,yBAAyB,EACzBC,4BAA4B,EAC5BlB,uBAAuB,CAC3B,EAAG,GAAI,EAEPP,qBAAqB,EACzB,CAAC,EAoFDhxB,IAAI0yB,4BAKJ,SAASf,8BAA8BF,GACnCzxB,IAAImxB,EAAQryB,SAASoE,cAAc,KAAK,EACxCiuB,EAAM5xB,MAAM4b,MAAQ,OACpBgW,EAAM5xB,MAAMsb,OAAS,OACrBsW,EAAM5xB,MAAM+pB,WAAa,QACzB6H,EAAM5xB,MAAM+E,QAAU,EACtB6sB,EAAM5xB,MAAM8pB,SAAW,WACvB8H,EAAM5xB,MAAMib,IAAM,EAClB2W,EAAMG,QAAU,SAASngB,GACrB,GAAoCxF,KAAAA,IAAhC+mB,4BAA2C,CAC3C1yB,IAAI2yB,EAAaxhB,EAAE0e,cAEf+C,GADJD,EAAWpzB,MAAM+E,QAAU,GACXxF,SAASoE,cAAc,KAAK,GAC5C0vB,EAAU/xB,UAAY,yBACtB8xB,EAAWhF,YAAYiF,CAAS,EAChC5yB,IAAI6yB,EAAmB,GACnB/zB,SAAS+C,cAAc,uCAAuC,IAC9DgxB,EAAmB/zB,SAAS+C,cAAc,uCAAuC,EAAEU,OASvFmP,sBANW,CACPC,OAAU,sCACVwP,0BAA6BvB,gBAAgB,EAC7C4C,4BAA+BqQ,CACnC,EAII,CACI5qB,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GAEc,EAD7B4d,4BAA8B,CAAA,KAC1B5d,EAAOzN,MAAMmf,QACb1nB,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,SAASqZ,GACrEA,EAAGrG,WAAWrhB,OAAO,CACzB,CAAC,GAEDjC,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,IAC5DqZ,EAAGrG,WAAW7iB,MAAMub,MAAQ,QAC5B2N,EAAGrG,WAAW9T,WAAawG,EAAOzN,MAAMof,OAC5C,CAAC,EACD3nB,SAASC,iBAAiB,4BAA4B,EAAEqQ,QAAQ,IAC5DqZ,EAAG1nB,OAAO,CACd,CAAC,EAET,CACJ,CACJ,CACJ,CACJ,EACA0wB,EAAOrP,WAAW7iB,MAAM8pB,SAAW,WACnCoI,EAAOrP,WAAWuL,YAAYwD,CAAK,EACnCnxB,IAAIwxB,EAAUliB,kBAAkBsD,IAAI,yBAAyB,EACzD,CAAA,IAAU4e,IACVA,EAAU,IAEW,KAAA,IAAdC,EAAO7J,KACd4J,EAAQryB,KAAKsyB,EAAO7J,EAAE,EACtBtY,kBAAkBC,IAAI,0BAA2BiiB,CAAO,EAEhE,CAKA,SAASiB,8BACLzyB,IAAI8yB,EAAWh0B,SAASya,eAAe,4BAA4B,EAC/DuZ,GACAC,2BAA2BD,CAAQ,CAE3C,CAMA,SAASC,2BAA2BD,GAChC9yB,IAAIgzB,EAAgBF,EAAS/zB,iBAAiB,0BAA0B,EACpEk0B,EAAeH,EAAS/zB,iBAAiB,kCAAkC,EAC/Ei0B,EAAc5jB,QAAQ,IAClBqZ,EAAGpe,aAAa,2BAA4B,MAAM,EAClDoe,EAAGhnB,iBAAiB,QAAS,IACzBpD,EAAM4hB,eAAe,CACzB,CAAC,CACL,CAAC,EACDgT,EAAa7jB,QAAQ,IACjBqZ,EAAGhnB,iBAAiB,QAAS,IACzBpD,EAAM4hB,eAAe,EACrB5hB,EAAMyD,gBAAgB,EACtBoxB,YAAYzK,CAAE,CAClB,CAAC,CACL,CAAC,CACL,CAMA,SAAS0K,4BAA4BC,GACjCA,EAASxvB,cAAcyG,aAAa,2BAA4B,OAAO,EACvE+oB,EAASxvB,cAAcyvB,MAAM,CACjC,CAOA,SAASC,gCAAgCF,EAAUruB,GAC/C/E,IAKQuzB,EALJ3vB,EAAgBwvB,EAASxvB,cACiC,SAA1DA,EAAcvB,aAAa,0BAA0B,GACrDuB,EAAcyG,aAAa,2BAA4B,MAAM,EAE5DvL,SAAS+C,cAAc,mBAAmB,KACvC0xB,EAAaz0B,SAASoE,cAAc,KAAK,GAClCrC,UAAY,mBACvB0yB,EAAWh0B,MAAM+pB,WAAa,MAC9BiK,EAAWh0B,MAAMub,MAAQ,QACzByY,EAAWh0B,MAAMmqB,QAAU,MAC3B6J,EAAWjlB,UAAYvJ,EACvBnB,EAAc4vB,sBAAsB,cAAeD,CAAU,EAErE,CAMA,SAASL,YAAY9zB,GAMjBsS,sBALW,CACPC,OAAU,2BACVwP,0BAA6BriB,SAAS20B,kBAAkB,2BAA2B,EAAE,GAAGlxB,KAC5F,EAII,CACI0F,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GACc,CAAA,IAAzBA,EAAOzN,MAAMmf,QACb2M,4BAA4B/zB,CAAI,EAEhCk0B,gCAAgCl0B,EAAM0V,EAAOzN,MAAMof,OAAO,CAElE,CACJ,CACJ,CACJ,CAOA,SAAS2G,iBAAiBsG,GACtB,IAAM5L,EAAuC,UAA1B,OAAO4L,EAAc,OAAgBA,EAAQ/hB,OAAS,GACnE+T,EAAwC,OAA/BgO,EAAQrxB,aAAa,IAAI,EAAaqxB,EAAQrxB,aAAa,IAAI,EAAI,GAC5EsxB,EAA6C,UAA7B,OAAOD,EAAiB,UAAgBA,EAAQ7yB,UAAY,GAElF,MACI,CAAA,EACiD,CAAC,IAA9CinB,EAAWxkB,QAAQ,oBAAoB,GACD,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACM,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GAEDqI,KAAAA,IAAjC+nB,EAAQE,WAAWjzB,WACjB+yB,EAAQE,WAAWjzB,UAAUqf,SAAS,eAAe,GAChB,CAAC,IAA1C8H,EAAWxkB,QAAQ,gBAAgB,GACQ,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACA,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACY,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACQ,CAAC,IAA9CwkB,EAAWxkB,QAAQ,oBAAoB,GACJ,CAAC,IAApCwkB,EAAWxkB,QAAQ,UAAU,GACU,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACE,CAAC,IAApCwkB,EAAWxkB,QAAQ,UAAU,GACS,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACM,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GACK,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACW,CAAC,IAA3CwkB,EAAWxkB,QAAQ,iBAAiB,GACH,CAAC,IAAlCwkB,EAAWxkB,QAAQ,QAAQ,GAA8C,CAAC,IAAnCoiB,EAAOpiB,QAAQ,aAAa,GACpB,CAAC,IAAhDoiB,EAAOpiB,QAAQ,0BAA0B,GACF,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACW,CAAC,IAA7CoiB,EAAOpiB,QAAQ,uBAAuB,GAMD,CAAC,IAAtCwkB,EAAWxkB,QAAQ,YAAY,GACO,CAAC,IAAvCwkB,EAAWxkB,QAAQ,aAAa,GAChCqtB,sBAAsB+C,CAAO,GACa,CAAC,IAA3C5L,EAAWxkB,QAAQ,iBAAiB,GACA,CAAC,IAArCwkB,EAAWxkB,QAAQ,WAAW,GACa,CAAC,IAA5CwkB,EAAWxkB,QAAQ,kBAAkB,GACa,CAAC,IAAnDwkB,EAAWxkB,QAAQ,yBAAyB,GAED,CAAC,IAAxCwkB,EAAWxkB,QAAQ,cAAc,GACE,CAAC,IAApCqwB,EAAcrwB,QAAQ,OAAO,GAGPqI,KAAAA,IAAtB+nB,EAAQ/yB,WACR+yB,EAAQ/yB,UAAUqf,SAAS,sBAAsB,GAErD6T,iBAAiBH,EAAS,UAAU,EAM5C,CAOA,SAAS/C,sBAAsB+C,GAC3B1zB,IAAI8U,EAAS,CAAA,EACb,IAAMgf,EAAwBh1B,SAAS+C,cAAc,+BAA+B,EAUpF,OAFIiT,EANmB,UAAnB,OAAO4e,GAAoC,OAAZA,GACL,OAA1BI,GACAA,EAAsB5f,aAAa,mBAAmB,GACM,KAA5D4f,EAAsBzxB,aAAa,mBAAmB,GACuB,OAA7EyxB,EAAsBjyB,cAAc,mCAAmC,EAE9D6xB,IAAYI,EAAsBjyB,cAAc,mCAAmC,EAEzFiT,CACX,CAQA,SAAS8a,yBAAyBza,GAE9B,IAAM+J,EAAgB,GACtBA,EAAc,GAAKE,6BAA6BjK,CAAI,EACpDsK,gCAAiCP,CAAc,EAE/C,IAAMxc,EAAO,CACT8f,4BAA+BlT,kBAAkBsD,IAAI,0BAA0B,CACnF,EACImhB,EAAQ5e,EAAKjX,UAGjB61B,EAFQr1B,MAAMC,UAAUC,MAAMC,KAAKk1B,CAAK,GAElC3kB,QAAS,SAAUhQ,EAAMsvB,GACR,KAAdtvB,EAAKuD,KACND,EAAK,SAAWgsB,GAAKtvB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAEDmP,sBACIhP,EACA,CACIuF,MAAO,CAAA,EACPjG,SAAU,SAAU8S,EAAQpS,EAAM4E,EAAQ4K,GAEtCge,0BAA0B/a,CAAI,EAE9B,IAAM6e,EACF7e,EAAKjB,aAAa,QAAQ,GACyB,CAAC,IAApDiB,EAAK9S,aAAa,QAAQ,EAAEiB,QAAQ,SAAS,EAEjD,GAAsBqI,KAAAA,IAAjBmJ,EAAOzN,OAAuCsE,KAAAA,IAAhBmJ,EAAOpS,MACpBiJ,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAAE,CAACyN,EAAOzN,MAAMmf,QACjD,CAEE,IAAK,IAAMiC,KAAMtT,EAAKpW,iBAAiB,oCAAoC,EACvE0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,2CAA2C,EAC9E0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,yCAAyC,EAC5E0pB,EAAG1nB,OAAO,EAId,GAAuB4K,KAAAA,IAAnBwJ,EAAKxU,WAA2BwU,EAAKxU,UAAUqf,SAAS,cAAc,EAUtE,OATMmR,EAAQryB,SAASya,eAAe,qBAAqB,IAEvD4X,EAAMpwB,OAAO,EAGjB,MADMqwB,EAAMjc,EAAKtT,cAAc,kCAAkC,KAE7DuvB,EAAIC,SAAW,CAAA,EACfD,EAAIiC,MAAM,IAMlB,GAAoC1nB,KAAAA,IAA/BwJ,EAAKE,QAAQiY,cAA8B,CAC5CttB,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAMvD,OALAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAA5CnsB,KACAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAGA,GAAIle,EAAKjB,aAAa,QAAQ,GACuC,CAAC,IAAjEiB,EAAK9S,aAAa,QAAQ,EAAEiB,QAAQ,sBAAsB,EAC7D,CACEtD,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAOvD,OANAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAC5C3a,EAAKoK,SAAWpK,EAAK4a,iBADrBpsB,KAEAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAGA,GAAIW,EAAoB,CACpBh0B,IAAIi0B,EAAe9e,EAAKtT,cAAc,iBAAiB,EAOvD,OANAoyB,EAAalzB,OAAO,EACLoU,EAAK8a,YACbtC,YAAYxY,EAAK2a,oBAAoB,EAC5C3a,EAAKoK,SAAWpK,EAAK4a,iBADrBpsB,KAEAswB,EAAe9e,EAAKtT,cAAc,iBAAiB,GACtCwxB,MAAM,CAEvB,CAEA,IAmBW5K,EAIAA,EAvBLyL,EAAU/e,EAEV2Z,GADN3Z,EAAKvR,cAAcub,YAAYhK,CAAI,EACtBA,EAAKqa,WACZN,EAAe/Z,EAAKsa,kBAC1BzvB,IAAIm0B,EAAoB,CAAA,EAExB7D,sCAAsC4D,EAAShF,CAAY,EAGvDA,GAC2B,UAA3B,OAAOA,EAAatH,IACkB,CAAC,IAAvCsH,EAAatH,GAAGtkB,QAAQ,QAAQ,IAEhC6wB,EAAoB,CAAA,GAGxBrF,EAAK7qB,MAAOirB,CAAa,EAGzB,IAAWzG,KAAMyG,EAAanwB,iBAAiB,oCAAoC,EAC/E0pB,EAAG1nB,OAAO,EAGd,IAAW0nB,KAAMyG,EAAanwB,iBAAiB,2CAA2C,EACtF0pB,EAAG1nB,OAAO,EAIdf,IAAIo0B,EAAalF,EAAanwB,iBAAiB,qBAAqB,EACpE,GAA2B,IAAtBq1B,EAAWl0B,OAOZ,OANAk0B,EAAW,GAAGf,MAAM,EAApBe,KACID,GACAvvB,WAAW,WACPkoB,kBAAkB,CACtB,EAAG,IAAI,GAMf,GAA2B,KAD3BsH,EAAalF,EAAanwB,iBAAiB,oBAAoB,GAC/CmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAMxB,GAA2B,KAD3Be,EAAalF,EAAanwB,iBAAiB,+BAA+B,GAC1DmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAIxB,GAA2B,KAD3Be,EAAalF,EAAanwB,iBAAiB,4BAA4B,GACvDmB,OAEZ,OADAk0B,KAAAA,EAAW,GAAGf,MAAM,EAMG,KAD3Be,EAAalF,EAAanwB,iBAAiB,oCAAoC,GAC/DmB,QACZk0B,EAAW,GAAGf,MAAM,CAE5B,EACsB1nB,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAACyN,EAAOzN,MAAMmf,SAC5B7a,KAAAA,IAAhBmJ,EAAOpS,MAA8CiJ,KAAAA,IAAxBmJ,EAAOpS,KAAKyC,WAE1C6X,oBAAoBlI,CAAM,EAEtBkf,IACApvB,WAAW,WACP9F,SAASsH,SAASiuB,OAAO,CAC7B,EAAG,GAAI,CAGnB,CACJ,CAAC,CACT,CAKA,SAAS7B,2BAGL8B,gCAFcx1B,SAASyvB,qBAAqB,MAAM,CAEb,EAFrC,IAIMD,EAASxvB,SAASyvB,qBAAqB,QAAQ,EACrD,GAAqB,EAAhBD,EAAOpuB,OACR,IAAMF,IAAI+nB,EAAI,EAAGA,EAAIuG,EAAOpuB,OAAQ6nB,CAAC,GACjC,GAAkC,MAA7BuG,EAAOvG,GAAGyG,gBAAf,CAIA,IAAMC,EAAcH,EAAOvG,GAAGyG,gBAAgB3gB,MAE9C,GAA4B,IAAvB4gB,EAAYvuB,OACb,OAGJo0B,gCAAgC7F,EAAaH,EAAOvG,GAAGyG,eAAe,CARtE,CAWZ,CAQA,SAAS8F,gCAAgCzmB,EAAO+gB,EAAiB9vB,UAC7D,IACWqW,EAYAuQ,EAbL6O,EAAgB,GACtB,IAAWpf,KAAQtH,EAAO,CACtB,IAAM2mB,EAAarf,EAAK9S,aAAa,IAAI,EACrCmyB,GAA+C,CAAC,IAAlCA,EAAWlxB,QAAQ,QAAQ,GACzCixB,EAAcp1B,KAAKq1B,CAAU,EAE7BA,GAAmD,CAAC,IAAtCA,EAAWlxB,QAAQ,YAAY,GACzBqI,KAAAA,IAAnBwJ,EAAKxU,WAA2BwU,EAAKxU,UAAUqf,SAAS,sBAAsB,GAE/EuU,EAAcp1B,KAAKq1B,CAAU,CAErC,CAEA,IAAW9O,KAAU6O,EAAe,CAChC,IAAMpf,EAAOyZ,EAAerV,eAAemM,CAAM,EACjDvQ,EAAKsf,6BAA+Btf,EAAKoK,SACzCpK,EAAKoK,SAAWmV,+BACpB,CACJ,CAMA,SAASA,gCAAgCvf,GACrCA,EAAK8K,eAAe,EACpB9K,EAAKwf,yBAAyB,EAC9B,IAAMC,EAAYzf,EAClBA,EAAOA,EAAKvT,OAEZ,IAAMwtB,EAActwB,SAASoE,cAAc,OAAO,EAO5Cgc,GANNkQ,EAAYzsB,KAAO,SACnBysB,EAAY7sB,MAAQ,6BACpB6sB,EAAYnhB,KAAO,SACnBkH,EAAKwY,YAAYyB,CAAW,EAGN,IACtBlQ,EAAc,GAAKE,6BAA6BjK,CAAI,EACpDsK,gCAAgCP,CAAa,EAC7C/J,EAAKhR,OAAO6iB,+BAA+B,QAAQ,CAAC,EAEpD,IAAMtkB,EAAO,GACTqxB,EAAQ5e,EAAKjX,UAGjB61B,EAFQr1B,MAAMC,UAAUC,MAAMC,KAAKk1B,CAAK,GAElC3kB,QAAS,SAAUhQ,EAAMsvB,GACR,KAAdtvB,EAAKuD,KACND,EAAK,SAAWgsB,GAAKtvB,EAAKmD,MAE1BG,EAAKtD,EAAKuD,MAAQvD,EAAKmD,KAE/B,CAAC,EAEDmP,sBACIhP,EACA,CACIuF,MAAO,CAAA,EACPjG,SAAU,SAAS8S,GACf,GAAsBnJ,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAAE,CAACyN,EAAOzN,MAAMmf,QAAU,CACzDrR,EAAKoK,SAAW,KAGhB,IAAK,IAAMkJ,KAAMtT,EAAKpW,iBAAiB,oCAAoC,EACvE0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,2CAA2C,EAC9E0pB,EAAG1nB,OAAO,EAEd,IAAK,IAAM0nB,KAAMtT,EAAKpW,iBAAiB,yCAAyC,EAC5E0pB,EAAG1nB,OAAO,EAIVoU,EAAKsf,wCAAwC3U,WACzC+U,EAAUjwB,WAAW,WACrBuQ,EAAKsf,6BAA6B51B,KAAKsW,EAAMyf,CAAS,CAC1D,EAAG,GAAG,EACNrI,aAAasI,CAAO,GAJxB,IAOMT,EAAajf,EAAKtT,cAAc,sBAAsB,EAC5D,GAAIuyB,EAEA,OADAA,KAAAA,EAAWf,MAAM,CAGzB,CAEqB1nB,KAAAA,IAAjBmJ,EAAOzN,OAAuB,CAACyN,EAAOzN,MAAMmf,SAC5CxJ,oBAAoBlI,CAAM,CAElC,CACJ,CAAC,CACT,CAOA,SAASic,SAAStI,GACd,OAAIA,EAAG1H,SAAW0H,EAAGqM,SACVrM,EAAG1H,QACLle,OAAO,GAAYkyB,EAAOpmB,QAAQ,EAClCqmB,IAAI,GAAYD,EAAOxyB,KAAK,EACd,aAAZkmB,EAAGxa,MAAmC,UAAZwa,EAAGxa,KAC7Bwa,EAAGqI,SAAuB,KAE1BrI,EAAGlmB,KAElB,CASA,SAASsxB,iBAAiBH,EAASuB,GAC/Bj1B,IAAI2D,EAAS+vB,EAAQ9vB,cACrB,KAAOD,GAAQ,CACX,GAAIA,EAAOhD,UAAUqf,SAASiV,CAAY,EACtC,MAAO,CAAA,EAEXtxB,EAASA,EAAOC,aACpB,CACA,MAAO,CAAA,CACX,CAKA,SAASsxB,qCACL,IAAMC,EAAoB,CAAC,gBAAiB,gBAAiB,mBACvDC,EAAmBt2B,SAASoE,cAAc,KAAK,EACrDkyB,EAAiBz0B,UAAY,6BAC7B,IAAKX,IAAIC,EAAI,EAAGA,EAAIk1B,EAAkBj1B,OAAQD,CAAC,GAAI,CAC/C,IAAMo1B,EAAyBv2B,SAASoE,cAAc,MAAM,EAC5DmyB,EAAuB10B,UAAY,aAAew0B,EAAkBl1B,GACpEo1B,EAAuBC,UAAY,IACnCF,EAAiBjxB,OAAOkxB,CAAsB,CAClD,CACA,OAAOD,CACX,CAKA,SAASlV,0BAA0B7hB,EAAQ,CAAA,GACvC2B,IAAIu1B,EAAc,CAAA,EACdC,EAAgB,GAChBC,EAAe,GACK,aAApB,OAAOhmB,UACPlR,KAAKkZ,oBAAoB,QAASyI,yBAAyB,EAE3DqV,EAAch3B,KAEdkR,SAASimB,yBAA2B,CAAA,EACpCF,EAAgB/lB,SAASkmB,aACzBF,EAAehmB,SAASkP,mBACQ,aAAzB,OAAOiX,gBACdJ,EAAgBI,cAAcxqB,YAC9BqqB,EAAeG,cAAcC,kBAIjC/2B,SAAS+J,KAAKlI,UAAUC,IAAI,kBAAkB,EAE9CZ,IAQQ81B,EAQAC,EAOAC,EAWAC,EAlCJC,EAAep3B,SAASya,eAAe,aAAa,EACnD2c,GAiDDA,EAAa7rB,aAAa,QAAS,kBAAkB,EACpB,aAA7B,OAAOtD,mBAAqCA,kBAAkBovB,2BAC9Dr3B,SAASya,eAAe,kBAAkB,EAAEjL,UAAYvH,kBAAkBovB,2BAE1Er3B,SAASya,eAAe,kBAAkB,EAAEjL,UAAYsnB,cAAcO,8BAnDtEC,EAAet3B,SAASoE,cAAc,KAAK,GAClCmH,aAAa,QAAS,uCAAuC,EAC1E+rB,EAAa/rB,aAAa,KAAM,aAAa,GAGzCyrB,EAAqBh3B,SAASoE,cAAc,MAAM,GACnCvC,UAAY,uCAC3B01B,EAAcv3B,SAASoE,cAAc,GAAG,GAChCoyB,UAAYE,EACxBa,EAAYhsB,aAAa,QAAS,mCAAmC,EACrEyrB,EAAmB3xB,OAAOkyB,CAAW,GAGjCN,EAAmBj3B,SAASoE,cAAc,KAAK,GAClCmH,aAAa,KAAM,kBAAkB,EACtD0rB,EAAiB1rB,aAAa,QAAS,qCAAqC,EAC5E0rB,EAAiBx2B,MAAMub,MAAQ,SAI3Bkb,EAAmBl3B,SAASoE,cAAc,GAAG,GAChC0kB,GAAK,4CACW,aAA7B,OAAO7gB,mBAAqCA,kBAAkBovB,2BAC9DH,EAAiBV,UAAYvuB,kBAAkBovB,2BAE/CH,EAAiBV,UAAYM,cAAcO,2BAE/CH,EAAiB3rB,aAAa,QAAS,qCAAqC,GAIxE4rB,EAAoBn3B,SAASoE,cAAc,GAAG,GAChC0kB,GAAK,6CACU,aAA7B,OAAO7gB,mBAAqCA,kBAAkBuvB,0BAC9DL,EAAkBX,UAAYvuB,kBAAkBuvB,0BAEhDL,EAAkBX,UAAYM,cAAcU,0BAIhDP,EAAiB5xB,OAAO6xB,CAAgB,EACxCD,EAAiB5xB,OAAO8xB,CAAiB,EACzCG,EAAajyB,OAAO2xB,CAAkB,EACtCM,EAAajyB,OAAO4xB,CAAgB,EACpCK,EAAajyB,OAAO+wB,mCAAmC,CAAC,EACxDp2B,SAAS+J,KAAK1E,OAAOiyB,CAAY,GAUrCG,yBAAyBl4B,EAAOo3B,EAAcF,CAAW,CAC7D,CAOA,SAASgB,yBAAyBl4B,EAAOsgB,EAAmB4W,GACxD,GAAIl3B,GAASk3B,EAAa,CAEtB,IACI7yB,EAAO,CACPgS,sBAFyBxD,wBAAwB,EAGjDyD,SAAU7V,SAASsH,SAASC,KAC5BuO,SAAU9V,SAAS8V,SACnB4hB,cAAe,EACnB,EACIC,EAA0B,GAC9B,IAAKz2B,IAAIC,EAAI,EAAGA,EAAI0e,EAAkBze,OAAQD,CAAC,GAAI,CAGN,KAAA,IAA9B0e,EAAkB1e,GAAGoG,MACqB,IAAjDsY,EAAkB1e,GAAGoG,KAAK/C,QAAQ,SAAS,IAE3CjF,EAAM4hB,eAAe,EACrBxQ,SAASimB,yBAA2B,CAAA,GAIxC11B,IAAI02B,EAAe53B,SAASoE,cAAc,KAAK,EAC/CwzB,EAAarsB,aAAa,QAAS,eAAe,EAClDhD,MAAMsX,EAAkB1e,EAAE,EAAEkE,OAAOuyB,CAAY,EAG/CD,EAAwBx2B,GAAK0e,EAAkB1e,GAAGoV,QAAQshB,cAC9D,CAGAj0B,EAAK8zB,cAAgBxwB,KAAKC,UAAUwwB,CAAuB,EAGhB,SAAtC1vB,kBAAkBG,gBACnBuK,sBACI,qBACA,CACI/O,KAAMA,EACNsF,OAAQ,OACRhG,SAAU,SAAS8S,GAEfjG,YAAY,6BAA8BY,SAASmnB,oBAAqB,EAAE,EAC1EC,8BAA8B/hB,EAAQ6J,EAAmB4W,CAAW,CACxE,EACA/sB,gBAAiB,SAASsuB,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,GAIAp0B,EAAKiP,OAAS,qBACdD,sBACIhP,EACA,CACI6I,QAAS,CAAA,EACTvJ,SAAU,SAAS8S,GACfxL,QAAQrE,IAAI,QAAQ,EACpBqE,QAAQrE,IAAI6P,CAAM,EAGlBjG,YAAY,6BAA8BY,SAASmnB,oBAAqB,EAAE,EAC1EC,8BAA8B/hB,EAAQ6J,EAAmB4W,CAAW,CACxE,EACA/sB,gBAAiB,SAASsuB,GACtBC,kBAAkB,EAClBC,oBAAoBF,CAAG,CAC3B,CACJ,CACJ,EAER,KAAO,CACH,IAAMrB,EAAe9W,EAAkBtJ,QAAQshB,eAC3Cj0B,EAAO,CACP8zB,cAAexwB,KAAKC,UAAU,CAACgxB,EAAGxB,CAAY,CAAC,CACnD,EAGIiB,EAAe53B,SAASoE,cAAc,KAAK,EAC/CwzB,EAAarsB,aAAa,QAAS,eAAe,EAClDsU,EAAkBgP,YAAY+I,CAAY,EAE1C3N,qBACI,CACIpX,OAAU,qBACV6kB,cAAiB9zB,EAAK8zB,aAC1B,EACA,CACIx0B,SAAY,SAAS8S,GACjB+hB,8BAA8B/hB,EAAQ6J,EAAmB,CAAA,CAAK,CAClE,EACApT,QAAW,CAAA,CACf,CACJ,CACJ,CACJ,CAOA,SAASsrB,8BAA8B/hB,EAAQ6J,EAAmB4W,EAAc,CAAA,GACxEzgB,EAAOoiB,SAAyC,CAAA,IAA9BpiB,EAAOpS,KAAK,GAAGy0B,WAEjCvyB,WAAW,WAEP5E,IAAIosB,EAAQttB,SAASya,eAAe,aAAa,EACjD,GAAc,OAAV6S,EAAgB,CAChBpsB,IAAI6Z,EAAQ,GACZ,GAAI0b,EAAa,CACbv1B,IAAIo3B,EACJtiB,EAAOpS,KAAK0M,QAAQ,IACZioB,EAAIC,gBAAkB/B,EAAYlgB,QAAQshB,iBAC1CS,EAAoBC,EAE5B,CAAC,EAEDxd,EAAQud,EAAkBG,cAAclZ,MAAM,MAAM,EAAE,EAC1D,MACIxE,EAAQ/E,EAAOpS,KAAK,GAAG60B,cAG3Bv3B,IAAIw3B,EAAYpL,EAAMvqB,cAAc,4CAA4C,EAE5E41B,EAAkB34B,SAASoE,cAAc,GAAG,EAqB5CkS,GApBJqiB,EAAgBptB,aAAa,QAAS,wCAAwC,EAC9EotB,EAAgBnC,UAAYzb,EACK,aAA7B,OAAO9S,mBAAqCA,kBAAkB2wB,yBAC9DD,EAAgB1F,MAAQhrB,kBAAkB2wB,yBAE1CD,EAAgB1F,MAAQ6D,cAAc8B,yBAGtCF,IACiC,aAA7B,OAAOzwB,mBAAqCA,kBAAkB4wB,wBAC9DH,EAAUlpB,UAAYvH,kBAAkB4wB,wBACpC,SAAWF,EAAgBppB,UAE/BmpB,EAAUlpB,UAAYsnB,cAAc+B,wBAChC,SAAWF,EAAgBppB,UAGnCmpB,EAAUntB,aAAa,QAAS,sBAAsB,GAG5C+hB,EAAMvqB,cAAc,6BAA6B,GAK3D+1B,GAJAxiB,GACAA,EAAQrU,OAAO,EAGFqrB,EAAMvqB,cAAc,6CAA6C,GAK9Eg2B,GAJAD,GACAA,EAAW72B,OAAO,EAGFjC,SAASoE,cAAc,MAAM,GACjD20B,EAAcl3B,UAAY,sDACrB7B,SAAS+C,cAAc,oCAAoC,IACxDuG,EAAStJ,SAASoE,cAAc,QAAQ,EACX,aAA7B,OAAO6D,mBAAqCA,kBAAkB+wB,gBAC9D1vB,EAAOktB,UAAYvuB,kBAAkB+wB,gBAErC1vB,EAAOktB,UAAYM,cAAckC,gBAErC1vB,EAAOzH,UAAY,oCACnByH,EAAO3G,iBAAiB,QAAS,WAC7B3C,SAAS+J,KAAKlI,UAAUI,OAAO,kBAAkB,EACjDqrB,EAAM/hB,aAAa,QAAS,cAAc,EAC1C0tB,iBAAiBpZ,EAAmB7J,CAAM,EAElB,aAApB,OAAOrF,UAA4BA,SAASimB,0BAA4BH,GACxEA,EAAYlC,MAAM,CAE1B,CAAC,EACDwE,EAAc1zB,OAAOiE,CAAM,EAC3BgkB,EAAMjoB,OAAO0zB,CAAa,EAElC,CACJ,EAAG,GAAI,EAEHtC,EACIzgB,EAAOoiB,SACPH,kBAAkB,EACe,aAA7B,OAAOhwB,mBAAqCA,kBAAkBixB,iBAC9DhB,oBAAoBjwB,kBAAkBixB,iBAAmB,KAAOljB,EAAOpS,KAAK,GAAG+jB,OAAO,EAEtFuQ,oBAAoBpB,cAAcoC,iBAAmB,KAAOljB,EAAOpS,KAAK,GAAG+jB,OAAO,IAGtFsQ,kBAAkB,EACe,aAA7B,OAAOhwB,mBAAqCA,kBAAkBkxB,wBAC9DjB,oBAAoBjwB,kBAAkBkxB,wBAA0B,KAAOnjB,EAAOzN,MAAMof,OAAO,EAE3FuQ,oBAAoBpB,cAAcqC,wBAA0B,KAAOnjB,EAAOpS,KAAK,GAAG+jB,OAAO,GAIjGnd,QAAQrE,IAAI,SAAU6P,CAAM,CAGxC,CAKA,SAASiiB,oBACqC,KAAA,IAA/BtnB,SAASkP,mBAChBlP,SAASkP,kBAAkBvP,QAAQ,SAAS6E,GACxCA,EAAQxS,iBAAiB,QAASye,yBAAyB,CAC/D,CAAC,CAET,CAMA,SAAS8W,oBAAoBvQ,GAClBA,EAAAA,IAC8B,aAA7B,OAAO1f,mBAAqCA,kBAAkBmxB,uBACpDnxB,kBAEA6uB,eAFkBsC,uBAMpCl4B,IAAIosB,EAAQttB,SAASya,eAAe,aAAa,EACjDvZ,IAAIm4B,EAAYr5B,SAASya,eAAe,kBAAkB,EAC5C,OAAV6S,IACAttB,SAAS+J,KAAKlI,UAAUI,OAAO,kBAAkB,EAChB,aAA7B,OAAOgG,mBAAqCA,kBAAkBqxB,uBAC9DD,EAAU7C,UAAYvuB,kBAAkBqxB,uBAAyB,KAAO3R,EAExE0R,EAAU7C,UAAYM,cAAcwC,uBAAyB,KAAO3R,EAExE7hB,WAAW,WACPwnB,EAAM/hB,aAAa,QAAS,cAAc,CAC9C,EAAG,GAAI,EAEf,CAOA,SAAS0tB,iBAAiBM,EAAcC,GACpC,GAA0B,EAAtBD,EAAan4B,OACb,IAAKF,IAAIC,EAAI,EAAGA,EAAIo4B,EAAan4B,OAAQD,CAAC,GAAI,CAE1CD,IAAIo3B,EAOJ,GANAkB,EAAe51B,KAAK0M,QAAQ,IACpBioB,EAAIC,gBAAkBe,EAAap4B,GAAGoV,QAAQshB,iBAC9CS,EAAoBC,EAE5B,CAAC,EAEoC,CAAA,IAAjCD,EAAkBD,WAClB,OAGJ,GACoC,KAAA,IAAzBkB,EAAap4B,GAAGoG,MAEyB,IAA5CgyB,EAAap4B,GAAGoG,KAAK/C,QAAQ,SAAS,GACG,IAAzC+0B,EAAap4B,GAAGoG,KAAK/C,QAAQ,MAAM,EA6BvC+0B,EAAap4B,GAAGU,UAAUC,IAAI,SAAS,EAEvCgE,WAAW,KACP2zB,2BAA2BnB,EAAmBiB,EAAap4B,EAAE,CACjE,EAAG,GAAI,MA/BT,CACED,IAAIw4B,EACJ,GAAgD,IAA5CH,EAAap4B,GAAGoG,KAAK/C,QAAQ,SAAS,EACtCk1B,EAAiB,cACd,CAAA,GAA6C,IAAzCH,EAAap4B,GAAGoG,KAAK/C,QAAQ,MAAM,EAG1C,SAFAk1B,EAAiB,MAGrB,CACAx4B,IAAIy1B,EAAe4C,EAAap4B,GAAGoG,KAAKxG,QAAQ24B,EAAgB,EAAE,EAC9DC,EAAqBJ,EAAap4B,GAAGqO,UACzC+pB,EAAap4B,GAAGqO,UAAYmqB,EAAmB54B,QAC3C41B,EACA2B,EAAkBG,aACtB,EACAc,EAAap4B,GAAGoG,KAAOmyB,EAAiBpB,EAAkBG,cAE1Dc,EAAap4B,GAAGlB,iBAAiB,0BAA0B,EAAEqQ,QAAQ,IACjEpP,IAAI04B,EAA+B,GACnCJ,EAAe51B,KAAK0M,QAAQ,IACpBioB,EAAIC,gBAAkB7O,EAAGpT,QAAQshB,iBACjC+B,EAA+BrB,EAAIE,cAE3C,CAAC,EACD9O,EAAGna,UAAYoqB,CACnB,CAAC,CACL,CAQAL,EAAap4B,GAAGwX,oBAAoB,QAASyI,yBAAyB,CAC1E,KACG,CACHlgB,IAAIo3B,EAAoBkB,EAAe51B,KAAK,GAC5C21B,EAAa13B,UAAUC,IAAI,SAAS,EAEpCgE,WAAW,KACP2zB,2BAA2BnB,EAAmBiB,CAAY,CAC9D,EAAG,GAAI,EACPA,EAAa5gB,oBAAoB,QAASyI,yBAAyB,CACvE,CACJ,CAMA,SAASqY,2BAA2B1tB,EAAU8tB,GAC1CA,EAActuB,aAAa,QAAS,EAAE,EACtCsuB,EAAcjuB,gBAAgB,OAAO,EACrCkuB,mBAAmBD,EAAe9tB,EAAS0sB,aAAa,CAC5D,CAMA,SAASqB,mBAAmBh3B,EAAQiY,GAChCjY,EAAO0M,UAAY1M,EAAO0M,UAAUzO,QAAQ,kDAAmDga,EAAQ,IAAI,CAC/G"} \ 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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 diff --git a/js/apbct-public-bundle_full-protection.min.js.map b/js/apbct-public-bundle_full-protection.min.js.map index 2a164184d..0e9cf1cf1 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"mappings":"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"} \ No newline at end of file diff --git a/js/apbct-public-bundle_int-protection.min.js.map b/js/apbct-public-bundle_int-protection.min.js.map index 1a19e059f..3da06a147 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n * eslint-disable-next-line no-unused-vars\n */\nfunction ctBrowserCheckHide() {\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","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 * @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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file diff --git a/js/src/apbct-public--8--browser-check.js b/js/src/apbct-public--8--browser-check.js index 3734299c6..5133a5ca1 100644 --- a/js/src/apbct-public--8--browser-check.js +++ b/js/src/apbct-public--8--browser-check.js @@ -168,9 +168,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * eslint-disable-next-line no-unused-vars */ -function ctBrowserCheckHide() { +function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; loaderContainer.style.alignItems = 'left'; diff --git a/js/src/apbct-public-bundle.js b/js/src/apbct-public-bundle.js index 144a55547..e43401c20 100644 --- a/js/src/apbct-public-bundle.js +++ b/js/src/apbct-public-bundle.js @@ -4422,9 +4422,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * eslint-disable-next-line no-unused-vars */ -function ctBrowserCheckHide() { +function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; loaderContainer.style.alignItems = 'left'; diff --git a/js/src/apbct-public-bundle_ext-protection.js b/js/src/apbct-public-bundle_ext-protection.js index fce029ab8..0910152c5 100644 --- a/js/src/apbct-public-bundle_ext-protection.js +++ b/js/src/apbct-public-bundle_ext-protection.js @@ -4422,9 +4422,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * eslint-disable-next-line no-unused-vars */ -function ctBrowserCheckHide() { +function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; loaderContainer.style.alignItems = 'left'; diff --git a/js/src/apbct-public-bundle_full-protection.js b/js/src/apbct-public-bundle_full-protection.js index afc3133a8..421be1ee8 100644 --- a/js/src/apbct-public-bundle_full-protection.js +++ b/js/src/apbct-public-bundle_full-protection.js @@ -6021,9 +6021,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * eslint-disable-next-line no-unused-vars */ -function ctBrowserCheckHide() { +function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; loaderContainer.style.alignItems = 'left'; diff --git a/js/src/apbct-public-bundle_int-protection.js b/js/src/apbct-public-bundle_int-protection.js index a08be6692..36eccb182 100644 --- a/js/src/apbct-public-bundle_int-protection.js +++ b/js/src/apbct-public-bundle_int-protection.js @@ -4863,9 +4863,8 @@ document.addEventListener('DOMContentLoaded', function() { /** * Hide browser check - * eslint-disable-next-line no-unused-vars */ -function ctBrowserCheckHide() { +function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars document.querySelector('.ct-browser-check-title').textContent = 'TRP'; loaderContainer.style.right = '-70px'; loaderContainer.style.alignItems = 'left'; From 1f37a9a67c93a82fa5188c1655b20646751a3eaa Mon Sep 17 00:00:00 2001 From: svfcode Date: Thu, 8 May 2025 09:00:02 +0300 Subject: [PATCH 5/5] wip --- gulpfile.js | 8 +- js/apbct-disable-comments.min.js | 12 +- js/apbct-disable-comments.min.js.map | 2 +- js/apbct-public--3--cleantalk-modal.min.js | 190 +- ...pbct-public--3--cleantalk-modal.min.js.map | 2 +- js/apbct-public--7--trp.min.js | 182 +- js/apbct-public--7--trp.min.js.map | 2 +- js/apbct-public--8--browser-check.min.js | 347 +- js/apbct-public--8--browser-check.min.js.map | 2 +- js/apbct-public-bundle.min.js | 4730 ++++++++++++- js/apbct-public-bundle_ext-protection.min.js | 6100 +++++++++++++++- ...ct-public-bundle_ext-protection.min.js.map | 2 +- js/apbct-public-bundle_full-protection.min.js | 6202 ++++++++++++++++- ...t-public-bundle_full-protection.min.js.map | 2 +- js/apbct-public-bundle_int-protection.min.js | 5146 +++++++++++++- ...ct-public-bundle_int-protection.min.js.map | 2 +- js/cleantalk-admin-settings-page.min.js | 846 ++- js/cleantalk-admin-settings-page.min.js.map | 2 +- js/cleantalk-admin.min.js | 608 +- js/cleantalk-admin.min.js.map | 2 +- js/cleantalk-comments-checkspam.min.js | 503 +- js/cleantalk-comments-checkspam.min.js.map | 2 +- js/cleantalk-comments-editscreen.min.js | 134 +- js/cleantalk-comments-editscreen.min.js.map | 2 +- js/cleantalk-dashboard-widget.min.js | 92 +- js/cleantalk-dashboard-widget.min.js.map | 2 +- js/cleantalk-public-admin.min.js | 88 +- js/cleantalk-public-admin.min.js.map | 2 +- js/cleantalk-users-checkspam.min.js | 641 +- js/cleantalk-users-checkspam.min.js.map | 2 +- js/cleantalk-users-editscreen.min.js | 57 +- js/cleantalk-users-editscreen.min.js.map | 2 +- js/src/apbct-public--8--browser-check.js | 436 +- js/src/apbct-public-bundle.js | 432 +- js/src/apbct-public-bundle_ext-protection.js | 432 +- js/src/apbct-public-bundle_full-protection.js | 432 +- js/src/apbct-public-bundle_int-protection.js | 432 +- 37 files changed, 26955 insertions(+), 1125 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 0e342e640..e615f7915 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,7 @@ var gulp = require('gulp'), sourcemaps = require('gulp-sourcemaps'), - uglify = require('gulp-uglify'), + // uglify = require('gulp-uglify'), rename = require('gulp-rename'), cssmin = require('gulp-cssmin'), concat = require('gulp-concat'), @@ -29,7 +29,7 @@ function compress_all_js() { 'js/src/apbct-public--8--browser-check.js', ]) .pipe(sourcemaps.init()) - .pipe(uglify()) + // .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('js')); @@ -42,7 +42,7 @@ function bundle_admin_and_common_js() { ]) .pipe(sourcemaps.init()) .pipe(concat('cleantalk-admin.js')) - .pipe(uglify()) + // .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('js')); @@ -127,7 +127,7 @@ function bundle_js() { presets: [["@babel/preset-env", { targets: { ie: "11" } }]], plugins: ["@babel/plugin-transform-class-properties"] })) - .pipe(uglify()) + // .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('js')); } diff --git a/js/apbct-disable-comments.min.js b/js/apbct-disable-comments.min.js index 3691705a0..81122741f 100644 --- a/js/apbct-disable-comments.min.js +++ b/js/apbct-disable-comments.min.js @@ -1,2 +1,12 @@ -wp.domReady(function(){wp.blocks&&wp.blocks.getBlockTypes().forEach(function(e){apbctDisableComments.disabled_blocks.includes(e.name)&&wp.blocks.unregisterBlockType(e.name)})}); +'use strict'; +wp.domReady(function() { + if (wp.blocks) { + wp.blocks.getBlockTypes().forEach(function(block) { + if (apbctDisableComments.disabled_blocks.includes(block.name)) { + wp.blocks.unregisterBlockType(block.name); + } + }); + } +}); + //# sourceMappingURL=apbct-disable-comments.min.js.map diff --git a/js/apbct-disable-comments.min.js.map b/js/apbct-disable-comments.min.js.map index 8a8e54f0f..a92e63705 100644 --- a/js/apbct-disable-comments.min.js.map +++ b/js/apbct-disable-comments.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-disable-comments.min.js","sources":["apbct-disable-comments.js"],"sourcesContent":["'use strict';\nwp.domReady(function() {\n if (wp.blocks) {\n wp.blocks.getBlockTypes().forEach(function(block) {\n if (apbctDisableComments.disabled_blocks.includes(block.name)) {\n wp.blocks.unregisterBlockType(block.name);\n }\n });\n }\n});\n"],"names":["wp","domReady","blocks","getBlockTypes","forEach","block","apbctDisableComments","disabled_blocks","includes","name","unregisterBlockType"],"mappings":"AACAA,GAAGC,SAAS,WACJD,GAAGE,QACHF,GAAGE,OAAOC,cAAc,EAAEC,QAAQ,SAASC,GACnCC,qBAAqBC,gBAAgBC,SAASH,EAAMI,IAAI,GACxDT,GAAGE,OAAOQ,oBAAoBL,EAAMI,IAAI,CAEhD,CAAC,CAET,CAAC"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["apbct-disable-comments.js"],"sourcesContent":["'use strict';\nwp.domReady(function() {\n if (wp.blocks) {\n wp.blocks.getBlockTypes().forEach(function(block) {\n if (apbctDisableComments.disabled_blocks.includes(block.name)) {\n wp.blocks.unregisterBlockType(block.name);\n }\n });\n }\n});\n"],"file":"apbct-disable-comments.min.js"} \ No newline at end of file diff --git a/js/apbct-public--3--cleantalk-modal.min.js b/js/apbct-public--3--cleantalk-modal.min.js index aacd84d85..ce0b7686e 100644 --- a/js/apbct-public--3--cleantalk-modal.min.js +++ b/js/apbct-public--3--cleantalk-modal.min.js @@ -1,2 +1,190 @@ -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,n,o){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},n={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},o={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},l={styles:{content:'""',display:"block",position:"absolute",background:"#000","border-radius":"1px",width:"2px",height:"16px",top:"2px",left:"9px",transform:"rotate(-45deg)"},toString:e},d={styles:{overflow:"hidden"},toString:e},i=document.createElement("style"),d=(i.setAttribute("id","cleantalk-modal-styles"),i.innerHTML="body.cleantalk-modal-opened{"+d+"}",i.innerHTML+="#cleantalk-modal-overlay{"+t+"}",i.innerHTML+="#cleantalk-modal-close{"+o+"}",i.innerHTML+="#cleantalk-modal-close:before{"+a+"}",i.innerHTML+="#cleantalk-modal-close:after{"+l+"}",document.body.append(i),document.createElement("div")),t=(d.setAttribute("id","cleantalk-modal-overlay"),document.body.append(d),document.body.classList.add("cleantalk-modal-opened"),document.createElement("div")),o=(t.setAttribute("id","cleantalk-modal-inner"),t.setAttribute("style",n),d.append(t),document.createElement("div")),a=(o.setAttribute("id","cleantalk-modal-close"),t.append(o),document.createElement("div"));this.loaded?(l=/(https?:\/\/[^\s]+)/g,/.*\/inc/g.test(this.loaded)||this.ignoreURLConvert?a.innerHTML=this.loaded:a.innerHTML=this.loaded.replace(l,'$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}))}};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)}); +/* 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; + } +}); + //# sourceMappingURL=apbct-public--3--cleantalk-modal.min.js.map diff --git a/js/apbct-public--3--cleantalk-modal.min.js.map b/js/apbct-public--3--cleantalk-modal.min.js.map index 3881c1c5c..e8b5428f7 100644 --- a/js/apbct-public--3--cleantalk-modal.min.js.map +++ b/js/apbct-public--3--cleantalk-modal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public--3--cleantalk-modal.min.js","sources":["apbct-public--3--cleantalk-modal.js"],"sourcesContent":["/* 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"],"names":["let","cleantalkModal","loaded","loading","opened","opening","ignoreURLConvert","load","action","callback","this","result","data","params","obj","document","dispatchEvent","CustomEvent","bubbles","apbct_admin_sendAJAX","apbct_public_sendAJAX","notJson","open","renderCss","cssStr","key","styles","overlayCss","z-index","position","top","left","width","height","background","display","justify-content","align-items","toString","innerCss","padding","border","border-radius","box-shadow","closeCss","cursor","right","box-sizing","closeCssBefore","content","transform","closeCssAfter","bodyCss","overflow","cleantalkModalStyle","createElement","overlay","setAttribute","innerHTML","body","append","inner","classList","add","close","urlRegex","test","replace","remove","getElementById","addEventListener","e","target","id"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["apbct-public--3--cleantalk-modal.js"],"sourcesContent":["/* 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"],"file":"apbct-public--3--cleantalk-modal.min.js"} \ No newline at end of file diff --git a/js/apbct-public--7--trp.min.js b/js/apbct-public--7--trp.min.js index d79734bff..a4207f659 100644 --- a/js/apbct-public--7--trp.min.js +++ b/js/apbct-public--7--trp.min.js @@ -1,2 +1,182 @@ -function closeAllPopupTRP(){var e=document.querySelectorAll(".apbct-real-user-popup.visible");0{e.classList.remove("visible")})}document.addEventListener("DOMContentLoaded",function(){let o=void 0,p=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(o="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:o)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(o=ctTrpAdminLocalize.theRealPerson,p=!0),o){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 n,a,s,i,r,c,l;"undefined"==typeof pagenow&&e.parentElement.className.indexOf("group")<0&&"DIV"!=e.tagName||((n=document.createElement("div")).setAttribute("class","apbct-real-user-badge"),(a=document.createElement("img")).setAttribute("src",o.imgPersonUrl),a.setAttribute("class","apbct-real-user-popup-img"),(s=document.createElement("div")).setAttribute("class","apbct-real-user-popup"),(i=document.createElement("p")).setAttribute("class","apbct-real-user-popup-header"),i.append(o.phrases.trpHeading),(r=document.createElement("div")).setAttribute("class","apbct-real-user-popup-content_row"),(c=document.createElement("span")).append(o.phrases.trpContent1+" "),c.append(o.phrases.trpContent2),p&&((l=document.createElement("a")).setAttribute("href",o.trpContentLink),l.setAttribute("target","_blank"),l.text=o.phrases.trpContentLearnMore,c.append(" "),c.append(l)),r.append(c),s.append(i,r),n.append(a),e.append(n),e.append(s))}),document.querySelectorAll(".apbct-real-user-badge").forEach(n=>{let a=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()}),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(){a=setTimeout(()=>{var e=this.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(()=>{e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},1e3)}),n.addEventListener("touchend",function(){a=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(a),document.addEventListener("selectionchange",function e(){var t=window.getSelection();t&&0===t.toString().length&&(a=setTimeout(()=>{var e=n.nextElementSibling;e&&e.classList.contains("apbct-real-user-popup")&&e.classList.remove("visible")},3e3),document.removeEventListener("selectionchange",e))}))},3e3)})}))}}); +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'); + }); + } +} + //# sourceMappingURL=apbct-public--7--trp.min.js.map diff --git a/js/apbct-public--7--trp.min.js.map b/js/apbct-public--7--trp.min.js.map index efb30f56c..212debae1 100644 --- a/js/apbct-public--7--trp.min.js.map +++ b/js/apbct-public--7--trp.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public--7--trp.min.js","sources":["apbct-public--7--trp.js"],"sourcesContent":["document.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":["closeAllPopupTRP","let","allDisplayPopup","document","querySelectorAll","length","forEach","element","classList","remove","addEventListener","ctTrpLocalize","undefined","ctTrpIsAdminCommentsList","ctPublic","ctTrpAdminLocalize","theRealPerson","themesCommentsSelector","querySelector","trpComments","index","trpLayout","trpImage","trpDescription","trpDescriptionHeading","trpDescriptionContent","trpDescriptionContentSpan","learnMoreLink","pagenow","parentElement","className","indexOf","tagName","createElement","setAttribute","imgPersonUrl","append","phrases","trpHeading","trpContent1","trpContent2","trpContentLink","text","trpContentLearnMore","hideTimeout","popup","this","body","e","target","badge","nextElementSibling","contains","toggle","add","setTimeout","clearTimeout","selection","window","getSelection","toString","onSelectionChange","removeEventListener"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["apbct-public--7--trp.js"],"sourcesContent":["document.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"],"file":"apbct-public--7--trp.min.js"} \ No newline at end of file diff --git a/js/apbct-public--8--browser-check.min.js b/js/apbct-public--8--browser-check.min.js index 4f9563f8d..4b92a5783 100644 --- a/js/apbct-public--8--browser-check.min.js +++ b/js/apbct-public--8--browser-check.min.js @@ -1,68 +1,283 @@ -let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}document.addEventListener("DOMContentLoaded",function(){loaderContainer.className="ct-browser-check-container";let e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)];document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px";let t="botDetector",o="",r="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',r=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML=` - ${o} - > - `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; + + constructor() { + this.addStyles(); + this.addEventListener(); + } + + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } + + this.showLoader(); + }); + } + + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `,document.head.appendChild(o),loaderContainer.style.cssText=` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` - border-bottom: 1px solid #bbbbbb; - `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` - border-top: 1px solid #bbbbbb; - `,o.textContent="Browser check",loaderContainer.appendChild(o)}); + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } + + /** + * Create and add styles + */ + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } + `; + + document.head.appendChild(style); + } +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } + +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); + +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); + +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } + +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } + //# sourceMappingURL=apbct-public--8--browser-check.min.js.map diff --git a/js/apbct-public--8--browser-check.min.js.map b/js/apbct-public--8--browser-check.min.js.map index 0d82b46ed..9931be9c5 100644 --- a/js/apbct-public--8--browser-check.min.js.map +++ b/js/apbct-public--8--browser-check.min.js.map @@ -1 +1 @@ -{"version":3,"file":"apbct-public--8--browser-check.min.js","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["const loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n}\n"],"names":["loaderContainer","document","createElement","ctBrowserCheckHide","querySelector","textContent","style","right","alignItems","width","marginLeft","addEventListener","className","let","startTime","showResult","results","result","Math","floor","random","length","remove","height","title","svg","arrowAction","console","log","dev","innerHTML","appendChild","display","Date","setTimeout","head","cssText","loader","description","body"],"mappings":"AAAA,IAAMA,gBAAkBC,SAASC,cAAc,KAAK,EA2KpD,SAASC,qBACLF,SAASG,cAAc,yBAAyB,EAAEC,YAAc,MAChEL,gBAAgBM,MAAMC,MAAQ,QAC9BP,gBAAgBM,MAAME,WAAa,OACnCP,SAASG,cAAc,yBAAyB,EAAEE,MAAME,WAAa,OACrEP,SAASG,cAAc,yBAAyB,EAAEE,MAAMG,MAAQ,OAChER,SAASG,cAAc,yBAAyB,EAAEE,MAAMI,WAAa,OACzE,CAhLAT,SAASU,iBAAiB,mBAAoB,WAC1CX,gBAAgBY,UAAY,6BAC5BC,IAAIC,EAAY,KA2BhB,SAASC,IACLF,IAAIG,EAAU,CAAC,MAAO,SAClBC,EAASD,EAAQE,KAAKC,MAAMD,KAAKE,OAAO,EAAIJ,EAAQK,MAAM,GAE9DpB,SAASG,cAAc,0BAA0B,EAAEkB,OAAO,EAC1DrB,SAASG,cAAc,+BAA+B,EAAEkB,OAAO,EAC/DrB,SAASG,cAAc,6BAA6B,EAAEE,MAAMiB,OAAS,OAGrEV,IAAIW,EAAQ,cACRC,EAAM,GACNC,EAAc,GAClB,OAAQT,GACR,IAAK,MACDU,QAAQC,IAAI,KAAK,EAEjBH,EAAM,wOACN,MACJ,IAAK,QACDE,QAAQC,IAAI,OAAO,EACnBJ,EAAQ,kBAERC,EAAM,4LACNC,EAAc,4DAElB,CACAzB,SAASG,cAAc,yBAAyB,EAAEC,YAAcmB,EAC1DK,EAAM5B,SAASC,cAAc,KAAK,EACxC2B,EAAIjB,UAAY,yBAChBiB,EAAIC;cACEL;wDAC0CC;UAEhD1B,gBAAgB+B,YAAYF,CAAG,CACnC,CA1DA5B,SAASU,iBAAiB,qBAAsB,WAC5CX,gBAAgBM,MAAM0B,QAAU,QAChClB,EAAY,IAAImB,IACpB,CAAC,EAEDhC,SAASU,iBAAiB,mBAAoB,WAC1CgB,QAAQC,IAAI,kBAAkB,CAClC,CAAC,EAED3B,SAASU,iBAAiB,sBAAuB,WACzCG,GAAa,IAAImB,KAASnB,EAZR,IAalBoB,WAAW,KACPnB,EAAW,CACf,EAfkB,KAeQ,IAAIkB,KAASnB,EAAU,EAGrDoB,WAAW,KACPnB,EAAW,CACf,EApBsB,GAoBA,CAC1B,CAAC,EA0CDd,SAASU,iBAAiB,qBAAsB,WAC5CgB,QAAQC,IAAI,oBAAoB,CACpC,CAAC,EAEDD,QAAQC,IAAI,kBAAkB,EAG9B,IAAMtB,EAAQL,SAASC,cAAc,OAAO,EAmEtCsB,GAlENlB,EAAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CNJ,SAASkC,KAAKJ,YAAYzB,CAAK,EAG/BN,gBAAgBM,MAAM8B;;;;;;;;;;;;;;;;;MAoBRnC,SAASC,cAAc,KAAK,GASpCmC,GARNb,EAAMZ,UAAY,yBAClBY,EAAMlB,MAAM8B;;MAGZZ,EAAMnB,YAAc,cACpBL,gBAAgB+B,YAAYP,CAAK,EAGlBvB,SAASC,cAAc,KAAK,GAQrCoC,GAPND,EAAOzB,UAAY,0BAGnBZ,gBAAgB+B,YAAYM,CAAM,EAClCpC,SAASsC,KAAKR,YAAY/B,eAAe,EAGrBC,SAASC,cAAc,KAAK,GAChDoC,EAAY1B,UAAY,+BACxB0B,EAAYhC,MAAM8B;;MAGlBE,EAAYjC,YAAc,gBAC1BL,gBAAgB+B,YAAYO,CAAW,CAC3C,CAAC"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["apbct-public--8--browser-check.js"],"sourcesContent":["class ctBrowserCheck {\n titleCheck = 'botDetector in action!';\n titleHuman = \"You're a real person!\";\n title = '';\n logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png';\n trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png';\n logoAlt = 'CleanTalk';\n privacyLink = 'https://cleantalk.org/privacy';\n termsLink = 'https://cleantalk.org/terms';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgBad = '';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgGood = '';\n resultStore = 'ct-browser-check-result';\n container = null;\n result = 'human';\n isLoader = true;\n\n constructor() {\n this.addStyles();\n this.addEventListener();\n }\n\n addEventListener() {\n document.addEventListener('ctBotDetectorStart', () => {\n // if (localStorage.getItem(this.resultStore)) {\n // this.showSavedResult();\n // return;\n // }\n\n this.showLoader();\n });\n }\n\n showSavedResult() {\n }\n\n showLoader() {\n this.title = this.titleCheck;\n this.render();\n this.showContainer();\n }\n\n render() {\n if (document.querySelector('.ct-browser-check-container')) {\n this.container = document.querySelector('.ct-browser-check-container');\n } else {\n this.container = document.createElement('div');\n this.container.className = 'ct-browser-check-container';\n document.body.appendChild(this.container);\n }\n\n this.container.innerHTML += `
`;\n // this.container.innerHTML += `
${this.title}
`;\n this.container.innerHTML += `
test
`;\n this.container.innerHTML += this.companyInfoHtml();\n this.container.innerHTML += `
`;\n }\n\n companyInfoHtml() {\n return `\n
\n
\n
\n \"${this.logoAlt}\"\n
\n
${this.logoAlt}
\n
\n
\n Privacy\n ·\n Terms\n
\n
\n `;\n }\n\n showContainer() {\n this.container.style.display = 'block';\n }\n\n hideContainer() {\n this.container.style.display = 'none';\n }\n\n /**\n * Create and add styles\n */\n addStyles() {\n const style = document.createElement('style');\n\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n\n .ct-browser-check-container {\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 365px;\n height: 70px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n }\n `;\n\n document.head.appendChild(style);\n }\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n console.log('DOMContentLoaded');\n const apbctBrowserCheck = new ctBrowserCheck();\n console.log(apbctBrowserCheck);\n apbctBrowserCheck.render();\n});\n// document.addEventListener('DOMContentLoaded', function() {\n// loaderContainer.className = 'ct-browser-check-container';\n// let startTime = null;\n// let timeoutToShowResult = 3000;\n\n// document.addEventListener('ctBotDetectorStart', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// showSavedResult();\n// return;\n// }\n\n// loaderContainer.style.display = 'block';\n// startTime = new Date();\n// });\n\n// document.addEventListener('ctBotDetectorEnd', function() {\n// console.log('ctBotDetectorEnd');\n// });\n\n// document.addEventListener('ctBotDetectorResult', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// return;\n// }\n\n// if (startTime && new Date() - startTime < timeoutToShowResult) {\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult - (new Date() - startTime));\n// return;\n// }\n\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult);\n// });\n\n// function showSavedResult() {\n// const result = localStorage.getItem('ct-browser-check-result');\n// if (result === 'human') {\n// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person';\n// }\n// }\n\n// /**\n// * Show result\n// */\n// function showResult() {\n// // let results = ['bot', 'human'];\n// let results = ['human'];\n// let result = results[Math.floor(Math.random() * results.length)];\n// // store result in local storage\n// localStorage.setItem('ct-browser-check-result', result);\n\n// if (document.querySelector('.ct-browser-check-loader')) {\n// document.querySelector('.ct-browser-check-loader').remove();\n// }\n// if (document.querySelector('.ct-browser-check-description')) {\n// document.querySelector('.ct-browser-check-description').remove();\n// }\n// document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n// // prepare data\n// let title = 'botDetector';\n// let svg = '';\n// let arrowAction = '';\n// switch (result) {\n// case 'bot':\n// console.log('bot');\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// break;\n// case 'human':\n// console.log('human');\n// title = 'The Real Person';\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n// break;\n// }\n// document.querySelector('.ct-browser-check-title').textContent = title;\n// const dev = document.createElement('div');\n// dev.className = 'ct-browser-check-human';\n// dev.innerHTML = `\n// ${svg}\n// >\n// `;\n// loaderContainer.appendChild(dev);\n// }\n\n\n// document.addEventListener('ctBotDetectorError', function() {\n// console.log('ctBotDetectorError');\n// });\n\n\n// // add div with title\n// const title = document.createElement('div');\n// title.className = 'ct-browser-check-title';\n// title.style.cssText = `\n// border-bottom: 1px solid #bbbbbb;\n// `;\n// title.textContent = 'botDetector';\n// loaderContainer.appendChild(title);\n\n// // Create loader element\n// const loader = document.createElement('div');\n// loader.className = 'ct-browser-check-loader';\n\n// // Add loader to container and container to body\n// loaderContainer.appendChild(loader);\n// document.body.appendChild(loaderContainer);\n\n// // add div with description\n// const description = document.createElement('div');\n// description.className = 'ct-browser-check-description';\n// description.style.cssText = `\n// border-top: 1px solid #bbbbbb;\n// `;\n// description.textContent = 'Browser check';\n// loaderContainer.appendChild(description);\n// });\n\n// /**\n// * Hide browser check\n// * eslint-disable-next-line no-unused-vars\n// */\n// function ctBrowserCheckHide() {\n// document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n// loaderContainer.style.right = '-70px';\n// loaderContainer.style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.width = '40px';\n// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n// }\n"],"file":"apbct-public--8--browser-check.min.js"} \ No newline at end of file diff --git a/js/apbct-public-bundle.min.js b/js/apbct-public-bundle.min.js index 3d77c9c2a..9c3e4addb 100644 --- a/js/apbct-public-bundle.min.js +++ b/js/apbct-public-bundle.min.js @@ -1 +1,4729 @@ -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 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)})}))});var loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}function apbctSetEmailDecoderPopupAnimation(){var e=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],t=document.createElement("div");t.classList="apbct-ee-animation-wrapper";for(var o=0;o{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("DOMContentLoaded",function(){loaderContainer.className="ct-browser-check-container";var e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)],t=(document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px","botDetector"),o="",n="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',n=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML="\n ".concat(o,'\n >\n "),loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(function(){t()},3e3-(new Date-e)):setTimeout(function(){t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent='\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: ""; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n ',document.head.appendChild(o),loaderContainer.style.cssText="\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n ",document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText="\n border-bottom: 1px solid #bbbbbb;\n ",o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText="\n border-top: 1px solid #bbbbbb;\n ",o.textContent="Browser check",loaderContainer.appendChild(o)}); \ No newline at end of file +"use strict"; + +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } +function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +/** + * Base class + */ +var ApbctCore = /*#__PURE__*/function () { + /** + * Default constructor + * @param {string} selector + */ + function ApbctCore(selector) { + _classCallCheck(this, ApbctCore); + _defineProperty(this, "ajax_parameters", {}); + _defineProperty(this, "restParameters", {}); + _defineProperty(this, "selector", null); + _defineProperty(this, "elements", []); + // Event properties + _defineProperty(this, "eventCallback", void 0); + _defineProperty(this, "eventSelector", void 0); + _defineProperty(this, "event", void 0); + this.select(selector); + } + + /** + * Get elements by CSS selector + * + * @param {string} selector + * @return {*} + */ + return _createClass(ApbctCore, [{ + key: "select", + value: function 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 + */ + }, { + key: "addElement", + value: function 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 + */ + }, { + key: "push", + value: function push(elem) { + this.elements.push(elem); + } + + /** + * reduce + */ + }, { + key: "reduce", + value: function reduce() { + this.elements = this.elements.slice(0, -1); + } + + /** + * deselect + */ + }, { + key: "deselect", + value: function deselect() { + this.elements = []; + } + + /** + * Set or get CSS for/of currently selected element + * + * @param {object|string} style + * @param {boolean} getRaw + * + * @return {boolean|*} + */ + }, { + key: "css", + value: function css(style, getRaw) { + getRaw = getRaw || false; + + // Set style + if (_typeof(style) === 'object') { + var stringToCamelCase = function stringToCamelCase(str) { + return str.replace(/([-_][a-z])/g, function (group) { + return group.toUpperCase().replace('-', '').replace('_', ''); + }); + }; + + // Apply multiple styles + for (var styleName in style) { + if (Object.hasOwn(style, styleName)) { + var DomStyleName = stringToCamelCase(styleName); + + // Apply to multiple elements (currently selected) + for (var i = 0; i < this.elements.length; i++) { + this.elements[i].style[DomStyleName] = style[styleName]; + } + } + } + return this; + } + + // Get style of first currently selected element + if (typeof style === 'string') { + var computedStyle = getComputedStyle(this.elements[0])[style]; + + // Process + if (typeof computedStyle !== 'undefined' && !getRaw) { + // Cut of units + computedStyle = computedStyle.replace(/(\d)(em|pt|%|px){1,2}$/, '$1'); + // Cast to INT + computedStyle = Number(computedStyle) == computedStyle ? Number(computedStyle) : computedStyle; + return computedStyle; + } + + // Return unprocessed + return computedStyle; + } + } + + /** + * hide + */ + }, { + key: "hide", + value: function hide() { + this.prop('prev-display', this.css('display')); + this.css({ + 'display': 'none' + }); + } + + /** + * show + */ + }, { + key: "show", + value: function show() { + this.css({ + 'display': this.prop('prev-display') + }); + } + + /** + * addClass + */ + }, { + key: "addClass", + value: function addClass() { + for (var i = 0; i < this.elements.length; i++) { + this.elements[i].classList.add(className); + } + } + + /** + * removeClass + */ + }, { + key: "removeClass", + value: function removeClass() { + for (var i = 0; i < this.elements.length; i++) { + this.elements[i].classList.remove(className); + } + } + + /** + * @param {string} className + */ + }, { + key: "toggleClass", + value: function toggleClass(className) { + for (var i = 0; i < this.elements.length; i++) { + this.elements[i].classList.toggle(className); + } + } + + /** + * Wrapper for apbctAJAX class + * + * @param {object|array} ajaxParameters + * @return {ApbctAjax} + */ + }, { + key: "ajax", + value: function ajax(ajaxParameters) { + this.ajax_parameters = ajaxParameters; + return new ApbctAjax(ajaxParameters); + } + + /** + * Wrapper for apbctREST class + * + * @param {object|array} restParameters + * @return {ApbctRest} + */ + }, { + key: "rest", + value: function rest(restParameters) { + this.restParameters = restParameters; + return new ApbctRest(restParameters); + } + + /** + * ************ EVENTS ************* + */ + + /** + * + * Why the mess with arguments? + * + * Because we need to support the following function signatures: + * on('click', function(){ alert('some'); }); + * on('click', 'inner_selector', function(){ alert('some'); }); + * + * @param {object|array} args + */ + }, { + key: "on", + value: function on() { + this.event = arguments.length <= 0 ? undefined : arguments[0]; + this.eventCallback = (arguments.length <= 2 ? undefined : arguments[2]) || (arguments.length <= 1 ? undefined : arguments[1]); + this.eventSelector = typeof (arguments.length <= 1 ? undefined : arguments[1]) === 'string' ? arguments.length <= 1 ? undefined : arguments[1] : null; + for (var i = 0; i < this.elements.length; i++) { + this.elements[i].addEventListener(this.event, this.eventSelector !== null ? this.onChecker.bind(this) : this.eventCallback); + } + } + + /** + * Check if a selector of an event matches current target + * + * @param {object} event + * @return {*} + */ + }, { + key: "onChecker", + value: function onChecker(event) { + if (event.target === document.querySelector(this.eventSelector)) { + event.stopPropagation(); + return this.eventCallback(event); + } + } + + /** + * @param {object|function|string} callback + */ + }, { + key: "ready", + value: function ready(callback) { + document.addEventListener('DOMContentLoaded', callback); + } + + /** + * @param {object|function|string} callback + */ + }, { + key: "change", + value: function change(callback) { + this.on('change', callback); + } + + /** + * ATTRIBUTES + */ + + /** + * Get an attribute or property of an element + * + * @param {string} attrName + * @return {*|*[]} + */ + }, { + key: "attr", + value: function attr(attrName) { + var outputValue = []; + for (var i = 0; i < this.elements.length; i++) { + // Use property instead of attribute if possible + if (typeof this.elements[i][attrName] !== 'undefined') { + outputValue.push(this.elements[i][attrName]); + } else { + outputValue.push(this.elements[i].getAttribute(attrName)); + } + } + + // Return a single value instead of array if only one value is present + return outputValue.length === 1 ? outputValue[0] : outputValue; + } + + /** + * @param {string} propName + * @param {mixed} value + * @return {*|*[]|ApbctCore} + */ + }, { + key: "prop", + value: function prop(propName, value) { + // Setting values + if (typeof value !== 'undefined') { + for (var i = 0; i < this.elements.length; i++) { + this.elements[i][propName] = value; + } + return this; + + // Getting values + } else { + var outputValue = []; + for (var _i = 0; _i < this.elements.length; _i++) { + outputValue.push(this.elements[_i][propName]); + } + + // Return a single value instead of array if only one value is present + return outputValue.length === 1 ? outputValue[0] : outputValue; + } + } + + /** + * Set or get inner HTML + * + * @param {string} value + * @return {*|*[]} + */ + }, { + key: "html", + value: function html(value) { + return typeof value !== 'undefined' ? this.prop('innerHTML', value) : this.prop('innerHTML'); + } + + /** + * Set or get value of input tags + * + * @param {mixed} value + * @return {*|*[]|undefined} + */ + }, { + key: "val", + value: function val(value) { + return typeof value !== 'undefined' ? this.prop('value', value) : this.prop('value'); + } + + /** + * @param {string} name + * @param {mixed} value + * @return {*|*[]|ApbctCore} + */ + }, { + key: "data", + value: function data(name, value) { + return typeof value !== 'undefined' ? this.prop('apbct-data', name, value) : this.prop('apbct-data'); + } + + /** + * END OF ATTRIBUTES + */ + + /** + * FILTERS + */ + + /** + * Check if the current elements are corresponding to filter + * + * @param {mixed} filter + * @return {boolean} + */ + }, { + key: "is", + value: function is(filter) { + var outputValue = false; + var _iterator = _createForOfIteratorHelper(this.elements), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var elem = _step.value; + outputValue || (outputValue = this.isElem(elem, filter)); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + return outputValue; + } + + /** + * @param {string|object} elemToCheck + * @param {mixed} filter + * @return {boolean} + */ + }, { + key: "isElem", + value: function isElem(elemToCheck, filter) { + var is = false; + var isRegisteredTagName = function isRegisteredTagName(name) { + var newlyCreatedElement = document.createElement(name).constructor; + return !Boolean(~[HTMLElement, HTMLUnknownElement].indexOf(newlyCreatedElement)); + }; + + // Check for filter function + if (typeof filter === 'function') { + is || (is = filter.call(this, elemToCheck)); + } + + // Check for filter function + if (typeof filter === 'string') { + // Filter is tag name + if (filter.match(/^[a-z]/) && isRegisteredTagName(filter)) { + is || (is = elemToCheck.tagName.toLowerCase() === filter.toLowerCase()); + + // Filter is property + } else if (filter.match(/^[a-z]/)) { + is || (is = Boolean(elemToCheck[filter])); + + // Filter is CSS selector + } else { + is || (is = this.selector !== null ? document.querySelector(this.selector + filter) !== null : + // If possible + this.isWithoutSelector(elemToCheck, filter)); // Search through all elems with such selector + } + } + return is; + } + + /** + * @param {object|string} elemToCheck + * @param {mixed} filter + * @return {boolean} + */ + }, { + key: "isWithoutSelector", + value: function isWithoutSelector(elemToCheck, filter) { + var elems = document.querySelectorAll(filter); + var outputValue = false; + var _iterator2 = _createForOfIteratorHelper(elems), + _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var elem = _step2.value; + outputValue || (outputValue = elemToCheck === elem); + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + return outputValue; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + }, { + key: "filter", + value: function filter(_filter) { + this.selector = null; + for (var i = this.elements.length - 1; i >= 0; i--) { + if (!this.isElem(this.elements[i], _filter)) { + this.elements.splice(Number(i), 1); + } + } + return this; + } + + /** + * NODES + */ + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + }, { + key: "parent", + value: function parent(filter) { + this.select(this.elements[0].parentElement); + if (typeof filter !== 'undefined' && !this.is(filter)) { + this.deselect(); + } + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + }, { + key: "parents", + value: function 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} + */ + }, { + key: "children", + value: function children(filter) { + this.select(this.elements[0].children); + if (typeof filter !== 'undefined') { + this.filter(filter); + } + return this; + } + + /** + * @param {mixed} filter + * @return {ApbctCore} + */ + }, { + key: "siblings", + value: function siblings(filter) { + var 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 **************/ + }, { + key: "remove", + value: function remove() { + var _iterator3 = _createForOfIteratorHelper(this.elements), + _step3; + try { + for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { + var elem = _step3.value; + elem.remove(); + } + } catch (err) { + _iterator3.e(err); + } finally { + _iterator3.f(); + } + } + + /** + * @param {string} content + */ + }, { + key: "after", + value: function after(content) { + var _iterator4 = _createForOfIteratorHelper(this.elements), + _step4; + try { + for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { + var elem = _step4.value; + elem.after(content); + } + } catch (err) { + _iterator4.e(err); + } finally { + _iterator4.f(); + } + } + + /** + * @param {string} content + */ + }, { + key: "append", + value: function append(content) { + var _iterator5 = _createForOfIteratorHelper(this.elements), + _step5; + try { + for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { + var elem = _step5.value; + elem.append(content); + } + } catch (err) { + _iterator5.e(err); + } finally { + _iterator5.f(); + } + } + + /** ************ ANIMATION **************/ + /** + * @param {number} time + */ + }, { + key: "fadeIn", + value: function fadeIn(time) { + var _iterator6 = _createForOfIteratorHelper(this.elements), + _step6; + try { + var _loop = function _loop() { + var elem = _step6.value; + elem.style.opacity = 0; + elem.style.display = 'block'; + var last = +new Date(); + var _tick = function tick() { + 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(); + }; + for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { + _loop(); + } + } catch (err) { + _iterator6.e(err); + } finally { + _iterator6.f(); + } + } + + /** + * @param {number} time + */ + }, { + key: "fadeOut", + value: function fadeOut(time) { + var _iterator7 = _createForOfIteratorHelper(this.elements), + _step7; + try { + var _loop2 = function _loop2() { + var elem = _step7.value; + elem.style.opacity = 1; + var last = +new Date(); + var _tick2 = function tick() { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / time; + last = +new Date(); + if (+elem.style.opacity > 0) { + window.requestAnimationFrame && requestAnimationFrame(_tick2) || setTimeout(_tick2, 16); + } else { + elem.style.display = 'none'; + } + }; + _tick2(); + }; + for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { + _loop2(); + } + } catch (err) { + _iterator7.e(err); + } finally { + _iterator7.f(); + } + } + }]); +}(); +/** + * 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) { + var 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; + var ctJsErrors = 'ct_js_errors'; + var errArray = localStorage.getItem(ctJsErrors); + if (errArray === null) errArray = '[]'; + errArray = JSON.parse(errArray); + for (var 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) { + var filterWords = ['apbct', 'ctPublic']; + var 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() { + var 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 + */ +var ApbctXhr = /*#__PURE__*/function () { + // eslint-disable-next-line require-jsdoc + function ApbctXhr(parameters) { + _classCallCheck(this, ApbctXhr); + _defineProperty(this, "xhr", new XMLHttpRequest()); + // Base parameters + _defineProperty(this, "method", 'POST'); + // HTTP-request type + _defineProperty(this, "url", ''); + // URL to send the request + _defineProperty(this, "async", true); + _defineProperty(this, "user", null); + // HTTP-authorization username + _defineProperty(this, "password", null); + // HTTP-authorization password + _defineProperty(this, "data", {}); + // Data to send + // Optional params + _defineProperty(this, "button", null); + // Button that should be disabled when request is performing + _defineProperty(this, "spinner", null); + // Spinner that should appear when request is in process + _defineProperty(this, "progressbar", null); + // Progress bar for the current request + _defineProperty(this, "context", this); + // Context + _defineProperty(this, "callback", null); + _defineProperty(this, "onErrorCallback", null); + _defineProperty(this, "responseType", 'json'); + // Expected data type from server + _defineProperty(this, "headers", {}); + _defineProperty(this, "timeout", 15000); + // Request timeout in milliseconds + _defineProperty(this, "methods_to_convert_data_to_URL", ['GET', 'HEAD']); + _defineProperty(this, "body", null); + _defineProperty(this, "http_code", 0); + _defineProperty(this, "status_text", ''); + // Set class properties + for (var 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 + */ + return _createClass(ApbctXhr, [{ + key: "prepare", + value: function 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 + */ + }, { + key: "complete", + value: function 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 + */ + }, { + key: "onReadyStateChange", + value: function onReadyStateChange() { + if (this.on_ready_state_change !== null && typeof this.on_ready_state_change === 'function') { + this.on_ready_state_change(); + } + } + + /** + * @param {object} event + */ + }, { + key: "onProgress", + value: function onProgress(event) { + if (this.on_progress !== null && typeof this.on_progress === 'function') { + this.on_progress(); + } + } + + /** + * onError + */ + }, { + key: "onError", + value: function 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 + */ + }, { + key: "onTimeout", + value: function onTimeout() { + this.complete(); + this.error(0, 'timeout'); + if (this.onErrorCallback !== null && typeof this.onErrorCallback === 'function') { + this.onErrorCallback('Timeout'); + } + } + + /** + * @return {boolean} + */ + }, { + key: "onLoad", + value: function 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} + */ + }, { + key: "isWpNonceError", + value: function isWpNonceError() { + var restErrror = false; + var 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 + */ + }, { + key: "getFreshNonceAndRerunXHR", + value: function getFreshNonceAndRerunXHR(initialRequestParams) { + var 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 + var 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 () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + // the refresh result itself + var freshNonceResult = args[0]; + var 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 + */ + }, { + key: "error", + value: function error(httpCode, statusText, additionalMsg) { + var 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 + */ + }, { + key: "errorOutput", + value: function errorOutput(errorMsg) { + console.log('%c ctXHR error: %c' + errorMsg, 'color: red;', 'color: grey;'); + } + + /** + * setHeaders + */ + }, { + key: "setHeaders", + value: function setHeaders() { + // Set headers if passed + for (var headerName in this.headers) { + if (typeof this.headers[headerName] !== 'undefined') { + this.xhr.setRequestHeader(headerName, this.headers[headerName]); + } + } + } + + /** + * @return {string|*} + */ + }, { + key: "convertData", + value: function 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} + */ + }, { + key: "convertDataToURL", + value: function convertDataToURL() { + var paramsAppendix = new URLSearchParams(this.data).toString(); + var paramsPrefix = this.url.match(/^(https?:\/{2})?[a-z0-9.]+\?/) ? '&' : '?'; + this.url += paramsPrefix + paramsAppendix; + return this.url; + } + + /** + * @return {null} + */ + }, { + key: "convertDataToBody", + value: function convertDataToBody() { + this.body = new FormData(); + for (var 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 {*} + */ + }, { + key: "deleteDoubleJSONEncoding", + value: function deleteDoubleJSONEncoding(object) { + if (_typeof(object) === 'object') { + for (var 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 + ) { + var parsedValue = JSON.parse(object[objectKey]); + if (_typeof(parsedValue) === 'object') { + object[objectKey] = parsedValue; + } + } + } + } + } + return object; + } + }]); +}(); // eslint-disable-next-line require-jsdoc +var ApbctAjax = /*#__PURE__*/function (_ApbctXhr2) { + // eslint-disable-next-line require-jsdoc + function ApbctAjax() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + _classCallCheck(this, ApbctAjax); + args = args[0]; + args.data._ajax_nonce = selectActualNonce(); + return _callSuper(this, ApbctAjax, [args]); + } + _inherits(ApbctAjax, _ApbctXhr2); + return _createClass(ApbctAjax); +}(ApbctXhr); // eslint-disable-next-line require-jsdoc +var ApbctRest = /*#__PURE__*/function (_ApbctXhr3) { + // eslint-disable-next-line require-jsdoc + function ApbctRest() { + var _this; + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + _classCallCheck(this, ApbctRest); + args = args[0]; + var nonce = selectActualNonce(); + args.url = ApbctRest.default_route + args.route; + args.headers = { + 'X-WP-Nonce': nonce + }; + _this = _callSuper(this, ApbctRest, [args]); + _defineProperty(_this, "route", ''); + return _this; + } + _inherits(ApbctRest, _ApbctXhr3); + return _createClass(ApbctRest); +}(ApbctXhr); // add hasOwn +_defineProperty(ApbctRest, "default_route", ctPublicFunctions._rest_url + 'cleantalk-antispam/v1/'); +if (!Object.prototype.hasOwn) { + Object.defineProperty(Object.prototype, 'hasOwn', { + // eslint-disable-line + value: function value(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 +var ApbctCollectingUserActivity = /*#__PURE__*/function () { + /** + * Constructor + */ + function ApbctCollectingUserActivity() { + _classCallCheck(this, ApbctCollectingUserActivity); + _defineProperty(this, "elementBody", document.querySelector('body')); + _defineProperty(this, "collectionForms", document.forms); + this.setListeners(); + } + + /** + * Set listeners + */ + return _createClass(ApbctCollectingUserActivity, [{ + key: "setListeners", + value: function setListeners() { + var _this2 = this; + this.elementBody.addEventListener('click', function (event) { + _this2.checkElementInForms(event, 'addClicks'); + }); + this.elementBody.addEventListener('mouseup', function (event) { + var selectedType = document.getSelection().type.toString(); + if (selectedType == 'Range') { + _this2.addSelected(); + } + }); + this.elementBody.addEventListener('mousemove', function (event) { + _this2.checkElementInForms(event, 'trackMouseMovement'); + }); + } + + /** + * Checking if there is an element in the form + * @param {object} event + * @param {string} addTarget + */ + }, { + key: "checkElementInForms", + value: function checkElementInForms(event, addTarget) { + var resultCheck; + for (var 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 + */ + }, { + key: "addClicks", + value: function addClicks() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.clicks) { + document.ctCollectingUserActivityData.clicks++; + } else { + document.ctCollectingUserActivityData.clicks = 1; + } + return; + } + document.ctCollectingUserActivityData = { + clicks: 1 + }; + } + + /** + * Add selected + */ + }, { + key: "addSelected", + value: function addSelected() { + if (document.ctCollectingUserActivityData) { + if (document.ctCollectingUserActivityData.selected) { + document.ctCollectingUserActivityData.selected++; + } else { + document.ctCollectingUserActivityData.selected = 1; + } + return; + } + document.ctCollectingUserActivityData = { + selected: 1 + }; + } + + /** + * Track mouse movement + */ + }, { + key: "trackMouseMovement", + value: function 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) { + var 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']; + var 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') { + var 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) { + var _expires = typeof item[2] !== 'undefined' ? 'expires=' + expires + '; ' : ''; + var 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() { + var ninjaFormsSign = document.querySelectorAll('#tmpl-nf-layout').length > 0; + var elementorUltimateAddonsRegister = document.querySelectorAll('.uael-registration-form-wrapper').length > 0; + var smartFormsSign = document.querySelectorAll('script[id*="smart-forms"]').length > 0; + var jetpackCommentsForm = document.querySelectorAll('iframe[name="jetpack_remote_comment"]').length > 0; + var cwginstockForm = document.querySelectorAll('.cwginstock-subscribe-form').length > 0; + var userRegistrationProForm = document.querySelectorAll('div[id^="user-registration-form"]').length > 0; + var etPbDiviSubscriptionForm = document.querySelectorAll('div[class^="et_pb_newsletter_form"]').length > 0; + var fluentBookingApp = document.querySelectorAll('div[class^="fluent_booking_app"]').length > 0; + var bloomPopup = document.querySelectorAll('div[class^="et_bloom_form_container"]').length > 0; + var pafeFormsFormElementor = document.querySelectorAll('div[class*="pafe-form"]').length > 0; + var otterForm = document.querySelectorAll('div [class*="otter-form"]').length > 0; + var 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) { + var 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; + } + var callback = params && params.callback || null; + var 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); + } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); + apbct_public_sendREST('alt_sessions', { + method: 'POST', + data: { + cookies: cookies + }, + callback: callback, + onErrorCallback: onErrorCallback + }); + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); + // 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 beforeSend(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) { + var 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') { + var 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 + var _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; + var 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) { + var _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); +} +var apbctLocalStorage = { + get: function get(key, property) { + if (typeof property === 'undefined') { + property = 'value'; + } + var storageValue = localStorage.getItem(key); + if (storageValue !== null) { + try { + var 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 set(key, value) { + var isJson = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + if (isJson) { + var 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 isAlive(key, maxLifetime) { + if (typeof maxLifetime === 'undefined') { + maxLifetime = 86400; + } + var keyTimestamp = this.get(key, 'timestamp'); + return keyTimestamp + maxLifetime > Math.floor(new Date().getTime() / 1000); + }, + isSet: function isSet(key) { + return localStorage.getItem(key) !== null; + }, + delete: function _delete(key) { + localStorage.removeItem(key); + }, + getCleanTalkData: function getCleanTalkData() { + var data = {}; + for (var i = 0; i < localStorage.length; i++) { + var key = localStorage.key(i); + if (key.indexOf('ct_') !== -1 || key.indexOf('apbct_') !== -1) { + data[key.toString()] = apbctLocalStorage.get(key); + } + } + return data; + } +}; +var apbctSessionStorage = { + get: function get(key, property) { + if (typeof property === 'undefined') { + property = 'value'; + } + var storageValue = sessionStorage.getItem(key); + if (storageValue !== null) { + try { + var json = JSON.parse(storageValue); + return json.hasOwnProperty(property) ? JSON.parse(json[property]) : json; + } catch (e) { + return storageValue; + } + } + return false; + }, + set: function set(key, value) { + var isJson = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + if (isJson) { + var objToSave = { + 'value': JSON.stringify(value), + 'timestamp': Math.floor(new Date().getTime() / 1000) + }; + sessionStorage.setItem(key, JSON.stringify(objToSave)); + } else { + sessionStorage.setItem(key, value); + } + }, + isSet: function isSet(key) { + return sessionStorage.getItem(key) !== null; + }, + delete: function _delete(key) { + sessionStorage.removeItem(key); + }, + getCleanTalkData: function getCleanTalkData() { + var data = {}; + for (var i = 0; i < sessionStorage.length; i++) { + var key = sessionStorage.key(i); + if (key.indexOf('ct_') !== -1 || key.indexOf('apbct_') !== -1) { + data[key.toString()] = apbctSessionStorage.get(key); + } + } + return data; + } +}; + +/** + * Handler for -webkit based browser that listen for a custom + * animation create using the :pseudo-selector in the stylesheet. + * Works with Chrome, Safari + * + * @param {AnimationEvent} event + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function apbctOnAnimationStart(event) { + 'onautofillstart' === event.animationName ? apbctAutocomplete(event.target) : apbctCancelAutocomplete(event.target); +} + +/** + * Handler for non-webkit based browser that listen for input + * event to trigger the autocomplete-cancel process. + * Works with Firefox, Edge, IE11 + * + * @param {InputEvent} event + */ +// eslint-disable-next-line no-unused-vars,require-jsdoc +function apbctOnInput(event) { + 'insertReplacementText' === event.inputType || !('data' in event) ? apbctAutocomplete(event.target) : apbctCancelAutocomplete(event.target); +} + +/** + * Manage an input element when its value is autocompleted + * by the browser in the following steps: + * - add [autocompleted] attribute from event.target + * - create 'onautocomplete' cancelable CustomEvent + * - dispatch the Event + * + * @param {HtmlInputElement} element + */ +function apbctAutocomplete(element) { + if (element.hasAttribute('autocompleted')) return; + element.setAttribute('autocompleted', ''); + var event = new window.CustomEvent('onautocomplete', { + bubbles: true, + cancelable: true, + detail: null + }); + + // no autofill if preventDefault is called + if (!element.dispatchEvent(event)) { + element.value = ''; + } +} + +/** + * Manage an input element when its autocompleted value is + * removed by the browser in the following steps: + * - remove [autocompleted] attribute from event.target + * - create 'onautocomplete' non-cancelable CustomEvent + * - dispatch the Event + * + * @param {HtmlInputElement} element + */ +function apbctCancelAutocomplete(element) { + if (!element.hasAttribute('autocompleted')) return; + element.removeAttribute('autocompleted'); + + // dispatch event + element.dispatchEvent(new window.CustomEvent('onautocomplete', { + bubbles: true, + cancelable: false, + detail: null + })); +} + +/** + * ApbctForceProtection + */ +var ApbctForceProtection = /*#__PURE__*/function () { + /** + * Constructor + */ + function ApbctForceProtection() { + _classCallCheck(this, ApbctForceProtection); + _defineProperty(this, "wrappers", []); + this.wrappers = this.findWrappers(); + if (this.wrappers.length < 1) { + return; + } + this.checkBot(); + } + + /** + * Find wrappers + * @return {HTMLElement[]} + */ + return _createClass(ApbctForceProtection, [{ + key: "findWrappers", + value: function findWrappers() { + return document.querySelectorAll('div.ct-encoded-form-wrapper'); + } + + /** + * Check bot + * @return {void} + */ + }, { + key: "checkBot", + value: function checkBot() { + var _this3 = this; + var data = { + event_javascript_data: getJavascriptClientData(), + post_url: document.location.href, + referrer: document.referrer + }; + if (ctPublicFunctions.data__ajax_type === 'rest') { + apbct_public_sendREST('force_protection_check_bot', { + data: data, + method: 'POST', + callback: function callback(result) { + return _this3.checkBotCallback(result); + } + }); + } else if (ctPublicFunctions.data__ajax_type === 'admin_ajax') { + data.action = 'apbct_force_protection_check_bot'; + apbct_public_sendAJAX(data, { + callback: function callback(result) { + return _this3.checkBotCallback(result); + } + }); + } + } + + /** + * Check bot callback + * @param {Object} result + * @return {void} + */ + }, { + key: "checkBotCallback", + value: function 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} + */ + }, { + key: "decodeForms", + value: function decodeForms() { + var form; + this.wrappers.forEach(function (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} + */ + }, { + key: "showMessageForBot", + value: function showMessageForBot(message) { + var form; + this.wrappers.forEach(function (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 +var CTTypoData = /*#__PURE__*/function () { + function CTTypoData() { + _classCallCheck(this, CTTypoData); + _defineProperty(this, "fieldData", { + isAutoFill: false, + isUseBuffer: false, + speedDelta: 0, + firstKeyTimestamp: 0, + lastKeyTimestamp: 0, + lastDelta: 0, + countOfKey: 0 + }); + _defineProperty(this, "fields", document.querySelectorAll('textarea[name=comment]')); + _defineProperty(this, "data", []); + } + return _createClass(CTTypoData, [{ + key: "gatheringFields", + value: + /** + * Gather fields. + */ + function gatheringFields() { + var _this4 = this; + var fieldSet = Array.prototype.slice.call(this.fields); + fieldSet.forEach(function (field, i) { + _this4.data.push(Object.assign({}, _this4.fieldData)); + }); + } + + /** + * Set listeners. + */ + }, { + key: "setListeners", + value: function setListeners() { + var _this5 = this; + this.fields.forEach(function (field, i) { + field.addEventListener('paste', function () { + _this5.data[i].isUseBuffer = true; + }); + }); + this.fields.forEach(function (field, i) { + field.addEventListener('onautocomplete', function () { + _this5.data[i].isAutoFill = true; + }); + }); + this.fields.forEach(function (field, i) { + field.addEventListener('input', function () { + _this5.data[i].countOfKey++; + var time = +new Date(); + var currentDelta = 0; + if (_this5.data[i].countOfKey === 1) { + _this5.data[i].lastKeyTimestamp = time; + _this5.data[i].firstKeyTimestamp = time; + return; + } + currentDelta = time - _this5.data[i].lastKeyTimestamp; + if (_this5.data[i].countOfKey === 2) { + _this5.data[i].lastKeyTimestamp = time; + _this5.data[i].lastDelta = currentDelta; + return; + } + if (_this5.data[i].countOfKey > 2) { + _this5.data[i].speedDelta += Math.abs(_this5.data[i].lastDelta - currentDelta); + _this5.data[i].lastKeyTimestamp = time; + _this5.data[i].lastDelta = currentDelta; + } + }); + }); + } + }]); +}(); // eslint-disable-next-line camelcase +var ctDate = new Date(); +var ctTimeMs = new Date().getTime(); +var ctMouseEventTimerFlag = true; // Reading interval flag +var ctMouseData = []; +var ctMouseDataCounter = 0; +var ctCheckedEmails = {}; +var ctCheckedEmailsExist = {}; +var ctMouseReadInterval; +var ctMouseWriteDataInterval; +var tokenCheckerIntervalId; +var botDetectorLogLastUpdate = 0; +var 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 +var ctFunctionFirstKey = function output(event) { + var 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 +var 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() { + var cronStartTimeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 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() { + var cronStartTimeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3000; + var interval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000; + setTimeout(function () { + setInterval(function () { + var 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 (var i = 0; i < currentLog.records.length; i++) { + var 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 + var 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 + var 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) { + var 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 callback(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 callback(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) { + var currentEmail = e.target.value; + var result; + if (!currentEmail || !currentEmail.length) { + var envelope = document.getElementById('apbct-check_email_exist-block'); + if (envelope) { + envelope.remove(); + } + var 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 callback(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 callback(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) { + var parentElement = e.target.parentElement; + var inputEmail = parentElement.querySelector('[name*="email"]'); + if (!inputEmail) { + return; + } + var envelope; + var 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() { + var envelopeWidth = 35; + var inputEmail = document.querySelector('comment-form input[name*="email"], input#email'); + if (!inputEmail) { + return; + } + var 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'; + } + var 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')) { + var 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')) { + var 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 + var 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 callback(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 callback(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 beforeSend(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; + } + var forms = ctGetPageForms(); + ctPublic.handled_fields = []; + if (forms.length > 0) { + for (var i = 0; i < forms.length; i++) { + // handle only inputs and textareas + var handledFormFields = forms[i].querySelectorAll('input,textarea'); + for (var _i2 = 0; _i2 < handledFormFields.length; _i2++) { + if (handledFormFields[_i2].type !== 'hidden') { + // collect handled fields to remove handler in the future + ctPublic.handled_fields.push(handledFormFields[_i2]); + // do attach handlers + apbct_attach_event_handler(handledFormFields[_i2], 'focus', ctFunctionHasInputFocused); + apbct_attach_event_handler(handledFormFields[_i2], '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 (var i = 0; i < ctPublic.handled_fields.length; i++) { + apbct_remove_event_handler(ctPublic.handled_fields[i], eventName, functionName); + } + } +} +var ctFunctionHasInputFocused = function output(event) { + ctSetHasInputFocused(); + ctStopFieldsListening('focus', ctFunctionHasInputFocused); +}; +var 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; + } + var 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')) { + var sessionID = apbctGenerateUniqueID(); + apbctSessionStorage.set('apbct_session_id', sessionID, false); + apbctLocalStorage.set('apbct_page_hits', 1); + if (document.referrer) { + var 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(); + var 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 + var 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 + var cookiesArray = document.cookie.split(';'); + if (cookiesArray.length !== 0) { + for (var i = 0; i < cookiesArray.length; i++) { + var currentCookie = cookiesArray[i].trim(); + var 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 + var 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 (var _i3 = 0; _i3 < document.forms.length; _i3++) { + var form = document.forms[_i3]; + + // Exclusion for forms + if (ctCheckHiddenFieldsExclusions(document.forms[_i3], '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[_i3].elements.apbct_visible_fields !== undefined && document.forms[_i3].elements.apbct_visible_fields.length > 0) { + continue; + } + if (form.querySelector('input[name="apbct_visible_fields"]')) { + var visibleFields = form.querySelector('input[name="apbct_visible_fields"]'); + form.removeChild(visibleFields); + } + var hiddenInput = document.createElement('input'); + hiddenInput.setAttribute('type', 'hidden'); + hiddenInput.setAttribute('id', 'apbct_visible_fields_' + _i3); + hiddenInput.setAttribute('name', 'apbct_visible_fields'); + var visibleFieldsToInput = {}; + visibleFieldsToInput[0] = apbct_collect_visible_fields(form); + hiddenInput.value = btoa(JSON.stringify(visibleFieldsToInput)); + form.append(hiddenInput); + form.onsubmit_prev = form.onsubmit; + form.ctFormIndex = _i3; + 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) { + var noCookieData = getNoCookieData(); + noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + noCookieData + '&'; + defaultSend.call(this, noCookieData + data); + setTimeout(function () { + 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 + var encodedEmailNodes = document.querySelectorAll('[data-original-string]'); + ctPublic.encodedEmailNodes = encodedEmailNodes; + if (encodedEmailNodes.length) { + for (var _i4 = 0; _i4 < encodedEmailNodes.length; ++_i4) { + encodedEmailNodes[_i4].addEventListener('click', ctFillDecodedEmailHandler); + } + } + + // WordPress Search form processing + var _iterator8 = _createForOfIteratorHelper(document.forms), + _step8; + try { + var _loop3 = function _loop3() { + var _form = _step8.value; + 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')) { + return 0; // continue + } + if (_form.getAttribute('id') === 'hero-search-form' || _form.getAttribute('class') === 'hb-booking-search-form') { + return 0; // continue + } + + // this handles search forms onsubmit process + _form.apbctSearchPrevOnsubmit = _form.onsubmit; + _form.onsubmit = function (e) { + return ctSearchFormOnSubmitHandler(e, _form); + }; + } + }, + _ret; + for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { + _ret = _loop3(); + if (_ret === 0) continue; + } + + // Check any XMLHttpRequest connections + } catch (err) { + _iterator8.e(err); + } finally { + _iterator8.f(); + } + 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) { + var botDetectorIntervalSearch = setInterval(function () { + var 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() { + var ctPinDataToRequest = function 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) { + var 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) { + var addidionalCleantalkData = ''; + var eventToken = localStorage.getItem('bot_detector_event_token'); + try { + eventToken = JSON.parse(eventToken); + } catch (_unused) { + eventToken = false; + } + if (eventToken !== null && eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') { + eventToken = eventToken.value; + addidionalCleantalkData += '&' + 'data%5Bct_bot_detector_event_token%5D=' + eventToken; + } + var 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 + var eventToken = false; + if (typeof jQuery !== 'undefined' && typeof jQuery.ajaxSetup === 'function') { + jQuery.ajaxSetup({ + beforeSend: function beforeSend(xhr, settings) { + var 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 (_unused2) { + eventToken = false; + } + if (eventToken !== false && eventToken.hasOwnProperty('value') && eventToken.value !== '') { + eventToken = eventToken.value; + } + } + } + } + if (sourceSign) { + var 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 + var honeyPotField = targetForm.querySelector('[name*="apbct_email_id__"]'); + var hpValue = null; + if (honeyPotField !== null && honeyPotField.value !== null) { + hpValue = honeyPotField.value; + } + + // get cookie data from storages + var cleantalkStorageDataArray = getCleanTalkStorageDataArray(); + + // get event token from storage + var 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(); + var callBack = function callBack() { + if (honeyPotField !== null) { + honeyPotField.parentNode.removeChild(honeyPotField); + } + if (typeof targetForm.apbctSearchPrevOnsubmit === 'function') { + targetForm.apbctSearchPrevOnsubmit(); + } else { + HTMLFormElement.prototype.submit.call(targetForm); + } + }; + var 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 + var 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() { + var commonCookies = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + // eslint-disable-line no-unused-vars + var 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 + var ctMouseMovedLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + var ctHasScrolledLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + var ctCookiesTypeLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + var apbctPageHits = apbctLocalStorage.get('apbct_page_hits'); + var apbctPrevReferer = apbctSessionStorage.get('apbct_prev_referer'); + var apbctSiteReferer = apbctSessionStorage.get('apbct_site_referer'); + var ctJsErrorsLocalStorage = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_js_errors'); + var ctPixelUrl = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + var apbctHeadless = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'apbct_headless'); + var ctBotDetectorFrontendDataLog = apbctLocalStorage.get(ctPublicFunctions.cookiePrefix + 'ct_bot_detector_frontend_data_log'); + + // collecting data from cookies + var ctMouseMovedCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_mouse_moved'); + var ctHasScrolledCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_has_scrolled'); + var ctCookiesTypeCookie = ctGetCookie(ctPublicFunctions.cookiePrefix + 'ct_cookies_type'); + var ctCookiesPixelUrl = ctGetCookie(ctPublicFunctions.cookiePrefix + 'apbct_pixel_url'); + var 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 (var 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 (var 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 + ) { + var 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 + var inputs = []; + var inputsVisible = ''; + var inputsVisibleCount = 0; + var inputsInvisible = ''; + var inputsInvisibleCount = 0; + var inputsWithDuplicateNames = []; + for (var 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) { + var collection = _typeof(visibleFieldsCollection) === 'object' && visibleFieldsCollection !== null ? visibleFieldsCollection : {}; + if (ctPublic.data__cookies_type === 'native') { + // eslint-disable-next-line guard-for-in + for (var i in collection) { + if (i > 10) { + // Do not generate more than 10 cookies + return; + } + var 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) { + var elements = document.querySelectorAll('[name^=ct_checkjs]'); + for (var 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) { + var 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) { + var inputType = 'hidden'; + if (type === 'submit') { + inputType = 'submit'; + } + var field = ''; + var 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() { + var noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + var noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + var noCookieDataTypo = { + typo: [] + }; + if (document.ctTypoData && document.ctTypoData.data) { + noCookieDataTypo = { + typo: document.ctTypoData.data + }; + } + var noCookieDataFromUserActivity = { + collecting_user_activity_data: [] + }; + if (document.ctCollectingUserActivityData) { + var collectingUserActivityData = JSON.parse(JSON.stringify(document.ctCollectingUserActivityData)); + noCookieDataFromUserActivity = { + collecting_user_activity_data: collectingUserActivityData + }; + } + return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, noCookieDataLocal), noCookieDataSession), noCookieDataTypo), noCookieDataFromUserActivity); +} + +/** + * @return {boolean|*} + */ +function ctGetPageForms() { + var 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 + var 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 + var 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) { + var 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) { + var exclusions = ctGetHiddenFieldExclusionsType(form); + return exclusions[hiddenFieldType] === 1; + } + return false; +} + +/** + * ctNoCookieAttachHiddenFieldsToForms + */ +function ctNoCookieAttachHiddenFieldsToForms() { + if (ctPublic.data__cookies_type !== 'none') { + return; + } + var forms = ctGetPageForms(); + if (forms) { + for (var 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 + var fields = forms[i].querySelectorAll('.ct_no_cookie_hidden_field'); + for (var j = 0; j < fields.length; j++) { + fields[j].outerHTML = ''; + } + // add new set + document.forms[i].append(ctNoCookieConstructHiddenField()); + } + } + } +} +var defaultFetch = window.fetch; +var 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 () { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + if (args && args[0] && typeof args[0].includes === 'function' && args[0].includes('/wp-json/metform/')) { + var 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() { + var formClasses = ['metform-form-content']; + var classExists = false; + var forms = document.forms; + var _iterator9 = _createForOfIteratorHelper(forms), + _step9; + try { + var _loop4 = function _loop4() { + var form = _step9.value; + formClasses.forEach(function (classForm) { + if (form.classList.contains(classForm)) { + classExists = true; + } + }); + }; + for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) { + _loop4(); + } + } catch (err) { + _iterator9.e(err); + } finally { + _iterator9.f(); + } + 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() { + var noCookieDataLocal = apbctLocalStorage.getCleanTalkData(); + var noCookieDataSession = apbctSessionStorage.getCleanTalkData(); + var noCookieData = _objectSpread(_objectSpread({}, 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() { + var 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(function (el) { + el.addEventListener('click', function (e) { + var href = el.getAttribute('href'); + // 2) Add to href attribute additional parameter ct_bot_detector_event_token gathered from apbctLocalStorage + var 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 */ +var cleantalkModal = { + // Flags + loaded: false, + loading: false, + opened: false, + opening: false, + ignoreURLConvert: false, + // Methods + load: function load(action) { + if (!this.loaded) { + this.loading = true; + var callback = function callback(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 open() { + /* Cleantalk Modal CSS start */ + var renderCss = function renderCss() { + var cssStr = ''; + // eslint-disable-next-line guard-for-in + for (var key in this.styles) { + cssStr += key + ':' + this.styles[key] + ';'; + } + return cssStr; + }; + var 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 + }; + var 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 + }; + var 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 + }; + var 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 + }; + var 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 + }; + var bodyCss = { + styles: { + 'overflow': 'hidden' + }, + toString: renderCss + }; + var 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 */ + + var overlay = document.createElement('div'); + overlay.setAttribute('id', 'cleantalk-modal-overlay'); + document.body.append(overlay); + document.body.classList.add('cleantalk-modal-opened'); + var inner = document.createElement('div'); + inner.setAttribute('id', 'cleantalk-modal-inner'); + inner.setAttribute('style', innerCss); + overlay.append(inner); + var close = document.createElement('div'); + close.setAttribute('id', 'cleantalk-modal-close'); + inner.append(close); + var content = document.createElement('div'); + if (this.loaded) { + var urlRegex = /(https?:\/\/[^\s]+)/g; + var 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 close() { + 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 () { + var _this6 = this; + var ctTrpLocalize = undefined; + var 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. + var 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"]'; + } + var woocommerceReviewsSelector = '.apbct-trp *[class*="review__author"]'; + var adminCommentsListSelector = '.apbct-trp td[class*="column-author"] > strong'; + var trpComments = document.querySelectorAll(themesCommentsSelector + ',' + woocommerceReviewsSelector + ',' + adminCommentsListSelector); + if (trpComments.length === 0) { + return; + } + trpComments.forEach(function (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; + } + var trpLayout = document.createElement('div'); + trpLayout.setAttribute('class', 'apbct-real-user-badge'); + var trpImage = document.createElement('img'); + trpImage.setAttribute('src', ctTrpLocalize.imgPersonUrl); + trpImage.setAttribute('class', 'apbct-real-user-popup-img'); + var trpDescription = document.createElement('div'); + trpDescription.setAttribute('class', 'apbct-real-user-popup'); + var trpDescriptionHeading = document.createElement('p'); + trpDescriptionHeading.setAttribute('class', 'apbct-real-user-popup-header'); + trpDescriptionHeading.append(ctTrpLocalize.phrases.trpHeading); + var trpDescriptionContent = document.createElement('div'); + trpDescriptionContent.setAttribute('class', 'apbct-real-user-popup-content_row'); + var trpDescriptionContentSpan = document.createElement('span'); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent1 + ' '); + trpDescriptionContentSpan.append(ctTrpLocalize.phrases.trpContent2); + if (ctTrpIsAdminCommentsList) { + var 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); + }); + var badges = document.querySelectorAll('.apbct-real-user-badge'); + badges.forEach(function (badge) { + var hideTimeout = undefined; + _this6.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 () { + var popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.toggle('visible'); + } + }); + badge.addEventListener('mouseenter', function () { + closeAllPopupTRP(); + var popup = this.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.add('visible'); + } + }); + badge.addEventListener('mouseleave', function () { + var _this7 = this; + hideTimeout = setTimeout(function () { + var popup = _this7.nextElementSibling; + if (popup && popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + var popup = badge.nextElementSibling; + popup.addEventListener('mouseenter', function () { + clearTimeout(hideTimeout); + popup.classList.add('visible'); + }); + popup.addEventListener('mouseleave', function () { + hideTimeout = setTimeout(function () { + if (popup.classList.contains('apbct-real-user-popup')) { + popup.classList.remove('visible'); + } + }, 1000); + }); + + // For mobile devices + badge.addEventListener('touchend', function () { + var _this8 = this; + hideTimeout = setTimeout(function () { + var popup = _this8.nextElementSibling; + var 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() { + var selection = window.getSelection(); + if (selection && selection.toString().length === 0) { + // Restart the hide timeout when selection is cleared + hideTimeout = setTimeout(function () { + var 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() { + var allDisplayPopup = document.querySelectorAll('.apbct-real-user-popup.visible'); + if (allDisplayPopup.length > 0) { + allDisplayPopup.forEach(function (element) { + element.classList.remove('visible'); + }); + } +} +var ctBrowserCheck = /*#__PURE__*/function () { + function ctBrowserCheck() { + _classCallCheck(this, ctBrowserCheck); + _defineProperty(this, "titleCheck", 'botDetector in action!'); + _defineProperty(this, "titleHuman", "You're a real person!"); + _defineProperty(this, "title", ''); + _defineProperty(this, "logo", 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'); + _defineProperty(this, "trpLogo", 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'); + _defineProperty(this, "logoAlt", 'CleanTalk'); + _defineProperty(this, "privacyLink", 'https://cleantalk.org/privacy'); + _defineProperty(this, "termsLink", 'https://cleantalk.org/terms'); + // eslint-disable-next-line no-template-curly-in-string, max-len + _defineProperty(this, "svgBad", ''); + // eslint-disable-next-line no-template-curly-in-string, max-len + _defineProperty(this, "svgGood", ''); + _defineProperty(this, "resultStore", 'ct-browser-check-result'); + _defineProperty(this, "container", null); + _defineProperty(this, "result", 'human'); + _defineProperty(this, "isLoader", true); + this.addStyles(); + this.addEventListener(); + } + return _createClass(ctBrowserCheck, [{ + key: "addEventListener", + value: function addEventListener() { + var _this9 = this; + document.addEventListener('ctBotDetectorStart', function () { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } + + _this9.showLoader(); + }); + } + }, { + key: "showSavedResult", + value: function showSavedResult() {} + }, { + key: "showLoader", + value: function showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + }, { + key: "render", + value: function render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + this.container.innerHTML += "
"; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += "
test
"; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += "
"; + } + }, { + key: "companyInfoHtml", + value: function companyInfoHtml() { + return "\n
\n
\n
\n \"").concat(this.logoAlt,\n
\n
").concat(this.logoAlt, "
\n
\n
\n Privacy\n ·\n Terms\n
\n
\n "); + } + }, { + key: "showContainer", + value: function showContainer() { + this.container.style.display = 'block'; + } + }, { + key: "hideContainer", + value: function hideContainer() { + this.container.style.display = 'none'; + } + + /** + * Create and add styles + */ + }, { + key: "addStyles", + value: function addStyles() { + var style = document.createElement('style'); + style.textContent = "\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n\n .ct-browser-check-container {\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 365px;\n height: 70px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n }\n "; + document.head.appendChild(style); + } + }]); +}(); +document.addEventListener('DOMContentLoaded', function () { + console.log('DOMContentLoaded'); + var apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } + +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); + +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); + +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } + +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } + +/** + * @return {HTMLElement} event + */ +function apbctSetEmailDecoderPopupAnimation() { + var animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three']; + var animationWrapper = document.createElement('div'); + animationWrapper.classList = 'apbct-ee-animation-wrapper'; + for (var i = 0; i < animationElements.length; i++) { + var apbctEEAnimationDogOne = document.createElement('span'); + apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i]; + apbctEEAnimationDogOne.innerText = '@'; + animationWrapper.append(apbctEEAnimationDogOne); + } + return animationWrapper; +} + +/** + * @param {mixed} event + */ +function ctFillDecodedEmailHandler() { + var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var clickSource = false; + var ctWlBrandname = ''; + var 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 + var encoderPopup = document.getElementById('apbct_popup'); + if (!encoderPopup) { + // construct popup + var waitingPopup = document.createElement('div'); + waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup'); + waitingPopup.setAttribute('id', 'apbct_popup'); + + // construct text header + var popupHeaderWrapper = document.createElement('span'); + popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center'; + var popupHeader = document.createElement('p'); + popupHeader.innerText = ctWlBrandname; + popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header'); + popupHeaderWrapper.append(popupHeader); + + // construct text wrapper + var 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 + var 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 + var 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 + var javascriptClientData = getJavascriptClientData(); + var data = { + event_javascript_data: javascriptClientData, + post_url: document.location.href, + referrer: document.referrer, + encodedEmails: '' + }; + var encodedEmailsCollection = {}; + for (var 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 + var 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 callback(result) { + // set alternative cookie to skip next pages encoding + ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, ''); + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource); + }, + onErrorCallback: function onErrorCallback(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + } + }); + + // Using AJAX request and handler + } else { + data.action = 'apbct_decode_email'; + apbct_public_sendAJAX(data, { + notJson: false, + callback: function callback(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 onErrorCallback(res) { + resetEncodedNodes(); + ctShowDecodeComment(res); + } + }); + } + } else { + var encodedEmail = encodedEmailNodes.dataset.originalString; + var _data = { + encodedEmails: JSON.stringify({ + 0: encodedEmail + }) + }; + + // Adding a tooltip + var _apbctTooltip = document.createElement('div'); + _apbctTooltip.setAttribute('class', 'apbct-tooltip'); + encodedEmailNodes.appendChild(_apbctTooltip); + apbct_admin_sendAJAX({ + 'action': 'apbct_decode_email', + 'encodedEmails': _data.encodedEmails + }, { + 'callback': function callback(result) { + apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false); + }, + 'notJson': true + }); + } +} + +/** + * @param {mixed} result + * @param {mixed} encodedEmailNodes + * @param {mixed} clickSource + */ +function apbctEmailEncoderCallbackBulk(result, encodedEmailNodes) { + var clickSource = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (result.success && result.data[0].is_allowed === true) { + // start process of visual decoding + setTimeout(function () { + // popup remove + var popup = document.getElementById('apbct_popup'); + if (popup !== null) { + var email = ''; + if (clickSource) { + var currentResultData; + result.data.forEach(function (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 + var firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first'); + // get email selectable by click + var 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 + var wrapper = popup.querySelector('.apbct-ee-animation-wrapper'); + if (wrapper) { + wrapper.remove(); + } + // remove second node + var secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second'); + if (secondNode) { + secondNode.remove(); + } + // add button + var buttonWrapper = document.createElement('span'); + buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long'; + if (!document.querySelector('.apbct-email-encoder-got-it-button')) { + var 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; + } + } + var popup = document.getElementById('apbct_popup'); + var 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) { + var _loop5 = function _loop5(i) { + // chek what is what + var currentResultData; + decodingResult.data.forEach(function (row) { + if (row.encoded_email === encodedNodes[i].dataset.originalString) { + currentResultData = row; + } + }); + // quit case on cloud block + if (currentResultData.is_allowed === false) { + return { + v: void 0 + }; + } + // handler for mailto + if (typeof encodedNodes[i].href !== 'undefined' && (encodedNodes[i].href.indexOf('mailto:') === 0 || encodedNodes[i].href.indexOf('tel:') === 0)) { + var linkTypePrefix; + if (encodedNodes[i].href.indexOf('mailto:') === 0) { + linkTypePrefix = 'mailto:'; + } else if (encodedNodes[i].href.indexOf('tel:') === 0) { + linkTypePrefix = 'tel:'; + } else { + return 0; // continue + } + var encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, ''); + var 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(function (el) { + var encodedEmailTextInsideMailto = ''; + decodingResult.data.forEach(function (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(function () { + ctProcessDecodedDataResult(currentResultData, encodedNodes[i]); + }, 2000); + } + // remove listeners + encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler); + }, + _ret2; + for (var i = 0; i < encodedNodes.length; i++) { + _ret2 = _loop5(i); + if (_ret2 === 0) continue; + if (_ret2) return _ret2.v; + } + } else { + var currentResultData = decodingResult.data[0]; + encodedNodes.classList.add('no-blur'); + // fill the nodes + setTimeout(function () { + 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'); +} \ 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 58a3428b2..a1df81cd7 100644 --- a/js/apbct-public-bundle_ext-protection.min.js +++ b/js/apbct-public-bundle_ext-protection.min.js @@ -1,68 +1,6034 @@ -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"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),_=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:m,o.ct_cookies_type=void 0!==n?n:_,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")})}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 s=void 0,d=!1;if("undefined"==typeof ctPublic&&"undefined"==typeof ctTrpAdminLocalize||void 0===(s="undefined"!=typeof ctPublic&&ctPublic.theRealPerson?ctPublic.theRealPerson:s)&&"undefined"!=typeof ctTrpAdminLocalize&&ctTrpAdminLocalize.theRealPerson&&(s=ctTrpAdminLocalize.theRealPerson,d=!0),s){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,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)})}))}});let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}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> - `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `,document.head.appendChild(o),loaderContainer.style.cssText=` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` - border-bottom: 1px solid #bbbbbb; - `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` - border-top: 1px solid #bbbbbb; - `,o.textContent="Browser check",loaderContainer.appendChild(o)}),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(m){var e={};e[0]=apbct_collect_visible_fields(m),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=m.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(m);var n=m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of m.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of m.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of m.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==m.classList&&m.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=m.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==m.dataset.mailingListId){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),void(e=m.querySelector('[type="submit"]')).click()}if(m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("webto.salesforce.com")){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}if(n){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}var l,s,d=m,u=(m.parentElement.removeChild(m),m.apbctPrev),p=m.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")} +/** + * 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); + } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); + // 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'); + }); + } +} + +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; + + constructor() { + this.addStyles(); + this.addEventListener(); + } + + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } + + this.showLoader(); + }); + } + + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } + + /** + * Create and add styles + */ + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } + `; + + document.head.appendChild(style); + } +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } + +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); + +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); + +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } + +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } + +/** + * 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; +} + +/** + * @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'); +} + //# 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 31d30cb53..e16107b03 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","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","apbctProcessExternalFormKlaviyo","cover","btn","disabled","onclick","ctProtectOutsideIframe","iframes","iframe","src","ctProtectOutsideIframeHandler","startTime","showResult","results","title","svg","arrowAction","dev","head","cssText","loader","description","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","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,"names":[],"mappings":"","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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nclass ctBrowserCheck {\n titleCheck = 'botDetector in action!';\n titleHuman = \"You're a real person!\";\n title = '';\n logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png';\n trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png';\n logoAlt = 'CleanTalk';\n privacyLink = 'https://cleantalk.org/privacy';\n termsLink = 'https://cleantalk.org/terms';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgBad = '';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgGood = '';\n resultStore = 'ct-browser-check-result';\n container = null;\n result = 'human';\n isLoader = true;\n\n constructor() {\n this.addStyles();\n this.addEventListener();\n }\n\n addEventListener() {\n document.addEventListener('ctBotDetectorStart', () => {\n // if (localStorage.getItem(this.resultStore)) {\n // this.showSavedResult();\n // return;\n // }\n\n this.showLoader();\n });\n }\n\n showSavedResult() {\n }\n\n showLoader() {\n this.title = this.titleCheck;\n this.render();\n this.showContainer();\n }\n\n render() {\n if (document.querySelector('.ct-browser-check-container')) {\n this.container = document.querySelector('.ct-browser-check-container');\n } else {\n this.container = document.createElement('div');\n this.container.className = 'ct-browser-check-container';\n document.body.appendChild(this.container);\n }\n\n this.container.innerHTML += `
`;\n // this.container.innerHTML += `
${this.title}
`;\n this.container.innerHTML += `
test
`;\n this.container.innerHTML += this.companyInfoHtml();\n this.container.innerHTML += `
`;\n }\n\n companyInfoHtml() {\n return `\n
\n
\n
\n \"${this.logoAlt}\"\n
\n
${this.logoAlt}
\n
\n
\n Privacy\n ·\n Terms\n
\n
\n `;\n }\n\n showContainer() {\n this.container.style.display = 'block';\n }\n\n hideContainer() {\n this.container.style.display = 'none';\n }\n\n /**\n * Create and add styles\n */\n addStyles() {\n const style = document.createElement('style');\n\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n\n .ct-browser-check-container {\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 365px;\n height: 70px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n }\n `;\n\n document.head.appendChild(style);\n }\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n console.log('DOMContentLoaded');\n const apbctBrowserCheck = new ctBrowserCheck();\n console.log(apbctBrowserCheck);\n apbctBrowserCheck.render();\n});\n// document.addEventListener('DOMContentLoaded', function() {\n// loaderContainer.className = 'ct-browser-check-container';\n// let startTime = null;\n// let timeoutToShowResult = 3000;\n\n// document.addEventListener('ctBotDetectorStart', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// showSavedResult();\n// return;\n// }\n\n// loaderContainer.style.display = 'block';\n// startTime = new Date();\n// });\n\n// document.addEventListener('ctBotDetectorEnd', function() {\n// console.log('ctBotDetectorEnd');\n// });\n\n// document.addEventListener('ctBotDetectorResult', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// return;\n// }\n\n// if (startTime && new Date() - startTime < timeoutToShowResult) {\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult - (new Date() - startTime));\n// return;\n// }\n\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult);\n// });\n\n// function showSavedResult() {\n// const result = localStorage.getItem('ct-browser-check-result');\n// if (result === 'human') {\n// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person';\n// }\n// }\n\n// /**\n// * Show result\n// */\n// function showResult() {\n// // let results = ['bot', 'human'];\n// let results = ['human'];\n// let result = results[Math.floor(Math.random() * results.length)];\n// // store result in local storage\n// localStorage.setItem('ct-browser-check-result', result);\n\n// if (document.querySelector('.ct-browser-check-loader')) {\n// document.querySelector('.ct-browser-check-loader').remove();\n// }\n// if (document.querySelector('.ct-browser-check-description')) {\n// document.querySelector('.ct-browser-check-description').remove();\n// }\n// document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n// // prepare data\n// let title = 'botDetector';\n// let svg = '';\n// let arrowAction = '';\n// switch (result) {\n// case 'bot':\n// console.log('bot');\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// break;\n// case 'human':\n// console.log('human');\n// title = 'The Real Person';\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n// break;\n// }\n// document.querySelector('.ct-browser-check-title').textContent = title;\n// const dev = document.createElement('div');\n// dev.className = 'ct-browser-check-human';\n// dev.innerHTML = `\n// ${svg}\n// >\n// `;\n// loaderContainer.appendChild(dev);\n// }\n\n\n// document.addEventListener('ctBotDetectorError', function() {\n// console.log('ctBotDetectorError');\n// });\n\n\n// // add div with title\n// const title = document.createElement('div');\n// title.className = 'ct-browser-check-title';\n// title.style.cssText = `\n// border-bottom: 1px solid #bbbbbb;\n// `;\n// title.textContent = 'botDetector';\n// loaderContainer.appendChild(title);\n\n// // Create loader element\n// const loader = document.createElement('div');\n// loader.className = 'ct-browser-check-loader';\n\n// // Add loader to container and container to body\n// loaderContainer.appendChild(loader);\n// document.body.appendChild(loaderContainer);\n\n// // add div with description\n// const description = document.createElement('div');\n// description.className = 'ct-browser-check-description';\n// description.style.cssText = `\n// border-top: 1px solid #bbbbbb;\n// `;\n// description.textContent = 'Browser check';\n// loaderContainer.appendChild(description);\n// });\n\n// /**\n// * Hide browser check\n// * eslint-disable-next-line no-unused-vars\n// */\n// function ctBrowserCheckHide() {\n// document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n// loaderContainer.style.right = '-70px';\n// loaderContainer.style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.width = '40px';\n// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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"],"file":"apbct-public-bundle_ext-protection.min.js"} \ 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 67e5d8313..4457024a7 100644 --- a/js/apbct-public-bundle_full-protection.min.js +++ b/js/apbct-public-bundle_full-protection.min.js @@ -1,68 +1,6136 @@ -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"),m=ctGetCookie(ctPublicFunctions.cookiePrefix+"ct_has_scrolled"),_=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:m,o.ct_cookies_type=void 0!==n?n:_,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(m){var e={};e[0]=apbct_collect_visible_fields(m),apbct_visible_fields_set_cookie(e);let o={ct_bot_detector_event_token:apbctLocalStorage.get("bot_detector_event_token")};e=m.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(m);var n=m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("hsforms");if(void 0===e.apbct&&void 0===e.data||void 0!==e.apbct&&!+e.apbct.blocked){for(var a of m.querySelectorAll('input[name="apbct_visible_fields"]'))a.remove();for(var i of m.querySelectorAll('input[value="cleantalk_force_ajax_check"]'))i.remove();for(var r of m.querySelectorAll('input[name="ct_no_cookie_hidden_field"]'))r.remove();if(void 0!==m.classList&&m.classList.contains("klaviyo-form"))return(d=document.getElementById("apbct-klaviyo-cover"))&&d.remove(),void((d=m.querySelector('button[type="button"].needsclick'))&&(d.disabled=!1,d.click()));if(void 0!==m.dataset.mailingListId){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),void(e=m.querySelector('[type="submit"]')).click()}if(m.hasAttribute("action")&&-1!==m.getAttribute("action").indexOf("webto.salesforce.com")){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}if(n){let e=m.querySelector('[type="submit"]');return e.remove(),m.apbctParent.appendChild(m.submitButtonOriginal),m.onsubmit=m.onsubmitOriginal,void(e=m.querySelector('[type="submit"]')).click()}var l,s,d=m,u=(m.parentElement.removeChild(m),m.apbctPrev),p=m.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()}))});let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}document.addEventListener("DOMContentLoaded",function(){loaderContainer.className="ct-browser-check-container";let e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)];document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px";let t="botDetector",o="",c="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',c=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML=` - ${o} - > - `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `,document.head.appendChild(o),loaderContainer.style.cssText=` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` - border-bottom: 1px solid #bbbbbb; - `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` - border-top: 1px solid #bbbbbb; - `,o.textContent="Browser check",loaderContainer.appendChild(o)}); +/** + * @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); + } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); + // 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; + }); +} + +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; + + constructor() { + this.addStyles(); + this.addEventListener(); + } + + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } + + this.showLoader(); + }); + } + + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } + + /** + * Create and add styles + */ + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } + `; + + document.head.appendChild(style); + } +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } + +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); + +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); + +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } + +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } + //# 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 0e9cf1cf1..65bd06438 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nclass ctBrowserCheck {\n titleCheck = 'botDetector in action!';\n titleHuman = \"You're a real person!\";\n title = '';\n logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png';\n trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png';\n logoAlt = 'CleanTalk';\n privacyLink = 'https://cleantalk.org/privacy';\n termsLink = 'https://cleantalk.org/terms';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgBad = '';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgGood = '';\n resultStore = 'ct-browser-check-result';\n container = null;\n result = 'human';\n isLoader = true;\n\n constructor() {\n this.addStyles();\n this.addEventListener();\n }\n\n addEventListener() {\n document.addEventListener('ctBotDetectorStart', () => {\n // if (localStorage.getItem(this.resultStore)) {\n // this.showSavedResult();\n // return;\n // }\n\n this.showLoader();\n });\n }\n\n showSavedResult() {\n }\n\n showLoader() {\n this.title = this.titleCheck;\n this.render();\n this.showContainer();\n }\n\n render() {\n if (document.querySelector('.ct-browser-check-container')) {\n this.container = document.querySelector('.ct-browser-check-container');\n } else {\n this.container = document.createElement('div');\n this.container.className = 'ct-browser-check-container';\n document.body.appendChild(this.container);\n }\n\n this.container.innerHTML += `
`;\n // this.container.innerHTML += `
${this.title}
`;\n this.container.innerHTML += `
test
`;\n this.container.innerHTML += this.companyInfoHtml();\n this.container.innerHTML += `
`;\n }\n\n companyInfoHtml() {\n return `\n
\n
\n
\n \"${this.logoAlt}\"\n
\n
${this.logoAlt}
\n
\n
\n Privacy\n ·\n Terms\n
\n
\n `;\n }\n\n showContainer() {\n this.container.style.display = 'block';\n }\n\n hideContainer() {\n this.container.style.display = 'none';\n }\n\n /**\n * Create and add styles\n */\n addStyles() {\n const style = document.createElement('style');\n\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n\n .ct-browser-check-container {\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 365px;\n height: 70px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n }\n `;\n\n document.head.appendChild(style);\n }\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n console.log('DOMContentLoaded');\n const apbctBrowserCheck = new ctBrowserCheck();\n console.log(apbctBrowserCheck);\n apbctBrowserCheck.render();\n});\n// document.addEventListener('DOMContentLoaded', function() {\n// loaderContainer.className = 'ct-browser-check-container';\n// let startTime = null;\n// let timeoutToShowResult = 3000;\n\n// document.addEventListener('ctBotDetectorStart', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// showSavedResult();\n// return;\n// }\n\n// loaderContainer.style.display = 'block';\n// startTime = new Date();\n// });\n\n// document.addEventListener('ctBotDetectorEnd', function() {\n// console.log('ctBotDetectorEnd');\n// });\n\n// document.addEventListener('ctBotDetectorResult', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// return;\n// }\n\n// if (startTime && new Date() - startTime < timeoutToShowResult) {\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult - (new Date() - startTime));\n// return;\n// }\n\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult);\n// });\n\n// function showSavedResult() {\n// const result = localStorage.getItem('ct-browser-check-result');\n// if (result === 'human') {\n// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person';\n// }\n// }\n\n// /**\n// * Show result\n// */\n// function showResult() {\n// // let results = ['bot', 'human'];\n// let results = ['human'];\n// let result = results[Math.floor(Math.random() * results.length)];\n// // store result in local storage\n// localStorage.setItem('ct-browser-check-result', result);\n\n// if (document.querySelector('.ct-browser-check-loader')) {\n// document.querySelector('.ct-browser-check-loader').remove();\n// }\n// if (document.querySelector('.ct-browser-check-description')) {\n// document.querySelector('.ct-browser-check-description').remove();\n// }\n// document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n// // prepare data\n// let title = 'botDetector';\n// let svg = '';\n// let arrowAction = '';\n// switch (result) {\n// case 'bot':\n// console.log('bot');\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// break;\n// case 'human':\n// console.log('human');\n// title = 'The Real Person';\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n// break;\n// }\n// document.querySelector('.ct-browser-check-title').textContent = title;\n// const dev = document.createElement('div');\n// dev.className = 'ct-browser-check-human';\n// dev.innerHTML = `\n// ${svg}\n// >\n// `;\n// loaderContainer.appendChild(dev);\n// }\n\n\n// document.addEventListener('ctBotDetectorError', function() {\n// console.log('ctBotDetectorError');\n// });\n\n\n// // add div with title\n// const title = document.createElement('div');\n// title.className = 'ct-browser-check-title';\n// title.style.cssText = `\n// border-bottom: 1px solid #bbbbbb;\n// `;\n// title.textContent = 'botDetector';\n// loaderContainer.appendChild(title);\n\n// // Create loader element\n// const loader = document.createElement('div');\n// loader.className = 'ct-browser-check-loader';\n\n// // Add loader to container and container to body\n// loaderContainer.appendChild(loader);\n// document.body.appendChild(loaderContainer);\n\n// // add div with description\n// const description = document.createElement('div');\n// description.className = 'ct-browser-check-description';\n// description.style.cssText = `\n// border-top: 1px solid #bbbbbb;\n// `;\n// description.textContent = 'Browser check';\n// loaderContainer.appendChild(description);\n// });\n\n// /**\n// * Hide browser check\n// * eslint-disable-next-line no-unused-vars\n// */\n// function ctBrowserCheckHide() {\n// document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n// loaderContainer.style.right = '-70px';\n// loaderContainer.style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.width = '40px';\n// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\n// }\n"],"file":"apbct-public-bundle_full-protection.min.js"} \ 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 1810b36ca..9532cd088 100644 --- a/js/apbct-public-bundle_int-protection.min.js +++ b/js/apbct-public-bundle_int-protection.min.js @@ -1,68 +1,5080 @@ -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)})}))}});let loaderContainer=document.createElement("div");function ctBrowserCheckHide(){document.querySelector(".ct-browser-check-title").textContent="TRP",loaderContainer.style.right="-70px",loaderContainer.style.alignItems="left",document.querySelector(".ct-browser-check-title").style.alignItems="left",document.querySelector(".ct-browser-check-title").style.width="40px",document.querySelector(".ct-browser-check-human").style.marginLeft="-30px"}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(){loaderContainer.className="ct-browser-check-container";let e=null;function t(){var e=["bot","human"],e=e[Math.floor(Math.random()*e.length)];document.querySelector(".ct-browser-check-loader").remove(),document.querySelector(".ct-browser-check-description").remove(),document.querySelector(".ct-browser-check-container").style.height="50px";let t="botDetector",o="",c="";switch(e){case"bot":console.log("bot"),o='';break;case"human":console.log("human"),t="The Real Person",o='',c=' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '}document.querySelector(".ct-browser-check-title").textContent=t;e=document.createElement("div");e.className="ct-browser-check-human",e.innerHTML=` - ${o} - > - `,loaderContainer.appendChild(e)}document.addEventListener("ctBotDetectorStart",function(){loaderContainer.style.display="block",e=new Date}),document.addEventListener("ctBotDetectorEnd",function(){console.log("ctBotDetectorEnd")}),document.addEventListener("ctBotDetectorResult",function(){e&&new Date-e<3e3?setTimeout(()=>{t()},3e3-(new Date-e)):setTimeout(()=>{t()},3e3)}),document.addEventListener("ctBotDetectorError",function(){console.log("ctBotDetectorError")}),console.log("DOMContentLoaded");var o=document.createElement("style"),o=(o.textContent=` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `,document.head.appendChild(o),loaderContainer.style.cssText=` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `,document.createElement("div")),o=(o.className="ct-browser-check-title",o.style.cssText=` - border-bottom: 1px solid #bbbbbb; - `,o.textContent="botDetector",loaderContainer.appendChild(o),document.createElement("div")),o=(o.className="ct-browser-check-loader",loaderContainer.appendChild(o),document.body.appendChild(loaderContainer),document.createElement("div"));o.className="ct-browser-check-description",o.style.cssText=` - border-top: 1px solid #bbbbbb; - `,o.textContent="Browser check",loaderContainer.appendChild(o)}),document.addEventListener("DOMContentLoaded",function(){+ctPublic.settings__forms__check_internal&&(setTimeout(()=>{ctProtectInternalForms()},500),document.addEventListener("apbctForceProtectionAllowed",function(){ctProtectInternalForms()}))}); +/** + * @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); + } + document.dispatchEvent(new CustomEvent('ctBotDetectorStart')); + apbct_public_sendREST( + 'alt_sessions', + { + method: 'POST', + data: {cookies: cookies}, + callback: callback, + onErrorCallback: onErrorCallback, + }, + ); + document.dispatchEvent(new CustomEvent('ctBotDetectorResult')); + // 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'); + }); + } +} + +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; + + constructor() { + this.addStyles(); + this.addEventListener(); + } + + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } + + this.showLoader(); + }); + } + + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } + + /** + * Create and add styles + */ + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } + `; + + document.head.appendChild(style); + } +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } + +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); + +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); + +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } + +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } + +/** + * 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; + }); +} + //# 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 3da06a147..4b70f471b 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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nconst loaderContainer = document.createElement('div');\n\ndocument.addEventListener('DOMContentLoaded', function() {\n loaderContainer.className = 'ct-browser-check-container';\n let startTime = null;\n let timeoutToShowResult = 3000;\n\n document.addEventListener('ctBotDetectorStart', function() {\n loaderContainer.style.display = 'block';\n startTime = new Date();\n });\n\n document.addEventListener('ctBotDetectorEnd', function() {\n console.log('ctBotDetectorEnd');\n });\n\n document.addEventListener('ctBotDetectorResult', function() {\n if (startTime && new Date() - startTime < timeoutToShowResult) {\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult - (new Date() - startTime));\n return;\n }\n setTimeout(() => {\n showResult();\n }, timeoutToShowResult);\n });\n\n /**\n * Show result\n */\n function showResult() {\n let results = ['bot', 'human'];\n let result = results[Math.floor(Math.random() * results.length)];\n\n document.querySelector('.ct-browser-check-loader').remove();\n document.querySelector('.ct-browser-check-description').remove();\n document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n // prepare data\n let title = 'botDetector';\n let svg = '';\n let arrowAction = '';\n switch (result) {\n case 'bot':\n console.log('bot');\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n break;\n case 'human':\n console.log('human');\n title = 'The Real Person';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svg = '';\n arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n break;\n }\n document.querySelector('.ct-browser-check-title').textContent = title;\n const dev = document.createElement('div');\n dev.className = 'ct-browser-check-human';\n dev.innerHTML = `\n ${svg}\n >\n `;\n loaderContainer.appendChild(dev);\n }\n\n\n document.addEventListener('ctBotDetectorError', function() {\n console.log('ctBotDetectorError');\n });\n\n console.log('DOMContentLoaded');\n\n // Create and add styles\n const style = document.createElement('style');\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n .ct-browser-check-human {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .ct-browser-check-human svg {\n width: 20px;\n height: 20px;\n }\n .ct-browser-check-human-arrow {\n font-size: 20px;\n font-weight: bold;\n color: #777777;\n padding-left: 15px;\n margin-bottom: 2px;\n }\n `;\n document.head.appendChild(style);\n\n // Create loader container\n loaderContainer.style.cssText = `\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 110px;\n height: 80px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n `;\n\n // add div with title\n const title = document.createElement('div');\n title.className = 'ct-browser-check-title';\n title.style.cssText = `\n border-bottom: 1px solid #bbbbbb;\n `;\n title.textContent = 'botDetector';\n loaderContainer.appendChild(title);\n\n // Create loader element\n const loader = document.createElement('div');\n loader.className = 'ct-browser-check-loader';\n\n // Add loader to container and container to body\n loaderContainer.appendChild(loader);\n document.body.appendChild(loaderContainer);\n\n // add div with description\n const description = document.createElement('div');\n description.className = 'ct-browser-check-description';\n description.style.cssText = `\n border-top: 1px solid #bbbbbb;\n `;\n description.textContent = 'Browser check';\n loaderContainer.appendChild(description);\n});\n\n/**\n * Hide browser check\n */\nfunction ctBrowserCheckHide() { // eslint-disable-line no-unused-vars\n document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n loaderContainer.style.right = '-70px';\n loaderContainer.style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n document.querySelector('.ct-browser-check-title').style.width = '40px';\n document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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","dispatchEvent","CustomEvent","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","bubbles","cancelable","detail","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","loaderContainer","ctBrowserCheckHide","alignItems","marginLeft","ctCheckInternal","currForm","ctData","elems","alert","origSubmit","ctProtectInternalForms","formClone","ctCurrAction","ctCurrForm","blog_home","ctCheckInternalIsExcludedForm","cloneNode","replaceChild","stopImmediatePropagation","some","startTime","showResult","results","svg","arrowAction","dev","head","cssText","loader","description","settings__forms__check_internal"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","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 document.dispatchEvent(new CustomEvent('ctBotDetectorStart'));\n apbct_public_sendREST(\n 'alt_sessions',\n {\n method: 'POST',\n data: {cookies: cookies},\n callback: callback,\n onErrorCallback: onErrorCallback,\n },\n );\n document.dispatchEvent(new CustomEvent('ctBotDetectorResult'));\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\nclass ctBrowserCheck {\n titleCheck = 'botDetector in action!';\n titleHuman = \"You're a real person!\";\n title = '';\n logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png';\n trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png';\n logoAlt = 'CleanTalk';\n privacyLink = 'https://cleantalk.org/privacy';\n termsLink = 'https://cleantalk.org/terms';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgBad = '';\n // eslint-disable-next-line no-template-curly-in-string, max-len\n svgGood = '';\n resultStore = 'ct-browser-check-result';\n container = null;\n result = 'human';\n isLoader = true;\n\n constructor() {\n this.addStyles();\n this.addEventListener();\n }\n\n addEventListener() {\n document.addEventListener('ctBotDetectorStart', () => {\n // if (localStorage.getItem(this.resultStore)) {\n // this.showSavedResult();\n // return;\n // }\n\n this.showLoader();\n });\n }\n\n showSavedResult() {\n }\n\n showLoader() {\n this.title = this.titleCheck;\n this.render();\n this.showContainer();\n }\n\n render() {\n if (document.querySelector('.ct-browser-check-container')) {\n this.container = document.querySelector('.ct-browser-check-container');\n } else {\n this.container = document.createElement('div');\n this.container.className = 'ct-browser-check-container';\n document.body.appendChild(this.container);\n }\n\n this.container.innerHTML += `
`;\n // this.container.innerHTML += `
${this.title}
`;\n this.container.innerHTML += `
test
`;\n this.container.innerHTML += this.companyInfoHtml();\n this.container.innerHTML += `
`;\n }\n\n companyInfoHtml() {\n return `\n
\n
\n
\n \"${this.logoAlt}\"\n
\n
${this.logoAlt}
\n
\n
\n Privacy\n ·\n Terms\n
\n
\n `;\n }\n\n showContainer() {\n this.container.style.display = 'block';\n }\n\n hideContainer() {\n this.container.style.display = 'none';\n }\n\n /**\n * Create and add styles\n */\n addStyles() {\n const style = document.createElement('style');\n\n style.textContent = `\n .ct-browser-check-loader { \n width: 20px; \n margin: 5px auto;\n aspect-ratio: 1; \n border: 3px solid #F3F6F9; \n border-radius: 50%; \n position: relative; \n transform: rotate(45deg); \n } \n .ct-browser-check-loader::before { \n content: \"\"; \n position: absolute; \n inset: -3px; \n border-radius: 50%; \n border: 3px solid #026E88; \n animation: l18 2s infinite linear; \n } \n @keyframes l18 { \n 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} \n 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} \n 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} \n 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} \n 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} \n }\n\n .ct-browser-check-container {\n display: none;\n font-size: 12px;\n font-weight: bold;\n color: #777777;\n text-align: center;\n position: fixed;\n top: 20%;\n right: -5px;\n width: 365px;\n height: 70px;\n z-index: 9999;\n background-color: #fff;\n border-radius: 5px 0 0 5px;\n border: 1px solid #bbbbbb;\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);\n transition: right 0.3s ease-in-out;\n }\n `;\n\n document.head.appendChild(style);\n }\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n console.log('DOMContentLoaded');\n const apbctBrowserCheck = new ctBrowserCheck();\n console.log(apbctBrowserCheck);\n apbctBrowserCheck.render();\n});\n// document.addEventListener('DOMContentLoaded', function() {\n// loaderContainer.className = 'ct-browser-check-container';\n// let startTime = null;\n// let timeoutToShowResult = 3000;\n\n// document.addEventListener('ctBotDetectorStart', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// showSavedResult();\n// return;\n// }\n\n// loaderContainer.style.display = 'block';\n// startTime = new Date();\n// });\n\n// document.addEventListener('ctBotDetectorEnd', function() {\n// console.log('ctBotDetectorEnd');\n// });\n\n// document.addEventListener('ctBotDetectorResult', function() {\n// if (localStorage.getItem('ct-browser-check-result')) {\n// return;\n// }\n\n// if (startTime && new Date() - startTime < timeoutToShowResult) {\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult - (new Date() - startTime));\n// return;\n// }\n\n// setTimeout(() => {\n// showResult();\n// }, timeoutToShowResult);\n// });\n\n// function showSavedResult() {\n// const result = localStorage.getItem('ct-browser-check-result');\n// if (result === 'human') {\n// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person';\n// }\n// }\n\n// /**\n// * Show result\n// */\n// function showResult() {\n// // let results = ['bot', 'human'];\n// let results = ['human'];\n// let result = results[Math.floor(Math.random() * results.length)];\n// // store result in local storage\n// localStorage.setItem('ct-browser-check-result', result);\n\n// if (document.querySelector('.ct-browser-check-loader')) {\n// document.querySelector('.ct-browser-check-loader').remove();\n// }\n// if (document.querySelector('.ct-browser-check-description')) {\n// document.querySelector('.ct-browser-check-description').remove();\n// }\n// document.querySelector('.ct-browser-check-container').style.height = '50px';\n\n// // prepare data\n// let title = 'botDetector';\n// let svg = '';\n// let arrowAction = '';\n// switch (result) {\n// case 'bot':\n// console.log('bot');\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// break;\n// case 'human':\n// console.log('human');\n// title = 'The Real Person';\n// // eslint-disable-next-line no-template-curly-in-string, max-len\n// svg = '';\n// arrowAction = ' style=\"cursor: pointer;\" onclick=\"ctBrowserCheckHide();\" ';\n// break;\n// }\n// document.querySelector('.ct-browser-check-title').textContent = title;\n// const dev = document.createElement('div');\n// dev.className = 'ct-browser-check-human';\n// dev.innerHTML = `\n// ${svg}\n// >\n// `;\n// loaderContainer.appendChild(dev);\n// }\n\n\n// document.addEventListener('ctBotDetectorError', function() {\n// console.log('ctBotDetectorError');\n// });\n\n\n// // add div with title\n// const title = document.createElement('div');\n// title.className = 'ct-browser-check-title';\n// title.style.cssText = `\n// border-bottom: 1px solid #bbbbbb;\n// `;\n// title.textContent = 'botDetector';\n// loaderContainer.appendChild(title);\n\n// // Create loader element\n// const loader = document.createElement('div');\n// loader.className = 'ct-browser-check-loader';\n\n// // Add loader to container and container to body\n// loaderContainer.appendChild(loader);\n// document.body.appendChild(loaderContainer);\n\n// // add div with description\n// const description = document.createElement('div');\n// description.className = 'ct-browser-check-description';\n// description.style.cssText = `\n// border-top: 1px solid #bbbbbb;\n// `;\n// description.textContent = 'Browser check';\n// loaderContainer.appendChild(description);\n// });\n\n// /**\n// * Hide browser check\n// * eslint-disable-next-line no-unused-vars\n// */\n// function ctBrowserCheckHide() {\n// document.querySelector('.ct-browser-check-title').textContent = 'TRP';\n// loaderContainer.style.right = '-70px';\n// loaderContainer.style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.alignItems = 'left';\n// document.querySelector('.ct-browser-check-title').style.width = '40px';\n// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px';\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"],"file":"apbct-public-bundle_int-protection.min.js"} \ No newline at end of file diff --git a/js/cleantalk-admin-settings-page.min.js b/js/cleantalk-admin-settings-page.min.js index 9ae43e1b5..d19cbc2ba 100644 --- a/js/cleantalk-admin-settings-page.min.js +++ b/js/cleantalk-admin-settings-page.min.js @@ -1,2 +1,846 @@ -function handleAnchorDetection(t){"none"===document.querySelector("#apbct_settings__advanced_settings").style.display&&apbctExceptedShowHide("apbct_settings__advanced_settings"),scrollToAnchor("#"+t)}function scrollToAnchor(t){t=document.querySelector(t);t&&t.scrollIntoView({block:"end"})}function apbctManageEmailEncoderCustomTextField(){var t=document.querySelector("#apbct_setting_data__email_decoder_obfuscation_custom_text");let e;null!==t&&(e=void 0!==t.parentElement?t.parentElement:null),document.querySelectorAll(".apbct_setting---data__email_decoder_obfuscation_mode").forEach(t=>{e&&t.checked&&"replace"!==t.value&&e.classList.add("hidden"),t.addEventListener("click",t=>{void 0!==e&&("replace"===t.target.value?e.classList.remove("hidden"):e.classList.add("hidden"))})})}function apbctBannerCheck(){let c=setInterval(function(){apbct_admin_sendAJAX({action:"apbct_settings__check_renew_banner"},{callback:function(t,e,n,a){t.close_renew_banner&&(jQuery("#cleantalk_notice_renew").length&&jQuery("#cleantalk_notice_renew").hide("slow"),jQuery("#cleantalk_notice_trial").length&&jQuery("#cleantalk_notice_trial").hide("slow"),clearInterval(c))}})},9e5)}function apbctGetElems(a){for(let t=0,e=(a=a.split(",")).length,n;t{document.getElementById(t)&&"none"!==document.getElementById(t).style.display&&apbctShowHideElem(t)})}function apbctShowRequiredGroups(t,e){var n=document.getElementById("apbct_settings__dwpms_settings");n&&"none"===n.style.display&&((n=t).preventDefault(),apbctShowHideElem("apbct_settings__dwpms_settings"),document.getElementById(e).dispatchEvent(new n.constructor(n.type,n)))}function apbctSettingsDependencies(t,c){c=isNaN(c)?null:c,apbctGetElemsNative(t).forEach(function(t,e,n){var a;1===(c=null===c?null===t.getAttribute("disabled")?0:1:c)?t.removeAttribute("disabled"):t.setAttribute("disabled","disabled"),null!==t.getAttribute("apbct_children")&&null!==(a=apbctSettingsDependenciesGetState(t)&&c)&&apbctSettingsDependencies(t.getAttribute("apbct_children"),a)})}function apbctSettingsDependenciesGetState(t){let e;switch(t.getAttribute("type")){case"checkbox":e=+t.checked;break;case"radio":e=+(1==+t.getAttribute("value"));break;default:e=null}return e}function apbctSettingsShowDescription(t,e){function c(t){var e=0!=jQuery(t.target).parent(".apbct_long_desc").length,t=jQuery(t.target).hasClass("apbct_long_desc__cancel");(0
");var n=jQuery("#apbct_long_desc__"+e);n.append("").append("
").css({top:t.position().top-5,left:t.position().left+25}),apbct_admin_sendAJAX({action:"apbct_settings__get__long_description",setting_id:e},{spinner:n.children("img"),callback:function(t,e,n,a){a.empty().append("
").append("").append("

"+t.title+"

").append("

"+t.desc+"

"),jQuery(document).on("click",c)}},n)}function apbctNavigationMenuPosition(){var t,e,n=document.querySelector("#apbct_hidden_section_nav ul"),a=document.querySelector("#apbct_settings__button_section");n&&a&&(t=window.scrollY,e=window.innerWidth,1e3{var e;"checkbox"===t.target.type?(e=t.target.checked?1:2,document.querySelectorAll("input[id^=apbct_setting_data__email_decoder]")[e].checked=!0):document.getElementById("apbct_setting_data__email_decoder").checked=1===parseInt(t.target.value)}),document.getElementsByClassName("apbct_settings-title")[0]&&"rtl"===getComputedStyle(document.getElementsByClassName("apbct_settings-title")[0]).direction&&jQuery(".apbct_switchers").css("text-align","right"),jQuery("#apbct_showApiKey").on("click",function(t){t.preventDefault(),jQuery(this).hide(),jQuery(".apbct_settings-field--api_key").val(jQuery(".apbct_settings-field--api_key").attr("key")),jQuery(".apbct_settings-field--api_key+div").css("display","inline")});let t=(new Date).getTimezoneOffset()/60*-1;jQuery("#ct_admin_timezone").val(t),jQuery("#apbct_button__get_key_auto").on("click",function(){jQuery("#apbct_license_agreed").is(":checked")?apbct_admin_sendAJAX({action:"apbct_get_key_auto",ct_admin_timezone:t},{timeout:25e3,button:document.getElementById("apbct_button__get_key_auto"),spinner:jQuery("#apbct_button__get_key_auto .apbct_preloader_button"),callback:function(t,e,n,a){jQuery("#apbct_button__get_key_auto .apbct_success").show(300),setTimeout(function(){jQuery("#apbct_button__get_key_auto .apbct_success").hide(300)},2e3),t.reload&&document.location.reload(),t.getTemplates&&(cleantalkModal.loaded=t.getTemplates,cleantalkModal.open(),document.addEventListener("cleantalkModalClosed",function(t){document.location.reload()}))}}):(jQuery("#apbct_settings__no_agreement_notice").show(),apbctHighlightElement("apbct_license_agreed",3))}),jQuery(document).on("click","#apbct_settings_templates_import_button",function(){jQuery("#apbct-ajax-result").remove();var t=jQuery("option:selected",jQuery("#apbct_settings_templates_import"));if(jQuery("#apbct_settings_templates_import_name").css("border-color","inherit"),void 0===t.data("id"))console.log('Attribute "data-id" not set for the option.');else{t={template_id:t.data("id"),template_name:t.data("name"),settings:t.data("settings")};let c=this;apbct_admin_sendAJAX({action:"settings_templates_import",data:t},{timeout:25e3,button:c,spinner:jQuery("#apbct_settings_templates_import_button .apbct_preloader_button"),notJson:!0,callback:function(t,e,n,a){t.success?(jQuery("

"+t.data+"

").insertAfter(jQuery(c)),jQuery("#apbct_settings_templates_import_button .apbct_success").show(300),setTimeout(function(){jQuery("#apbct_settings_templates_import_button .apbct_success").hide(300)},2e3),document.addEventListener("cleantalkModalClosed",function(t){document.location.reload()}),setTimeout(function(){cleantalkModal.close()},2e3)):jQuery("

"+t.data+"

").insertAfter(jQuery(c))}})}}),jQuery(document).on("click","#apbct_settings_templates_export_button",function(){jQuery("#apbct-ajax-result").remove();var t=jQuery("option:selected",jQuery("#apbct_settings_templates_export")),e=jQuery("#apbct_settings_templates_export_name");let n={};if(e.css("border-color","inherit"),void 0===t.data("id"))console.log('Attribute "data-id" not set for the option.');else{if("new_template"===t.data("id")){var a=e.val();if(""===a)return void e.css("border-color","red");n={template_name:a}}else n={template_id:t.data("id")};let c=this;apbct_admin_sendAJAX({action:"settings_templates_export",data:n},{timeout:25e3,button:c,spinner:jQuery("#apbct_settings_templates_export_button .apbct_preloader_button"),notJson:!0,callback:function(t,e,n,a){t.success?(jQuery("

"+t.data+"

").insertAfter(jQuery(c)),jQuery("#apbct_settings_templates_export_button .apbct_success").show(300),setTimeout(function(){jQuery("#apbct_settings_templates_export_button .apbct_success").hide(300)},2e3),document.addEventListener("cleantalkModalClosed",function(t){document.location.reload()}),setTimeout(function(){cleantalkModal.close()},2e3)):jQuery("

"+t.data+"

").insertAfter(jQuery(c))}})}}),jQuery(document).on("click","#apbct_settings_templates_reset_button",function(){let c=this;apbct_admin_sendAJAX({action:"settings_templates_reset"},{timeout:25e3,button:c,spinner:jQuery("#apbct_settings_templates_reset_button .apbct_preloader_button"),notJson:!0,callback:function(t,e,n,a){t.success?(jQuery("

"+t.data+"

").insertAfter(jQuery(c)),jQuery("#apbct_settings_templates_reset_button .apbct_success").show(300),setTimeout(function(){jQuery("#apbct_settings_templates_reset_button .apbct_success").hide(300)},2e3),document.addEventListener("cleantalkModalClosed",function(t){document.location.reload()}),setTimeout(function(){cleantalkModal.close()},2e3)):jQuery("

"+t.data+"

").insertAfter(jQuery(c))}})}),jQuery("#apbct_button__sync").on("click",function(){apbct_admin_sendAJAX({action:"apbct_sync"},{timeout:25e3,button:document.getElementById("apbct_button__sync"),spinner:jQuery("#apbct_button__sync .apbct_preloader_button"),callback:function(t,e,n,a){jQuery("#apbct_button__sync .apbct_success").show(300),setTimeout(function(){jQuery("#apbct_button__sync .apbct_success").hide(300)},2e3),t.reload&&(ctSettingsPage.key_changed?(jQuery(".key_changed_sync").hide(300),jQuery(".key_changed_success").show(300),setTimeout(function(){document.location.reload()},3e3)):document.location.reload())}})}),ctSettingsPage.key_changed&&jQuery("#apbct_button__sync").click(),jQuery(document).on("click",".apbct_settings-long_description---show",function(){apbctSettingsShowDescription(self=jQuery(this),self.attr("setting"))}),(jQuery("#cleantalk_notice_renew").length||jQuery("#cleantalk_notice_trial").length)&&apbctBannerCheck(),jQuery(document).on("change","#apbct_settings_templates_export",function(){"new_template"===jQuery("option:selected",this).data("id")?jQuery(this).parent().parent().find("#apbct_settings_templates_export_name").show():jQuery(this).parent().parent().find("#apbct_settings_templates_export_name").hide()}),apbctSaveButtonPosition();let e;window.addEventListener("scroll",function(){clearTimeout(e),e=setTimeout(function(){apbctSaveButtonPosition()},50),apbctNavigationMenuPosition()}),jQuery("#ct_adv_showhide a").on("click",apbctSaveButtonPosition),jQuery("#apbct-change-account-email").on("click",function(t){t.preventDefault();var t=jQuery(this),e=jQuery("#apbct-account-email"),n=e.text();t.toggleClass("active"),t.hasClass("active")?(t.text(t.data("save-text")),e.attr("contenteditable","true"),e.on("keydown",function(t){"Enter"===t.code&&t.preventDefault()}),e.on("input",function(t){"insertParagraph"===t.inputType&&t.preventDefault()})):(apbct_admin_sendAJAX({action:"apbct_update_account_email",accountEmail:n},{timeout:5e3,callback:function(t,e,n,a){void 0!==t.success&&"ok"===t.success&&void 0!==t.manuallyLink&&jQuery("#apbct-key-manually-link").attr("href",t.manuallyLink),void 0!==t.error&&jQuery("#apbct-account-email").css("border-color","red")}}),e.attr("contenteditable","false"),t.text(t.data("default-text")))}),jQuery("#apbct_setting_apikey").on("input",function(){var t=jQuery(this).val(),e=(jQuery("#apbct_settings__key_line__save_settings").off("click"),""!==t&&null===t.match(/^[a-z\d]{8,30}\s*$/));jQuery("#apbct_settings__key_is_bad").hide(),jQuery("#apbct_showApiKey").hide(),jQuery("#apbct_settings__account_name_ob").hide(),jQuery("#apbct_settings__no_agreement_notice").hide(),""===t?(jQuery("#apbct_button__key_line__save_changes_wrapper").hide(),jQuery("#apbct_button__get_key_auto__wrapper").show(),jQuery("#apbct_button__get_key_manual_chunk").show()):(jQuery("#apbct_button__key_line__save_changes_wrapper").show(),jQuery("#apbct_button__get_key_auto__wrapper").hide(),jQuery("#apbct_button__get_key_manual_chunk").hide(),e&&jQuery("#apbct_settings__key_line__save_settings").on("click",function(t){t.preventDefault(),jQuery("#apbct_settings__key_is_bad").show(),apbctHighlightElement("apbct_setting_apikey",3)}))}),jQuery("#apbct_setting_apikey").val()&&ctSettingsPage.key_is_ok&&jQuery("#apbct_button__get_key_auto__wrapper").hide(),ctSettingsPage.key_is_ok||jQuery('button.cleantalk_link[value="save_changes"]').on("click",function(t){t.preventDefault(),jQuery("#sync_required_notice").length||jQuery("

Synchronization process failed. Please, check the acces key and restart the synch.

").insertAfter(jQuery("#apbct_button__sync")),apbctHighlightElement("apbct_setting_apikey",3),apbctHighlightElement("apbct_button__sync",3),jQuery("#apbct_button__get_key_auto__wrapper").show()}),jQuery("#apbct-custom-logo-open-gallery").click(function(t){t.preventDefault();let e=jQuery(this),n=wp.media({library:{type:"image"},multiple:!1});n.on("select",function(){var t=n.state().get("selection").first().toJSON();e.parent().prev().attr("src",t.url),jQuery("#cleantalk_custom_logo").val(t.id)}),n.open()}),jQuery("#apbct-custom-logo-remove-image").click(function(t){t.preventDefault(),!0===confirm("Sure?")&&(t=jQuery(this).parent().prev().data("src"),jQuery(this).parent().prev().attr("src",t),jQuery(this).prev().prev().val(""))}),jQuery('button[id*="apbct-action-adjust-change-"]').click(function(t){t.preventDefault();var t={action:"apbct_action_adjust_change"},e=(t.adjust=jQuery(this).data("adjust"),{});e.button=document.getElementById("apbct-action-adjust-change-"+t.adjust),e.notJson=!0,e.callback=function(){document.location.reload()},apbct_admin_sendAJAX(t,e)}),jQuery('button[id*="apbct-action-adjust-reverse-"]').click(function(t){t.preventDefault();var t={action:"apbct_action_adjust_reverse"},e=(t.adjust=jQuery(this).data("adjust"),{});e.button=document.getElementById("apbct-action-adjust-reverse-"+t.adjust),e.notJson=!0,e.callback=function(){document.location.reload()},apbct_admin_sendAJAX(t,e)}),document.querySelector(".apbct_hidden_section_nav_mob_btn").addEventListener("click",()=>{document.querySelector("#apbct_hidden_section_nav ul").style.display="block",document.querySelector(".apbct_hidden_section_nav_mob_btn").style.display="none"}),document.querySelector(".apbct_hidden_section_nav_mob_btn-close").addEventListener("click",()=>{document.querySelector("#apbct_hidden_section_nav ul").style.display="none",document.querySelector(".apbct_hidden_section_nav_mob_btn").style.display="block"}),apbctManageEmailEncoderCustomTextField(),window.location.hash&&handleAnchorDetection(window.location.hash.substring(1))}); +jQuery(document).ready(function() { + // Top level settings + jQuery('.apbct_setting---data__email_decoder').on('click', (event) => { + if ( event.target.type === 'checkbox' ) { + let currentTarget = event.target.checked ? 1 : 2; + document.querySelectorAll('input[id^=apbct_setting_data__email_decoder]')[currentTarget].checked = true; + } else { + document.getElementById('apbct_setting_data__email_decoder').checked = parseInt(event.target.value) === 1; + } + }); + + // Crunch for Right to Left direction languages + if (document.getElementsByClassName('apbct_settings-title')[0]) { + if (getComputedStyle(document.getElementsByClassName('apbct_settings-title')[0]).direction === 'rtl') { + jQuery('.apbct_switchers').css('text-align', 'right'); + } + } + + // Show/Hide access key + jQuery('#apbct_showApiKey').on('click', function(e) { + e.preventDefault(); + jQuery(this).hide(); + jQuery('.apbct_settings-field--api_key').val(jQuery('.apbct_settings-field--api_key').attr('key')); + jQuery('.apbct_settings-field--api_key+div').css('display', 'inline'); + }); + + let d = new Date(); + let timezone = d.getTimezoneOffset()/60*(-1); + jQuery('#ct_admin_timezone').val(timezone); + + // Key KEY automatically + jQuery('#apbct_button__get_key_auto').on('click', function() { + if (!jQuery('#apbct_license_agreed').is(':checked')) { + jQuery('#apbct_settings__no_agreement_notice').show(); + apbctHighlightElement('apbct_license_agreed', 3); + return; + } + apbct_admin_sendAJAX( + {action: 'apbct_get_key_auto', ct_admin_timezone: timezone}, + { + timeout: 25000, + button: document.getElementById('apbct_button__get_key_auto' ), + spinner: jQuery('#apbct_button__get_key_auto .apbct_preloader_button' ), + callback: function(result, data, params, obj) { + jQuery('#apbct_button__get_key_auto .apbct_success').show(300); + setTimeout(function() { + jQuery('#apbct_button__get_key_auto .apbct_success').hide(300); + }, 2000); + if (result.reload) { + document.location.reload(); + } + if (result.getTemplates) { + cleantalkModal.loaded = result.getTemplates; + cleantalkModal.open(); + document.addEventListener('cleantalkModalClosed', function( e ) { + document.location.reload(); + }); + } + }, + }, + ); + }); + + // Import settings + jQuery( document ).on('click', '#apbct_settings_templates_import_button', function() { + jQuery('#apbct-ajax-result').remove(); + let optionSelected = jQuery('option:selected', jQuery('#apbct_settings_templates_import')); + let templateNameInput = jQuery('#apbct_settings_templates_import_name'); + templateNameInput.css('border-color', 'inherit'); + if ( typeof optionSelected.data('id') === 'undefined' ) { + console.log( 'Attribute "data-id" not set for the option.' ); + return; + } + let data = { + 'template_id': optionSelected.data('id'), + 'template_name': optionSelected.data('name'), + 'settings': optionSelected.data('settings'), + }; + let button = this; + apbct_admin_sendAJAX( + {action: 'settings_templates_import', data: data}, + { + timeout: 25000, + button: button, + spinner: jQuery('#apbct_settings_templates_import_button .apbct_preloader_button' ), + notJson: true, + callback: function(result, data, params, obj) { + if (result.success) { + jQuery( '

' + result.data + '

' ) + .insertAfter( jQuery(button) ); + jQuery('#apbct_settings_templates_import_button .apbct_success').show(300); + setTimeout(function() { + jQuery('#apbct_settings_templates_import_button .apbct_success').hide(300); + }, 2000); + document.addEventListener('cleantalkModalClosed', function( e ) { + document.location.reload(); + }); + setTimeout(function() { + cleantalkModal.close(); + }, 2000); + } else { + jQuery( '

' + result.data + '

' ) + .insertAfter( jQuery(button) ); + } + }, + }, + ); + }); + + // Export settings + jQuery( document ).on('click', '#apbct_settings_templates_export_button', function() { + jQuery('#apbct-ajax-result').remove(); + let optionSelected = jQuery('option:selected', jQuery('#apbct_settings_templates_export')); + let templateNameInput = jQuery('#apbct_settings_templates_export_name'); + let data = {}; + templateNameInput.css('border-color', 'inherit'); + if ( typeof optionSelected.data('id') === 'undefined' ) { + console.log( 'Attribute "data-id" not set for the option.' ); + return; + } + if ( optionSelected.data('id') === 'new_template' ) { + let templateName = templateNameInput.val(); + if ( templateName === '' ) { + templateNameInput.css('border-color', 'red'); + return; + } + data = { + 'template_name': templateName, + }; + } else { + data = { + 'template_id': optionSelected.data('id'), + }; + } + let button = this; + apbct_admin_sendAJAX( + {action: 'settings_templates_export', data: data}, + { + timeout: 25000, + button: button, + spinner: jQuery('#apbct_settings_templates_export_button .apbct_preloader_button' ), + notJson: true, + callback: function(result, data, params, obj) { + if (result.success) { + jQuery( '

' + result.data + '

' ) + .insertAfter( jQuery(button) ); + jQuery('#apbct_settings_templates_export_button .apbct_success').show(300); + setTimeout(function() { + jQuery('#apbct_settings_templates_export_button .apbct_success').hide(300); + }, 2000); + document.addEventListener('cleantalkModalClosed', function( e ) { + document.location.reload(); + }); + setTimeout(function() { + cleantalkModal.close(); + }, 2000); + } else { + jQuery( '

' + result.data + '

' ) + .insertAfter( jQuery(button) ); + } + }, + }, + ); + }); + + // Reset settings + jQuery( document ).on('click', '#apbct_settings_templates_reset_button', function() { + let button = this; + apbct_admin_sendAJAX( + {action: 'settings_templates_reset'}, + { + timeout: 25000, + button: button, + spinner: jQuery('#apbct_settings_templates_reset_button .apbct_preloader_button' ), + notJson: true, + callback: function(result, data, params, obj) { + if (result.success) { + jQuery( '

' + result.data + '

' ) + .insertAfter( jQuery(button) ); + jQuery('#apbct_settings_templates_reset_button .apbct_success').show(300); + setTimeout(function() { + jQuery('#apbct_settings_templates_reset_button .apbct_success').hide(300); + }, 2000); + document.addEventListener('cleantalkModalClosed', function( e ) { + document.location.reload(); + }); + setTimeout(function() { + cleantalkModal.close(); + }, 2000); + } else { + jQuery( '

' + result.data + '

' ) + .insertAfter( jQuery(button) ); + } + }, + }, + ); + }); + + // Sync button + jQuery('#apbct_button__sync').on('click', function() { + apbct_admin_sendAJAX( + {action: 'apbct_sync'}, + { + timeout: 25000, + button: document.getElementById('apbct_button__sync' ), + spinner: jQuery('#apbct_button__sync .apbct_preloader_button' ), + callback: function(result, data, params, obj) { + jQuery('#apbct_button__sync .apbct_success').show(300); + setTimeout(function() { + jQuery('#apbct_button__sync .apbct_success').hide(300); + }, 2000); + if (result.reload) { + if ( ctSettingsPage.key_changed ) { + jQuery('.key_changed_sync').hide(300); + jQuery('.key_changed_success').show(300); + setTimeout(function() { + document.location.reload(); + }, 3000); + } else { + document.location.reload(); + } + } + }, + }, + ); + }); + + if ( ctSettingsPage.key_changed ) { + jQuery('#apbct_button__sync').click(); + } + + jQuery(document).on('click', '.apbct_settings-long_description---show', function() { + self = jQuery(this); + apbctSettingsShowDescription(self, self.attr('setting')); + }); + + if (jQuery('#cleantalk_notice_renew').length || jQuery('#cleantalk_notice_trial').length) { + apbctBannerCheck(); + } + + jQuery(document).on('change', '#apbct_settings_templates_export', function() { + let optionSelected = jQuery('option:selected', this); + if ( optionSelected.data('id') === 'new_template' ) { + jQuery(this).parent().parent().find('#apbct_settings_templates_export_name').show(); + } else { + jQuery(this).parent().parent().find('#apbct_settings_templates_export_name').hide(); + } + }); + + apbctSaveButtonPosition(); + let debounceTimer; + window.addEventListener('scroll', function() { + clearTimeout(debounceTimer); + debounceTimer = setTimeout(function() { + apbctSaveButtonPosition(); + }, 50); + apbctNavigationMenuPosition(); + }); + jQuery('#ct_adv_showhide a').on('click', apbctSaveButtonPosition); + + + /** + * Change cleantalk account email + */ + jQuery('#apbct-change-account-email').on('click', function(e) { + e.preventDefault(); + + let $this = jQuery(this); + let accountEmailField = jQuery('#apbct-account-email'); + let accountEmail = accountEmailField.text(); + + $this.toggleClass('active'); + + if ($this.hasClass('active')) { + $this.text($this.data('save-text')); + accountEmailField.attr('contenteditable', 'true'); + accountEmailField.on('keydown', function(e) { + if (e.code === 'Enter') { + e.preventDefault(); + } + }); + accountEmailField.on('input', function(e) { + if (e.inputType === 'insertParagraph') { + e.preventDefault(); + } + }); + } else { + apbct_admin_sendAJAX( + { + action: 'apbct_update_account_email', + accountEmail: accountEmail, + }, + { + timeout: 5000, + callback: function(result, data, params, obj) { + if (result.success !== undefined && result.success === 'ok') { + if (result.manuallyLink !== undefined) { + jQuery('#apbct-key-manually-link').attr('href', result.manuallyLink); + } + } + + if (result.error !== undefined) { + jQuery('#apbct-account-email').css('border-color', 'red'); + } + }, + }, + ); + + accountEmailField.attr('contenteditable', 'false'); + $this.text($this.data('default-text')); + } + }); + + /** + * Validate apkikey and hide get auto btn + */ + jQuery('#apbct_setting_apikey').on('input', function() { + let enteredValue = jQuery(this).val(); + jQuery('#apbct_settings__key_line__save_settings').off('click'); + let keyBad = enteredValue !== '' && enteredValue.match(/^[a-z\d]{8,30}\s*$/) === null; + jQuery('#apbct_settings__key_is_bad').hide(); + jQuery('#apbct_showApiKey').hide(); + jQuery('#apbct_settings__account_name_ob').hide(); + jQuery('#apbct_settings__no_agreement_notice').hide(); + if (enteredValue === '') { + jQuery('#apbct_button__key_line__save_changes_wrapper').hide(); + jQuery('#apbct_button__get_key_auto__wrapper').show(); + jQuery('#apbct_button__get_key_manual_chunk').show(); + } else { + jQuery('#apbct_button__key_line__save_changes_wrapper').show(); + jQuery('#apbct_button__get_key_auto__wrapper').hide(); + jQuery('#apbct_button__get_key_manual_chunk').hide(); + if (keyBad) { + jQuery('#apbct_settings__key_line__save_settings').on('click', + function(e) { + e.preventDefault(); + jQuery('#apbct_settings__key_is_bad').show(); + apbctHighlightElement('apbct_setting_apikey', 3); + }, + ); + } + } + }); + + if ( jQuery('#apbct_setting_apikey').val() && ctSettingsPage.key_is_ok) { + jQuery('#apbct_button__get_key_auto__wrapper').hide(); + } + + /** + * Handle synchronization errors when key is no ok to force user check the key and restart the sync + */ + if ( !ctSettingsPage.key_is_ok ) { + jQuery('button.cleantalk_link[value="save_changes"]').on('click', + function(e) { + e.preventDefault(); + if (!jQuery('#sync_required_notice').length) { + jQuery( '

' + + 'Synchronization process failed. Please, check the acces key and restart the synch.' + + '

' ).insertAfter( jQuery('#apbct_button__sync') ); + } + apbctHighlightElement('apbct_setting_apikey', 3); + apbctHighlightElement('apbct_button__sync', 3); + jQuery('#apbct_button__get_key_auto__wrapper').show(); + }, + ); + } + + /** + * Open WP gallery for adding custom logo + */ + jQuery('#apbct-custom-logo-open-gallery').click(function(e) { + e.preventDefault(); + + const button = jQuery(this); + + const customUploader = wp.media({ + library: { + type: 'image', + }, + multiple: false, + }); + + customUploader.on('select', function() { + const image = customUploader.state().get('selection').first().toJSON(); + + button.parent().prev().attr( 'src', image.url ); + jQuery('#cleantalk_custom_logo').val( image.id ); + }); + + customUploader.open(); + }); + + /** + * Remove selected logo + */ + jQuery('#apbct-custom-logo-remove-image').click(function(e) { + e.preventDefault(); + + if ( true === confirm( 'Sure?' ) ) { + const src = jQuery(this).parent().prev().data('src'); + jQuery(this).parent().prev().attr('src', src); + jQuery(this).prev().prev().val(''); + } + }); + + jQuery('button[id*="apbct-action-adjust-change-"]').click(function(e) { + e.preventDefault(); + + let data = {}; + data.action = 'apbct_action_adjust_change'; + data.adjust = jQuery(this).data('adjust'); + + let params = {}; + params.button = document.getElementById('apbct-action-adjust-change-' + data.adjust); + params.notJson = true; + + params.callback = function() { + document.location.reload(); + }; + + apbct_admin_sendAJAX(data, params); + }); + + jQuery('button[id*="apbct-action-adjust-reverse-"]').click(function(e) { + e.preventDefault(); + + let data = {}; + data.action = 'apbct_action_adjust_reverse'; + data.adjust = jQuery(this).data('adjust'); + + let params = {}; + params.button = document.getElementById('apbct-action-adjust-reverse-' + data.adjust); + params.notJson = true; + + params.callback = function() { + document.location.reload(); + }; + + apbct_admin_sendAJAX(data, params); + }); + + document.querySelector('.apbct_hidden_section_nav_mob_btn').addEventListener('click', () => { + document.querySelector('#apbct_hidden_section_nav ul').style.display = 'block'; + document.querySelector('.apbct_hidden_section_nav_mob_btn').style.display = 'none'; + }); + + document.querySelector('.apbct_hidden_section_nav_mob_btn-close').addEventListener('click', () => { + document.querySelector('#apbct_hidden_section_nav ul').style.display = 'none'; + document.querySelector('.apbct_hidden_section_nav_mob_btn').style.display = 'block'; + }); + + // Hide/show EmailEncoder replacing text textarea + apbctManageEmailEncoderCustomTextField(); + + if (window.location.hash) { + const anchor = window.location.hash.substring(1); + handleAnchorDetection(anchor); + } +}); + +/** + * Detect ancors and open advanced settings before scroll + * @param {string} anchor + */ +function handleAnchorDetection(anchor) { + let advSettings = document.querySelector('#apbct_settings__advanced_settings'); + if ( 'none' === advSettings.style.display ) { + apbctExceptedShowHide('apbct_settings__advanced_settings'); + } + scrollToAnchor('#' + anchor); +} + +/** + * Scroll to the target element ID + * @param {string} anchorId Anchor target element ID + */ +function scrollToAnchor(anchorId) { + const targetElement = document.querySelector(anchorId); + if (targetElement) { + targetElement.scrollIntoView({ + block: 'end', + }); + } +} + +/** + * Hide/show EmailEncoder replacing text textarea + */ +function apbctManageEmailEncoderCustomTextField() { + const replacingText = document + .querySelector('#apbct_setting_data__email_decoder_obfuscation_custom_text'); + let replacingTextWrapperSub; + if (replacingText !== null) { + replacingTextWrapperSub = typeof replacingText.parentElement !== 'undefined' ? + replacingText.parentElement : + null; + } + document.querySelectorAll('.apbct_setting---data__email_decoder_obfuscation_mode').forEach((elem) => { + // visibility set on saved settings + if (replacingTextWrapperSub && elem.checked && elem.value !== 'replace') { + replacingTextWrapperSub.classList.add('hidden'); + } + // visibility set on change + elem.addEventListener('click', (event) => { + if (typeof replacingTextWrapperSub !== 'undefined') { + if (event.target.value === 'replace') { + replacingTextWrapperSub.classList.remove('hidden'); + } else { + replacingTextWrapperSub.classList.add('hidden'); + } + } + }); + }); +} + +/** + * Checking current account status for renew notice + */ +function apbctBannerCheck() { + let bannerChecker = setInterval( function() { + apbct_admin_sendAJAX( + {action: 'apbct_settings__check_renew_banner'}, + { + callback: function(result, data, params, obj) { + if (result.close_renew_banner) { + if (jQuery('#cleantalk_notice_renew').length) { + jQuery('#cleantalk_notice_renew').hide('slow'); + } + if (jQuery('#cleantalk_notice_trial').length) { + jQuery('#cleantalk_notice_trial').hide('slow'); + } + clearInterval(bannerChecker); + } + }, + }, + ); + }, 900000); +} + +/** + * Select elems like #{selector} or .{selector} + * Selector passed in string separated by , + * + * @param {string|array} elems + * @return {*} + */ +function apbctGetElems(elems) { + elems = elems.split(','); + for ( let i=0, len = elems.length, tmp; i < len; i++) { + tmp = jQuery('#'+elems[i]); + elems[i] = tmp.length === 0 ? jQuery('.'+elems[i]) : tmp; + } + return elems; +} + +/** + * Select elems like #{selector} or .{selector} + * Selector could be passed in a string ( separated by comma ) or in array ( [ elem1, elem2, ... ] ) + * + * @param {string|array} elems + * @return {array} + */ +function apbctGetElemsNative(elems) { + // Make array from a string + if (typeof elems === 'string') { + elems = elems.split(','); + } + + let out = []; + + elems.forEach(function(elem, i, arr) { + // try to get elements with such IDs + let tmp = document.getElementById(elem); + if (tmp !== null) { + out.push( tmp[key] ); + return; + } + + // try to get elements with such class name + // write each elem from collection to new element of output array + tmp = document.getElementsByClassName(elem); + if (tmp !== null && tmp.length !==0 ) { + for (key in tmp) { + if ( +key >= 0 ) { + out.push( tmp[key] ); + } + } + } + }); + + return out; +} + +/** + * @param {string|array} elems + */ +function apbctShowHideElem(elems) { + elems = apbctGetElems(elems); + for ( let i=0, len = elems.length; i < len; i++) { + elems[i].each(function(i, elem) { + elem = jQuery(elem); + let label = elem.next('label') || elem.prev('label') || null; + if (elem.is(':visible')) { + elem.hide(); + if (label) label.hide(); + } else { + elem.show(); + if (label) label.show(); + } + }); + } +} + +/** + * @param {string|array} element + */ +function apbctExceptedShowHide(element) { // eslint-disable-line no-unused-vars + let toHide = [ + 'apbct_settings__dwpms_settings', + 'apbct_settings__advanced_settings', + 'trusted_and_affiliate__special_span', + ]; + let index = toHide.indexOf(element); + if (index !== -1) { + toHide.splice(index, 1); + } + apbctShowHideElem(element); + toHide.forEach((toHideElem) => { + if (document.getElementById(toHideElem) && document.getElementById(toHideElem).style.display !== 'none') { + apbctShowHideElem(toHideElem); + } + }); +} + +/** + * @param {mixed} event + * @param {string} id + */ +function apbctShowRequiredGroups(event, id) { // eslint-disable-line no-unused-vars + let required = document.getElementById('apbct_settings__dwpms_settings'); + if (required && required.style.display === 'none') { + let originEvent = event; + event.preventDefault(); + apbctShowHideElem('apbct_settings__dwpms_settings'); + document.getElementById(id).dispatchEvent(new originEvent.constructor(originEvent.type, originEvent)); + } +} + +/** + * Settings dependences. Switch|toggle depended elements state (disabled|enabled) + * Recieve list of selectors ( without class mark (.) or id mark (#) ) + * + * @param {string|array} ids + * @param {int} enable + */ +function apbctSettingsDependencies(ids, enable) { // eslint-disable-line no-unused-vars + enable = ! isNaN(enable) ? enable : null; + + // Get elements + let elems = apbctGetElemsNative( ids ); + + elems.forEach(function(elem, i, arr) { + let doDisable = function() { + elem.setAttribute('disabled', 'disabled'); + }; + let doEnable = function() { + elem.removeAttribute('disabled'); + }; + + // Set defined state + if (enable === null) { + enable = elem.getAttribute('disabled') === null ? 0 : 1; + } + + enable === 1 ? doEnable() : doDisable(); + + if ( elem.getAttribute('apbct_children') !== null) { + let state = apbctSettingsDependenciesGetState( elem ) && enable; + if ( state !== null ) { + apbctSettingsDependencies( elem.getAttribute('apbct_children'), state ); + } + } + }); +} + +/** + * @param {HTMLElement} elem + * @return {int|null} + */ +function apbctSettingsDependenciesGetState(elem) { + let state; + + switch ( elem.getAttribute( 'type' ) ) { + case 'checkbox': + state = +elem.checked; + break; + case 'radio': + state = +(+elem.getAttribute('value') === 1); + break; + default: + state = null; + } + + return state; +} + +/** + * @param {HTMLElement} label + * @param {string} settingId + */ +function apbctSettingsShowDescription(label, settingId) { + let removeDescFunc = function(e) { + const callerIsPopup = jQuery(e.target).parent('.apbct_long_desc').length != 0; + const callerIsHideCross = jQuery(e.target).hasClass('apbct_long_desc__cancel'); + const descIsShown = jQuery('.apbct_long_desc__title').length > 0; + if (descIsShown && !callerIsPopup || callerIsHideCross) { + jQuery('.apbct_long_desc').remove(); + jQuery(document).off('click', removeDescFunc); + } + }; + + label.after('
'); + let obj = jQuery('#apbct_long_desc__'+settingId); + obj.append('') + .append('
') + .css({ + top: label.position().top - 5, + left: label.position().left + 25, + }); + + + apbct_admin_sendAJAX( + {action: 'apbct_settings__get__long_description', setting_id: settingId}, + { + spinner: obj.children('img'), + callback: function(result, data, params, obj) { + obj.empty() + .append('
') + .append('') + .append('

'+result.title+'

') + .append('

'+result.desc+'

'); + + jQuery(document).on('click', removeDescFunc); + }, + }, + obj, + ); +} + +/** + * Set position for navigation menu + * @return {void} + */ +function apbctNavigationMenuPosition() { + const navBlock = document.querySelector('#apbct_hidden_section_nav ul'); + const rightBtnSave = document.querySelector('#apbct_settings__button_section'); + if (!navBlock || !rightBtnSave) { + return; + } + const scrollPosition = window.scrollY; + const windowWidth = window.innerWidth; + if (scrollPosition > 1000) { + navBlock.style.position = 'fixed'; + rightBtnSave.style.position = 'fixed'; + } else { + navBlock.style.position = 'static'; + rightBtnSave.style.position = 'static'; + } + + if (windowWidth < 768) { + rightBtnSave.style.position = 'fixed'; + } +} + +/** + * Set position for save button, hide it if scrolled to the bottom + * @return {void} + */ +function apbctSaveButtonPosition() { + if ( + document.getElementById('apbct_settings__before_advanced_settings') === null || + document.getElementById('apbct_settings__after_advanced_settings') === null || + document.getElementById('apbct_settings__button_section') === null || + document.getElementById('apbct_settings__advanced_settings') === null || + document.getElementById('apbct_hidden_section_nav') === null + ) { + return; + } + + if (!ctSettingsPage.key_is_ok) { + jQuery('#apbct_settings__main_save_button').hide(); + return; + } + + const additionalSaveButton = + document.querySelector('#apbct_settings__button_section, cleantalk_link[value="save_changes"]'); + if (!additionalSaveButton) { + return; + } + + const scrollPosition = window.scrollY; + const documentHeight = document.documentElement.scrollHeight; + const windowHeight = window.innerHeight; + const threshold = 800; + if (scrollPosition + windowHeight >= documentHeight - threshold) { + additionalSaveButton.style.display = 'none'; + } else { + additionalSaveButton.style.display = 'block'; + } + + const advSettingsBlock = document.getElementById('apbct_settings__advanced_settings'); + const mainSaveButton = document.getElementById('apbct_settings__block_main_save_button'); + if (!advSettingsBlock || !mainSaveButton) { + return; + } + + if (advSettingsBlock.style.display == 'none') { + mainSaveButton.classList.remove('apbct_settings__position_main_save_button'); + } else { + mainSaveButton.classList.add('apbct_settings__position_main_save_button'); + } +} + +/** + * Hightlights element + * + * @param {string} id + * @param {int} times + */ +function apbctHighlightElement(id, times) { + times = times-1 || 0; + let keyField = jQuery('#'+id); + jQuery('html, body').animate({scrollTop: keyField.offset().top - 100}, 'slow'); + keyField.addClass('apbct_highlighted'); + keyField.animate({opacity: 0}, 400, 'linear', function() { + keyField.animate({opacity: 1}, 400, 'linear', function() { + if (times>0) { + apbctHighlightElement(id, times); + } else { + keyField.removeClass('apbct_highlighted'); + } + }); + }); +} + //# sourceMappingURL=cleantalk-admin-settings-page.min.js.map diff --git a/js/cleantalk-admin-settings-page.min.js.map b/js/cleantalk-admin-settings-page.min.js.map index bf3a4829a..d4e253d8c 100644 --- a/js/cleantalk-admin-settings-page.min.js.map +++ b/js/cleantalk-admin-settings-page.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cleantalk-admin-settings-page.min.js","sources":["cleantalk-admin-settings-page.js"],"sourcesContent":["jQuery(document).ready(function() {\n // Top level settings\n jQuery('.apbct_setting---data__email_decoder').on('click', (event) => {\n if ( event.target.type === 'checkbox' ) {\n let currentTarget = event.target.checked ? 1 : 2;\n document.querySelectorAll('input[id^=apbct_setting_data__email_decoder]')[currentTarget].checked = true;\n } else {\n document.getElementById('apbct_setting_data__email_decoder').checked = parseInt(event.target.value) === 1;\n }\n });\n\n // Crunch for Right to Left direction languages\n if (document.getElementsByClassName('apbct_settings-title')[0]) {\n if (getComputedStyle(document.getElementsByClassName('apbct_settings-title')[0]).direction === 'rtl') {\n jQuery('.apbct_switchers').css('text-align', 'right');\n }\n }\n\n // Show/Hide access key\n jQuery('#apbct_showApiKey').on('click', function(e) {\n e.preventDefault();\n jQuery(this).hide();\n jQuery('.apbct_settings-field--api_key').val(jQuery('.apbct_settings-field--api_key').attr('key'));\n jQuery('.apbct_settings-field--api_key+div').css('display', 'inline');\n });\n\n let d = new Date();\n let timezone = d.getTimezoneOffset()/60*(-1);\n jQuery('#ct_admin_timezone').val(timezone);\n\n // Key KEY automatically\n jQuery('#apbct_button__get_key_auto').on('click', function() {\n if (!jQuery('#apbct_license_agreed').is(':checked')) {\n jQuery('#apbct_settings__no_agreement_notice').show();\n apbctHighlightElement('apbct_license_agreed', 3);\n return;\n }\n apbct_admin_sendAJAX(\n {action: 'apbct_get_key_auto', ct_admin_timezone: timezone},\n {\n timeout: 25000,\n button: document.getElementById('apbct_button__get_key_auto' ),\n spinner: jQuery('#apbct_button__get_key_auto .apbct_preloader_button' ),\n callback: function(result, data, params, obj) {\n jQuery('#apbct_button__get_key_auto .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_button__get_key_auto .apbct_success').hide(300);\n }, 2000);\n if (result.reload) {\n document.location.reload();\n }\n if (result.getTemplates) {\n cleantalkModal.loaded = result.getTemplates;\n cleantalkModal.open();\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n }\n },\n },\n );\n });\n\n // Import settings\n jQuery( document ).on('click', '#apbct_settings_templates_import_button', function() {\n jQuery('#apbct-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#apbct_settings_templates_import'));\n let templateNameInput = jQuery('#apbct_settings_templates_import_name');\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n let data = {\n 'template_id': optionSelected.data('id'),\n 'template_name': optionSelected.data('name'),\n 'settings': optionSelected.data('settings'),\n };\n let button = this;\n apbct_admin_sendAJAX(\n {action: 'settings_templates_import', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#apbct_settings_templates_import_button .apbct_preloader_button' ),\n notJson: true,\n callback: function(result, data, params, obj) {\n if (result.success) {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n jQuery('#apbct_settings_templates_import_button .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_settings_templates_import_button .apbct_success').hide(300);\n }, 2000);\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n cleantalkModal.close();\n }, 2000);\n } else {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Export settings\n jQuery( document ).on('click', '#apbct_settings_templates_export_button', function() {\n jQuery('#apbct-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#apbct_settings_templates_export'));\n let templateNameInput = jQuery('#apbct_settings_templates_export_name');\n let data = {};\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n if ( optionSelected.data('id') === 'new_template' ) {\n let templateName = templateNameInput.val();\n if ( templateName === '' ) {\n templateNameInput.css('border-color', 'red');\n return;\n }\n data = {\n 'template_name': templateName,\n };\n } else {\n data = {\n 'template_id': optionSelected.data('id'),\n };\n }\n let button = this;\n apbct_admin_sendAJAX(\n {action: 'settings_templates_export', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#apbct_settings_templates_export_button .apbct_preloader_button' ),\n notJson: true,\n callback: function(result, data, params, obj) {\n if (result.success) {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n jQuery('#apbct_settings_templates_export_button .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_settings_templates_export_button .apbct_success').hide(300);\n }, 2000);\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n cleantalkModal.close();\n }, 2000);\n } else {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Reset settings\n jQuery( document ).on('click', '#apbct_settings_templates_reset_button', function() {\n let button = this;\n apbct_admin_sendAJAX(\n {action: 'settings_templates_reset'},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#apbct_settings_templates_reset_button .apbct_preloader_button' ),\n notJson: true,\n callback: function(result, data, params, obj) {\n if (result.success) {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n jQuery('#apbct_settings_templates_reset_button .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_settings_templates_reset_button .apbct_success').hide(300);\n }, 2000);\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n cleantalkModal.close();\n }, 2000);\n } else {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Sync button\n jQuery('#apbct_button__sync').on('click', function() {\n apbct_admin_sendAJAX(\n {action: 'apbct_sync'},\n {\n timeout: 25000,\n button: document.getElementById('apbct_button__sync' ),\n spinner: jQuery('#apbct_button__sync .apbct_preloader_button' ),\n callback: function(result, data, params, obj) {\n jQuery('#apbct_button__sync .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_button__sync .apbct_success').hide(300);\n }, 2000);\n if (result.reload) {\n if ( ctSettingsPage.key_changed ) {\n jQuery('.key_changed_sync').hide(300);\n jQuery('.key_changed_success').show(300);\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n } else {\n document.location.reload();\n }\n }\n },\n },\n );\n });\n\n if ( ctSettingsPage.key_changed ) {\n jQuery('#apbct_button__sync').click();\n }\n\n jQuery(document).on('click', '.apbct_settings-long_description---show', function() {\n self = jQuery(this);\n apbctSettingsShowDescription(self, self.attr('setting'));\n });\n\n if (jQuery('#cleantalk_notice_renew').length || jQuery('#cleantalk_notice_trial').length) {\n apbctBannerCheck();\n }\n\n jQuery(document).on('change', '#apbct_settings_templates_export', function() {\n let optionSelected = jQuery('option:selected', this);\n if ( optionSelected.data('id') === 'new_template' ) {\n jQuery(this).parent().parent().find('#apbct_settings_templates_export_name').show();\n } else {\n jQuery(this).parent().parent().find('#apbct_settings_templates_export_name').hide();\n }\n });\n\n apbctSaveButtonPosition();\n let debounceTimer;\n window.addEventListener('scroll', function() {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(function() {\n apbctSaveButtonPosition();\n }, 50);\n apbctNavigationMenuPosition();\n });\n jQuery('#ct_adv_showhide a').on('click', apbctSaveButtonPosition);\n\n\n /**\n * Change cleantalk account email\n */\n jQuery('#apbct-change-account-email').on('click', function(e) {\n e.preventDefault();\n\n let $this = jQuery(this);\n let accountEmailField = jQuery('#apbct-account-email');\n let accountEmail = accountEmailField.text();\n\n $this.toggleClass('active');\n\n if ($this.hasClass('active')) {\n $this.text($this.data('save-text'));\n accountEmailField.attr('contenteditable', 'true');\n accountEmailField.on('keydown', function(e) {\n if (e.code === 'Enter') {\n e.preventDefault();\n }\n });\n accountEmailField.on('input', function(e) {\n if (e.inputType === 'insertParagraph') {\n e.preventDefault();\n }\n });\n } else {\n apbct_admin_sendAJAX(\n {\n action: 'apbct_update_account_email',\n accountEmail: accountEmail,\n },\n {\n timeout: 5000,\n callback: function(result, data, params, obj) {\n if (result.success !== undefined && result.success === 'ok') {\n if (result.manuallyLink !== undefined) {\n jQuery('#apbct-key-manually-link').attr('href', result.manuallyLink);\n }\n }\n\n if (result.error !== undefined) {\n jQuery('#apbct-account-email').css('border-color', 'red');\n }\n },\n },\n );\n\n accountEmailField.attr('contenteditable', 'false');\n $this.text($this.data('default-text'));\n }\n });\n\n /**\n * Validate apkikey and hide get auto btn\n */\n jQuery('#apbct_setting_apikey').on('input', function() {\n let enteredValue = jQuery(this).val();\n jQuery('#apbct_settings__key_line__save_settings').off('click');\n let keyBad = enteredValue !== '' && enteredValue.match(/^[a-z\\d]{8,30}\\s*$/) === null;\n jQuery('#apbct_settings__key_is_bad').hide();\n jQuery('#apbct_showApiKey').hide();\n jQuery('#apbct_settings__account_name_ob').hide();\n jQuery('#apbct_settings__no_agreement_notice').hide();\n if (enteredValue === '') {\n jQuery('#apbct_button__key_line__save_changes_wrapper').hide();\n jQuery('#apbct_button__get_key_auto__wrapper').show();\n jQuery('#apbct_button__get_key_manual_chunk').show();\n } else {\n jQuery('#apbct_button__key_line__save_changes_wrapper').show();\n jQuery('#apbct_button__get_key_auto__wrapper').hide();\n jQuery('#apbct_button__get_key_manual_chunk').hide();\n if (keyBad) {\n jQuery('#apbct_settings__key_line__save_settings').on('click',\n function(e) {\n e.preventDefault();\n jQuery('#apbct_settings__key_is_bad').show();\n apbctHighlightElement('apbct_setting_apikey', 3);\n },\n );\n }\n }\n });\n\n if ( jQuery('#apbct_setting_apikey').val() && ctSettingsPage.key_is_ok) {\n jQuery('#apbct_button__get_key_auto__wrapper').hide();\n }\n\n /**\n * Handle synchronization errors when key is no ok to force user check the key and restart the sync\n */\n if ( !ctSettingsPage.key_is_ok ) {\n jQuery('button.cleantalk_link[value=\"save_changes\"]').on('click',\n function(e) {\n e.preventDefault();\n if (!jQuery('#sync_required_notice').length) {\n jQuery( '

' +\n 'Synchronization process failed. Please, check the acces key and restart the synch.' +\n '

' ).insertAfter( jQuery('#apbct_button__sync') );\n }\n apbctHighlightElement('apbct_setting_apikey', 3);\n apbctHighlightElement('apbct_button__sync', 3);\n jQuery('#apbct_button__get_key_auto__wrapper').show();\n },\n );\n }\n\n /**\n * Open WP gallery for adding custom logo\n */\n jQuery('#apbct-custom-logo-open-gallery').click(function(e) {\n e.preventDefault();\n\n const button = jQuery(this);\n\n const customUploader = wp.media({\n library: {\n type: 'image',\n },\n multiple: false,\n });\n\n customUploader.on('select', function() {\n const image = customUploader.state().get('selection').first().toJSON();\n\n button.parent().prev().attr( 'src', image.url );\n jQuery('#cleantalk_custom_logo').val( image.id );\n });\n\n customUploader.open();\n });\n\n /**\n * Remove selected logo\n */\n jQuery('#apbct-custom-logo-remove-image').click(function(e) {\n e.preventDefault();\n\n if ( true === confirm( 'Sure?' ) ) {\n const src = jQuery(this).parent().prev().data('src');\n jQuery(this).parent().prev().attr('src', src);\n jQuery(this).prev().prev().val('');\n }\n });\n\n jQuery('button[id*=\"apbct-action-adjust-change-\"]').click(function(e) {\n e.preventDefault();\n\n let data = {};\n data.action = 'apbct_action_adjust_change';\n data.adjust = jQuery(this).data('adjust');\n\n let params = {};\n params.button = document.getElementById('apbct-action-adjust-change-' + data.adjust);\n params.notJson = true;\n\n params.callback = function() {\n document.location.reload();\n };\n\n apbct_admin_sendAJAX(data, params);\n });\n\n jQuery('button[id*=\"apbct-action-adjust-reverse-\"]').click(function(e) {\n e.preventDefault();\n\n let data = {};\n data.action = 'apbct_action_adjust_reverse';\n data.adjust = jQuery(this).data('adjust');\n\n let params = {};\n params.button = document.getElementById('apbct-action-adjust-reverse-' + data.adjust);\n params.notJson = true;\n\n params.callback = function() {\n document.location.reload();\n };\n\n apbct_admin_sendAJAX(data, params);\n });\n\n document.querySelector('.apbct_hidden_section_nav_mob_btn').addEventListener('click', () => {\n document.querySelector('#apbct_hidden_section_nav ul').style.display = 'block';\n document.querySelector('.apbct_hidden_section_nav_mob_btn').style.display = 'none';\n });\n\n document.querySelector('.apbct_hidden_section_nav_mob_btn-close').addEventListener('click', () => {\n document.querySelector('#apbct_hidden_section_nav ul').style.display = 'none';\n document.querySelector('.apbct_hidden_section_nav_mob_btn').style.display = 'block';\n });\n\n // Hide/show EmailEncoder replacing text textarea\n apbctManageEmailEncoderCustomTextField();\n\n if (window.location.hash) {\n const anchor = window.location.hash.substring(1);\n handleAnchorDetection(anchor);\n }\n});\n\n/**\n * Detect ancors and open advanced settings before scroll\n * @param {string} anchor\n */\nfunction handleAnchorDetection(anchor) {\n let advSettings = document.querySelector('#apbct_settings__advanced_settings');\n if ( 'none' === advSettings.style.display ) {\n apbctExceptedShowHide('apbct_settings__advanced_settings');\n }\n scrollToAnchor('#' + anchor);\n}\n\n/**\n * Scroll to the target element ID\n * @param {string} anchorId Anchor target element ID\n */\nfunction scrollToAnchor(anchorId) {\n const targetElement = document.querySelector(anchorId);\n if (targetElement) {\n targetElement.scrollIntoView({\n block: 'end',\n });\n }\n}\n\n/**\n * Hide/show EmailEncoder replacing text textarea\n */\nfunction apbctManageEmailEncoderCustomTextField() {\n const replacingText = document\n .querySelector('#apbct_setting_data__email_decoder_obfuscation_custom_text');\n let replacingTextWrapperSub;\n if (replacingText !== null) {\n replacingTextWrapperSub = typeof replacingText.parentElement !== 'undefined' ?\n replacingText.parentElement :\n null;\n }\n document.querySelectorAll('.apbct_setting---data__email_decoder_obfuscation_mode').forEach((elem) => {\n // visibility set on saved settings\n if (replacingTextWrapperSub && elem.checked && elem.value !== 'replace') {\n replacingTextWrapperSub.classList.add('hidden');\n }\n // visibility set on change\n elem.addEventListener('click', (event) => {\n if (typeof replacingTextWrapperSub !== 'undefined') {\n if (event.target.value === 'replace') {\n replacingTextWrapperSub.classList.remove('hidden');\n } else {\n replacingTextWrapperSub.classList.add('hidden');\n }\n }\n });\n });\n}\n\n/**\n * Checking current account status for renew notice\n */\nfunction apbctBannerCheck() {\n let bannerChecker = setInterval( function() {\n apbct_admin_sendAJAX(\n {action: 'apbct_settings__check_renew_banner'},\n {\n callback: function(result, data, params, obj) {\n if (result.close_renew_banner) {\n if (jQuery('#cleantalk_notice_renew').length) {\n jQuery('#cleantalk_notice_renew').hide('slow');\n }\n if (jQuery('#cleantalk_notice_trial').length) {\n jQuery('#cleantalk_notice_trial').hide('slow');\n }\n clearInterval(bannerChecker);\n }\n },\n },\n );\n }, 900000);\n}\n\n/**\n * Select elems like #{selector} or .{selector}\n * Selector passed in string separated by ,\n *\n * @param {string|array} elems\n * @return {*}\n */\nfunction apbctGetElems(elems) {\n elems = elems.split(',');\n for ( let i=0, len = elems.length, tmp; i < len; i++) {\n tmp = jQuery('#'+elems[i]);\n elems[i] = tmp.length === 0 ? jQuery('.'+elems[i]) : tmp;\n }\n return elems;\n}\n\n/**\n * Select elems like #{selector} or .{selector}\n * Selector could be passed in a string ( separated by comma ) or in array ( [ elem1, elem2, ... ] )\n *\n * @param {string|array} elems\n * @return {array}\n */\nfunction apbctGetElemsNative(elems) {\n // Make array from a string\n if (typeof elems === 'string') {\n elems = elems.split(',');\n }\n\n let out = [];\n\n elems.forEach(function(elem, i, arr) {\n // try to get elements with such IDs\n let tmp = document.getElementById(elem);\n if (tmp !== null) {\n out.push( tmp[key] );\n return;\n }\n\n // try to get elements with such class name\n // write each elem from collection to new element of output array\n tmp = document.getElementsByClassName(elem);\n if (tmp !== null && tmp.length !==0 ) {\n for (key in tmp) {\n if ( +key >= 0 ) {\n out.push( tmp[key] );\n }\n }\n }\n });\n\n return out;\n}\n\n/**\n * @param {string|array} elems\n */\nfunction apbctShowHideElem(elems) {\n elems = apbctGetElems(elems);\n for ( let i=0, len = elems.length; i < len; i++) {\n elems[i].each(function(i, elem) {\n elem = jQuery(elem);\n let label = elem.next('label') || elem.prev('label') || null;\n if (elem.is(':visible')) {\n elem.hide();\n if (label) label.hide();\n } else {\n elem.show();\n if (label) label.show();\n }\n });\n }\n}\n\n/**\n * @param {string|array} element\n */\nfunction apbctExceptedShowHide(element) { // eslint-disable-line no-unused-vars\n let toHide = [\n 'apbct_settings__dwpms_settings',\n 'apbct_settings__advanced_settings',\n 'trusted_and_affiliate__special_span',\n ];\n let index = toHide.indexOf(element);\n if (index !== -1) {\n toHide.splice(index, 1);\n }\n apbctShowHideElem(element);\n toHide.forEach((toHideElem) => {\n if (document.getElementById(toHideElem) && document.getElementById(toHideElem).style.display !== 'none') {\n apbctShowHideElem(toHideElem);\n }\n });\n}\n\n/**\n * @param {mixed} event\n * @param {string} id\n */\nfunction apbctShowRequiredGroups(event, id) { // eslint-disable-line no-unused-vars\n let required = document.getElementById('apbct_settings__dwpms_settings');\n if (required && required.style.display === 'none') {\n let originEvent = event;\n event.preventDefault();\n apbctShowHideElem('apbct_settings__dwpms_settings');\n document.getElementById(id).dispatchEvent(new originEvent.constructor(originEvent.type, originEvent));\n }\n}\n\n/**\n * Settings dependences. Switch|toggle depended elements state (disabled|enabled)\n * Recieve list of selectors ( without class mark (.) or id mark (#) )\n *\n * @param {string|array} ids\n * @param {int} enable\n */\nfunction apbctSettingsDependencies(ids, enable) { // eslint-disable-line no-unused-vars\n enable = ! isNaN(enable) ? enable : null;\n\n // Get elements\n let elems = apbctGetElemsNative( ids );\n\n elems.forEach(function(elem, i, arr) {\n let doDisable = function() {\n elem.setAttribute('disabled', 'disabled');\n };\n let doEnable = function() {\n elem.removeAttribute('disabled');\n };\n\n // Set defined state\n if (enable === null) {\n enable = elem.getAttribute('disabled') === null ? 0 : 1;\n }\n\n enable === 1 ? doEnable() : doDisable();\n\n if ( elem.getAttribute('apbct_children') !== null) {\n let state = apbctSettingsDependenciesGetState( elem ) && enable;\n if ( state !== null ) {\n apbctSettingsDependencies( elem.getAttribute('apbct_children'), state );\n }\n }\n });\n}\n\n/**\n * @param {HTMLElement} elem\n * @return {int|null}\n */\nfunction apbctSettingsDependenciesGetState(elem) {\n let state;\n\n switch ( elem.getAttribute( 'type' ) ) {\n case 'checkbox':\n state = +elem.checked;\n break;\n case 'radio':\n state = +(+elem.getAttribute('value') === 1);\n break;\n default:\n state = null;\n }\n\n return state;\n}\n\n/**\n * @param {HTMLElement} label\n * @param {string} settingId\n */\nfunction apbctSettingsShowDescription(label, settingId) {\n let removeDescFunc = function(e) {\n const callerIsPopup = jQuery(e.target).parent('.apbct_long_desc').length != 0;\n const callerIsHideCross = jQuery(e.target).hasClass('apbct_long_desc__cancel');\n const descIsShown = jQuery('.apbct_long_desc__title').length > 0;\n if (descIsShown && !callerIsPopup || callerIsHideCross) {\n jQuery('.apbct_long_desc').remove();\n jQuery(document).off('click', removeDescFunc);\n }\n };\n\n label.after('
');\n let obj = jQuery('#apbct_long_desc__'+settingId);\n obj.append('')\n .append('
')\n .css({\n top: label.position().top - 5,\n left: label.position().left + 25,\n });\n\n\n apbct_admin_sendAJAX(\n {action: 'apbct_settings__get__long_description', setting_id: settingId},\n {\n spinner: obj.children('img'),\n callback: function(result, data, params, obj) {\n obj.empty()\n .append('
')\n .append('')\n .append('

'+result.title+'

')\n .append('

'+result.desc+'

');\n\n jQuery(document).on('click', removeDescFunc);\n },\n },\n obj,\n );\n}\n\n/**\n * Set position for navigation menu\n * @return {void}\n */\nfunction apbctNavigationMenuPosition() {\n const navBlock = document.querySelector('#apbct_hidden_section_nav ul');\n const rightBtnSave = document.querySelector('#apbct_settings__button_section');\n if (!navBlock || !rightBtnSave) {\n return;\n }\n const scrollPosition = window.scrollY;\n const windowWidth = window.innerWidth;\n if (scrollPosition > 1000) {\n navBlock.style.position = 'fixed';\n rightBtnSave.style.position = 'fixed';\n } else {\n navBlock.style.position = 'static';\n rightBtnSave.style.position = 'static';\n }\n\n if (windowWidth < 768) {\n rightBtnSave.style.position = 'fixed';\n }\n}\n\n/**\n * Set position for save button, hide it if scrolled to the bottom\n * @return {void}\n */\nfunction apbctSaveButtonPosition() {\n if (\n document.getElementById('apbct_settings__before_advanced_settings') === null ||\n document.getElementById('apbct_settings__after_advanced_settings') === null ||\n document.getElementById('apbct_settings__button_section') === null ||\n document.getElementById('apbct_settings__advanced_settings') === null ||\n document.getElementById('apbct_hidden_section_nav') === null\n ) {\n return;\n }\n\n if (!ctSettingsPage.key_is_ok) {\n jQuery('#apbct_settings__main_save_button').hide();\n return;\n }\n\n const additionalSaveButton =\n document.querySelector('#apbct_settings__button_section, cleantalk_link[value=\"save_changes\"]');\n if (!additionalSaveButton) {\n return;\n }\n\n const scrollPosition = window.scrollY;\n const documentHeight = document.documentElement.scrollHeight;\n const windowHeight = window.innerHeight;\n const threshold = 800;\n if (scrollPosition + windowHeight >= documentHeight - threshold) {\n additionalSaveButton.style.display = 'none';\n } else {\n additionalSaveButton.style.display = 'block';\n }\n\n const advSettingsBlock = document.getElementById('apbct_settings__advanced_settings');\n const mainSaveButton = document.getElementById('apbct_settings__block_main_save_button');\n if (!advSettingsBlock || !mainSaveButton) {\n return;\n }\n\n if (advSettingsBlock.style.display == 'none') {\n mainSaveButton.classList.remove('apbct_settings__position_main_save_button');\n } else {\n mainSaveButton.classList.add('apbct_settings__position_main_save_button');\n }\n}\n\n/**\n * Hightlights element\n *\n * @param {string} id\n * @param {int} times\n */\nfunction apbctHighlightElement(id, times) {\n times = times-1 || 0;\n let keyField = jQuery('#'+id);\n jQuery('html, body').animate({scrollTop: keyField.offset().top - 100}, 'slow');\n keyField.addClass('apbct_highlighted');\n keyField.animate({opacity: 0}, 400, 'linear', function() {\n keyField.animate({opacity: 1}, 400, 'linear', function() {\n if (times>0) {\n apbctHighlightElement(id, times);\n } else {\n keyField.removeClass('apbct_highlighted');\n }\n });\n });\n}\n"],"names":["handleAnchorDetection","anchor","document","querySelector","style","display","apbctExceptedShowHide","scrollToAnchor","anchorId","targetElement","scrollIntoView","block","apbctManageEmailEncoderCustomTextField","replacingText","let","replacingTextWrapperSub","parentElement","querySelectorAll","forEach","elem","checked","value","classList","add","addEventListener","event","target","remove","apbctBannerCheck","bannerChecker","setInterval","apbct_admin_sendAJAX","action","callback","result","data","params","obj","close_renew_banner","jQuery","length","hide","clearInterval","apbctGetElems","elems","i","len","split","tmp","apbctGetElemsNative","out","arr","getElementById","push","key","getElementsByClassName","apbctShowHideElem","each","label","next","prev","is","show","element","toHide","index","indexOf","splice","toHideElem","apbctShowRequiredGroups","id","required","originEvent","preventDefault","dispatchEvent","constructor","type","apbctSettingsDependencies","ids","enable","isNaN","state","getAttribute","removeAttribute","setAttribute","apbctSettingsDependenciesGetState","apbctSettingsShowDescription","settingId","removeDescFunc","e","callerIsPopup","parent","callerIsHideCross","hasClass","off","after","append","css","top","position","left","setting_id","spinner","children","empty","title","desc","on","apbctNavigationMenuPosition","scrollPosition","windowWidth","navBlock","rightBtnSave","window","scrollY","innerWidth","apbctSaveButtonPosition","advSettingsBlock","mainSaveButton","ctSettingsPage","key_is_ok","additionalSaveButton","documentHeight","documentElement","scrollHeight","innerHeight","apbctHighlightElement","times","keyField","animate","scrollTop","offset","addClass","opacity","removeClass","ready","currentTarget","parseInt","getComputedStyle","direction","this","val","attr","timezone","Date","getTimezoneOffset","ct_admin_timezone","timeout","button","setTimeout","reload","location","getTemplates","cleantalkModal","loaded","open","optionSelected","console","log","template_id","template_name","settings","notJson","success","insertAfter","close","templateNameInput","templateName","key_changed","click","self","find","debounceTimer","clearTimeout","$this","accountEmailField","accountEmail","text","toggleClass","code","inputType","undefined","manuallyLink","error","enteredValue","keyBad","match","customUploader","wp","media","library","multiple","image","get","first","toJSON","url","confirm","src","adjust","hash","substring"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["cleantalk-admin-settings-page.js"],"sourcesContent":["jQuery(document).ready(function() {\n // Top level settings\n jQuery('.apbct_setting---data__email_decoder').on('click', (event) => {\n if ( event.target.type === 'checkbox' ) {\n let currentTarget = event.target.checked ? 1 : 2;\n document.querySelectorAll('input[id^=apbct_setting_data__email_decoder]')[currentTarget].checked = true;\n } else {\n document.getElementById('apbct_setting_data__email_decoder').checked = parseInt(event.target.value) === 1;\n }\n });\n\n // Crunch for Right to Left direction languages\n if (document.getElementsByClassName('apbct_settings-title')[0]) {\n if (getComputedStyle(document.getElementsByClassName('apbct_settings-title')[0]).direction === 'rtl') {\n jQuery('.apbct_switchers').css('text-align', 'right');\n }\n }\n\n // Show/Hide access key\n jQuery('#apbct_showApiKey').on('click', function(e) {\n e.preventDefault();\n jQuery(this).hide();\n jQuery('.apbct_settings-field--api_key').val(jQuery('.apbct_settings-field--api_key').attr('key'));\n jQuery('.apbct_settings-field--api_key+div').css('display', 'inline');\n });\n\n let d = new Date();\n let timezone = d.getTimezoneOffset()/60*(-1);\n jQuery('#ct_admin_timezone').val(timezone);\n\n // Key KEY automatically\n jQuery('#apbct_button__get_key_auto').on('click', function() {\n if (!jQuery('#apbct_license_agreed').is(':checked')) {\n jQuery('#apbct_settings__no_agreement_notice').show();\n apbctHighlightElement('apbct_license_agreed', 3);\n return;\n }\n apbct_admin_sendAJAX(\n {action: 'apbct_get_key_auto', ct_admin_timezone: timezone},\n {\n timeout: 25000,\n button: document.getElementById('apbct_button__get_key_auto' ),\n spinner: jQuery('#apbct_button__get_key_auto .apbct_preloader_button' ),\n callback: function(result, data, params, obj) {\n jQuery('#apbct_button__get_key_auto .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_button__get_key_auto .apbct_success').hide(300);\n }, 2000);\n if (result.reload) {\n document.location.reload();\n }\n if (result.getTemplates) {\n cleantalkModal.loaded = result.getTemplates;\n cleantalkModal.open();\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n }\n },\n },\n );\n });\n\n // Import settings\n jQuery( document ).on('click', '#apbct_settings_templates_import_button', function() {\n jQuery('#apbct-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#apbct_settings_templates_import'));\n let templateNameInput = jQuery('#apbct_settings_templates_import_name');\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n let data = {\n 'template_id': optionSelected.data('id'),\n 'template_name': optionSelected.data('name'),\n 'settings': optionSelected.data('settings'),\n };\n let button = this;\n apbct_admin_sendAJAX(\n {action: 'settings_templates_import', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#apbct_settings_templates_import_button .apbct_preloader_button' ),\n notJson: true,\n callback: function(result, data, params, obj) {\n if (result.success) {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n jQuery('#apbct_settings_templates_import_button .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_settings_templates_import_button .apbct_success').hide(300);\n }, 2000);\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n cleantalkModal.close();\n }, 2000);\n } else {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Export settings\n jQuery( document ).on('click', '#apbct_settings_templates_export_button', function() {\n jQuery('#apbct-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#apbct_settings_templates_export'));\n let templateNameInput = jQuery('#apbct_settings_templates_export_name');\n let data = {};\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n if ( optionSelected.data('id') === 'new_template' ) {\n let templateName = templateNameInput.val();\n if ( templateName === '' ) {\n templateNameInput.css('border-color', 'red');\n return;\n }\n data = {\n 'template_name': templateName,\n };\n } else {\n data = {\n 'template_id': optionSelected.data('id'),\n };\n }\n let button = this;\n apbct_admin_sendAJAX(\n {action: 'settings_templates_export', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#apbct_settings_templates_export_button .apbct_preloader_button' ),\n notJson: true,\n callback: function(result, data, params, obj) {\n if (result.success) {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n jQuery('#apbct_settings_templates_export_button .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_settings_templates_export_button .apbct_success').hide(300);\n }, 2000);\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n cleantalkModal.close();\n }, 2000);\n } else {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Reset settings\n jQuery( document ).on('click', '#apbct_settings_templates_reset_button', function() {\n let button = this;\n apbct_admin_sendAJAX(\n {action: 'settings_templates_reset'},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#apbct_settings_templates_reset_button .apbct_preloader_button' ),\n notJson: true,\n callback: function(result, data, params, obj) {\n if (result.success) {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n jQuery('#apbct_settings_templates_reset_button .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_settings_templates_reset_button .apbct_success').hide(300);\n }, 2000);\n document.addEventListener('cleantalkModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n cleantalkModal.close();\n }, 2000);\n } else {\n jQuery( '

' + result.data + '

' )\n .insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Sync button\n jQuery('#apbct_button__sync').on('click', function() {\n apbct_admin_sendAJAX(\n {action: 'apbct_sync'},\n {\n timeout: 25000,\n button: document.getElementById('apbct_button__sync' ),\n spinner: jQuery('#apbct_button__sync .apbct_preloader_button' ),\n callback: function(result, data, params, obj) {\n jQuery('#apbct_button__sync .apbct_success').show(300);\n setTimeout(function() {\n jQuery('#apbct_button__sync .apbct_success').hide(300);\n }, 2000);\n if (result.reload) {\n if ( ctSettingsPage.key_changed ) {\n jQuery('.key_changed_sync').hide(300);\n jQuery('.key_changed_success').show(300);\n setTimeout(function() {\n document.location.reload();\n }, 3000);\n } else {\n document.location.reload();\n }\n }\n },\n },\n );\n });\n\n if ( ctSettingsPage.key_changed ) {\n jQuery('#apbct_button__sync').click();\n }\n\n jQuery(document).on('click', '.apbct_settings-long_description---show', function() {\n self = jQuery(this);\n apbctSettingsShowDescription(self, self.attr('setting'));\n });\n\n if (jQuery('#cleantalk_notice_renew').length || jQuery('#cleantalk_notice_trial').length) {\n apbctBannerCheck();\n }\n\n jQuery(document).on('change', '#apbct_settings_templates_export', function() {\n let optionSelected = jQuery('option:selected', this);\n if ( optionSelected.data('id') === 'new_template' ) {\n jQuery(this).parent().parent().find('#apbct_settings_templates_export_name').show();\n } else {\n jQuery(this).parent().parent().find('#apbct_settings_templates_export_name').hide();\n }\n });\n\n apbctSaveButtonPosition();\n let debounceTimer;\n window.addEventListener('scroll', function() {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(function() {\n apbctSaveButtonPosition();\n }, 50);\n apbctNavigationMenuPosition();\n });\n jQuery('#ct_adv_showhide a').on('click', apbctSaveButtonPosition);\n\n\n /**\n * Change cleantalk account email\n */\n jQuery('#apbct-change-account-email').on('click', function(e) {\n e.preventDefault();\n\n let $this = jQuery(this);\n let accountEmailField = jQuery('#apbct-account-email');\n let accountEmail = accountEmailField.text();\n\n $this.toggleClass('active');\n\n if ($this.hasClass('active')) {\n $this.text($this.data('save-text'));\n accountEmailField.attr('contenteditable', 'true');\n accountEmailField.on('keydown', function(e) {\n if (e.code === 'Enter') {\n e.preventDefault();\n }\n });\n accountEmailField.on('input', function(e) {\n if (e.inputType === 'insertParagraph') {\n e.preventDefault();\n }\n });\n } else {\n apbct_admin_sendAJAX(\n {\n action: 'apbct_update_account_email',\n accountEmail: accountEmail,\n },\n {\n timeout: 5000,\n callback: function(result, data, params, obj) {\n if (result.success !== undefined && result.success === 'ok') {\n if (result.manuallyLink !== undefined) {\n jQuery('#apbct-key-manually-link').attr('href', result.manuallyLink);\n }\n }\n\n if (result.error !== undefined) {\n jQuery('#apbct-account-email').css('border-color', 'red');\n }\n },\n },\n );\n\n accountEmailField.attr('contenteditable', 'false');\n $this.text($this.data('default-text'));\n }\n });\n\n /**\n * Validate apkikey and hide get auto btn\n */\n jQuery('#apbct_setting_apikey').on('input', function() {\n let enteredValue = jQuery(this).val();\n jQuery('#apbct_settings__key_line__save_settings').off('click');\n let keyBad = enteredValue !== '' && enteredValue.match(/^[a-z\\d]{8,30}\\s*$/) === null;\n jQuery('#apbct_settings__key_is_bad').hide();\n jQuery('#apbct_showApiKey').hide();\n jQuery('#apbct_settings__account_name_ob').hide();\n jQuery('#apbct_settings__no_agreement_notice').hide();\n if (enteredValue === '') {\n jQuery('#apbct_button__key_line__save_changes_wrapper').hide();\n jQuery('#apbct_button__get_key_auto__wrapper').show();\n jQuery('#apbct_button__get_key_manual_chunk').show();\n } else {\n jQuery('#apbct_button__key_line__save_changes_wrapper').show();\n jQuery('#apbct_button__get_key_auto__wrapper').hide();\n jQuery('#apbct_button__get_key_manual_chunk').hide();\n if (keyBad) {\n jQuery('#apbct_settings__key_line__save_settings').on('click',\n function(e) {\n e.preventDefault();\n jQuery('#apbct_settings__key_is_bad').show();\n apbctHighlightElement('apbct_setting_apikey', 3);\n },\n );\n }\n }\n });\n\n if ( jQuery('#apbct_setting_apikey').val() && ctSettingsPage.key_is_ok) {\n jQuery('#apbct_button__get_key_auto__wrapper').hide();\n }\n\n /**\n * Handle synchronization errors when key is no ok to force user check the key and restart the sync\n */\n if ( !ctSettingsPage.key_is_ok ) {\n jQuery('button.cleantalk_link[value=\"save_changes\"]').on('click',\n function(e) {\n e.preventDefault();\n if (!jQuery('#sync_required_notice').length) {\n jQuery( '

' +\n 'Synchronization process failed. Please, check the acces key and restart the synch.' +\n '

' ).insertAfter( jQuery('#apbct_button__sync') );\n }\n apbctHighlightElement('apbct_setting_apikey', 3);\n apbctHighlightElement('apbct_button__sync', 3);\n jQuery('#apbct_button__get_key_auto__wrapper').show();\n },\n );\n }\n\n /**\n * Open WP gallery for adding custom logo\n */\n jQuery('#apbct-custom-logo-open-gallery').click(function(e) {\n e.preventDefault();\n\n const button = jQuery(this);\n\n const customUploader = wp.media({\n library: {\n type: 'image',\n },\n multiple: false,\n });\n\n customUploader.on('select', function() {\n const image = customUploader.state().get('selection').first().toJSON();\n\n button.parent().prev().attr( 'src', image.url );\n jQuery('#cleantalk_custom_logo').val( image.id );\n });\n\n customUploader.open();\n });\n\n /**\n * Remove selected logo\n */\n jQuery('#apbct-custom-logo-remove-image').click(function(e) {\n e.preventDefault();\n\n if ( true === confirm( 'Sure?' ) ) {\n const src = jQuery(this).parent().prev().data('src');\n jQuery(this).parent().prev().attr('src', src);\n jQuery(this).prev().prev().val('');\n }\n });\n\n jQuery('button[id*=\"apbct-action-adjust-change-\"]').click(function(e) {\n e.preventDefault();\n\n let data = {};\n data.action = 'apbct_action_adjust_change';\n data.adjust = jQuery(this).data('adjust');\n\n let params = {};\n params.button = document.getElementById('apbct-action-adjust-change-' + data.adjust);\n params.notJson = true;\n\n params.callback = function() {\n document.location.reload();\n };\n\n apbct_admin_sendAJAX(data, params);\n });\n\n jQuery('button[id*=\"apbct-action-adjust-reverse-\"]').click(function(e) {\n e.preventDefault();\n\n let data = {};\n data.action = 'apbct_action_adjust_reverse';\n data.adjust = jQuery(this).data('adjust');\n\n let params = {};\n params.button = document.getElementById('apbct-action-adjust-reverse-' + data.adjust);\n params.notJson = true;\n\n params.callback = function() {\n document.location.reload();\n };\n\n apbct_admin_sendAJAX(data, params);\n });\n\n document.querySelector('.apbct_hidden_section_nav_mob_btn').addEventListener('click', () => {\n document.querySelector('#apbct_hidden_section_nav ul').style.display = 'block';\n document.querySelector('.apbct_hidden_section_nav_mob_btn').style.display = 'none';\n });\n\n document.querySelector('.apbct_hidden_section_nav_mob_btn-close').addEventListener('click', () => {\n document.querySelector('#apbct_hidden_section_nav ul').style.display = 'none';\n document.querySelector('.apbct_hidden_section_nav_mob_btn').style.display = 'block';\n });\n\n // Hide/show EmailEncoder replacing text textarea\n apbctManageEmailEncoderCustomTextField();\n\n if (window.location.hash) {\n const anchor = window.location.hash.substring(1);\n handleAnchorDetection(anchor);\n }\n});\n\n/**\n * Detect ancors and open advanced settings before scroll\n * @param {string} anchor\n */\nfunction handleAnchorDetection(anchor) {\n let advSettings = document.querySelector('#apbct_settings__advanced_settings');\n if ( 'none' === advSettings.style.display ) {\n apbctExceptedShowHide('apbct_settings__advanced_settings');\n }\n scrollToAnchor('#' + anchor);\n}\n\n/**\n * Scroll to the target element ID\n * @param {string} anchorId Anchor target element ID\n */\nfunction scrollToAnchor(anchorId) {\n const targetElement = document.querySelector(anchorId);\n if (targetElement) {\n targetElement.scrollIntoView({\n block: 'end',\n });\n }\n}\n\n/**\n * Hide/show EmailEncoder replacing text textarea\n */\nfunction apbctManageEmailEncoderCustomTextField() {\n const replacingText = document\n .querySelector('#apbct_setting_data__email_decoder_obfuscation_custom_text');\n let replacingTextWrapperSub;\n if (replacingText !== null) {\n replacingTextWrapperSub = typeof replacingText.parentElement !== 'undefined' ?\n replacingText.parentElement :\n null;\n }\n document.querySelectorAll('.apbct_setting---data__email_decoder_obfuscation_mode').forEach((elem) => {\n // visibility set on saved settings\n if (replacingTextWrapperSub && elem.checked && elem.value !== 'replace') {\n replacingTextWrapperSub.classList.add('hidden');\n }\n // visibility set on change\n elem.addEventListener('click', (event) => {\n if (typeof replacingTextWrapperSub !== 'undefined') {\n if (event.target.value === 'replace') {\n replacingTextWrapperSub.classList.remove('hidden');\n } else {\n replacingTextWrapperSub.classList.add('hidden');\n }\n }\n });\n });\n}\n\n/**\n * Checking current account status for renew notice\n */\nfunction apbctBannerCheck() {\n let bannerChecker = setInterval( function() {\n apbct_admin_sendAJAX(\n {action: 'apbct_settings__check_renew_banner'},\n {\n callback: function(result, data, params, obj) {\n if (result.close_renew_banner) {\n if (jQuery('#cleantalk_notice_renew').length) {\n jQuery('#cleantalk_notice_renew').hide('slow');\n }\n if (jQuery('#cleantalk_notice_trial').length) {\n jQuery('#cleantalk_notice_trial').hide('slow');\n }\n clearInterval(bannerChecker);\n }\n },\n },\n );\n }, 900000);\n}\n\n/**\n * Select elems like #{selector} or .{selector}\n * Selector passed in string separated by ,\n *\n * @param {string|array} elems\n * @return {*}\n */\nfunction apbctGetElems(elems) {\n elems = elems.split(',');\n for ( let i=0, len = elems.length, tmp; i < len; i++) {\n tmp = jQuery('#'+elems[i]);\n elems[i] = tmp.length === 0 ? jQuery('.'+elems[i]) : tmp;\n }\n return elems;\n}\n\n/**\n * Select elems like #{selector} or .{selector}\n * Selector could be passed in a string ( separated by comma ) or in array ( [ elem1, elem2, ... ] )\n *\n * @param {string|array} elems\n * @return {array}\n */\nfunction apbctGetElemsNative(elems) {\n // Make array from a string\n if (typeof elems === 'string') {\n elems = elems.split(',');\n }\n\n let out = [];\n\n elems.forEach(function(elem, i, arr) {\n // try to get elements with such IDs\n let tmp = document.getElementById(elem);\n if (tmp !== null) {\n out.push( tmp[key] );\n return;\n }\n\n // try to get elements with such class name\n // write each elem from collection to new element of output array\n tmp = document.getElementsByClassName(elem);\n if (tmp !== null && tmp.length !==0 ) {\n for (key in tmp) {\n if ( +key >= 0 ) {\n out.push( tmp[key] );\n }\n }\n }\n });\n\n return out;\n}\n\n/**\n * @param {string|array} elems\n */\nfunction apbctShowHideElem(elems) {\n elems = apbctGetElems(elems);\n for ( let i=0, len = elems.length; i < len; i++) {\n elems[i].each(function(i, elem) {\n elem = jQuery(elem);\n let label = elem.next('label') || elem.prev('label') || null;\n if (elem.is(':visible')) {\n elem.hide();\n if (label) label.hide();\n } else {\n elem.show();\n if (label) label.show();\n }\n });\n }\n}\n\n/**\n * @param {string|array} element\n */\nfunction apbctExceptedShowHide(element) { // eslint-disable-line no-unused-vars\n let toHide = [\n 'apbct_settings__dwpms_settings',\n 'apbct_settings__advanced_settings',\n 'trusted_and_affiliate__special_span',\n ];\n let index = toHide.indexOf(element);\n if (index !== -1) {\n toHide.splice(index, 1);\n }\n apbctShowHideElem(element);\n toHide.forEach((toHideElem) => {\n if (document.getElementById(toHideElem) && document.getElementById(toHideElem).style.display !== 'none') {\n apbctShowHideElem(toHideElem);\n }\n });\n}\n\n/**\n * @param {mixed} event\n * @param {string} id\n */\nfunction apbctShowRequiredGroups(event, id) { // eslint-disable-line no-unused-vars\n let required = document.getElementById('apbct_settings__dwpms_settings');\n if (required && required.style.display === 'none') {\n let originEvent = event;\n event.preventDefault();\n apbctShowHideElem('apbct_settings__dwpms_settings');\n document.getElementById(id).dispatchEvent(new originEvent.constructor(originEvent.type, originEvent));\n }\n}\n\n/**\n * Settings dependences. Switch|toggle depended elements state (disabled|enabled)\n * Recieve list of selectors ( without class mark (.) or id mark (#) )\n *\n * @param {string|array} ids\n * @param {int} enable\n */\nfunction apbctSettingsDependencies(ids, enable) { // eslint-disable-line no-unused-vars\n enable = ! isNaN(enable) ? enable : null;\n\n // Get elements\n let elems = apbctGetElemsNative( ids );\n\n elems.forEach(function(elem, i, arr) {\n let doDisable = function() {\n elem.setAttribute('disabled', 'disabled');\n };\n let doEnable = function() {\n elem.removeAttribute('disabled');\n };\n\n // Set defined state\n if (enable === null) {\n enable = elem.getAttribute('disabled') === null ? 0 : 1;\n }\n\n enable === 1 ? doEnable() : doDisable();\n\n if ( elem.getAttribute('apbct_children') !== null) {\n let state = apbctSettingsDependenciesGetState( elem ) && enable;\n if ( state !== null ) {\n apbctSettingsDependencies( elem.getAttribute('apbct_children'), state );\n }\n }\n });\n}\n\n/**\n * @param {HTMLElement} elem\n * @return {int|null}\n */\nfunction apbctSettingsDependenciesGetState(elem) {\n let state;\n\n switch ( elem.getAttribute( 'type' ) ) {\n case 'checkbox':\n state = +elem.checked;\n break;\n case 'radio':\n state = +(+elem.getAttribute('value') === 1);\n break;\n default:\n state = null;\n }\n\n return state;\n}\n\n/**\n * @param {HTMLElement} label\n * @param {string} settingId\n */\nfunction apbctSettingsShowDescription(label, settingId) {\n let removeDescFunc = function(e) {\n const callerIsPopup = jQuery(e.target).parent('.apbct_long_desc').length != 0;\n const callerIsHideCross = jQuery(e.target).hasClass('apbct_long_desc__cancel');\n const descIsShown = jQuery('.apbct_long_desc__title').length > 0;\n if (descIsShown && !callerIsPopup || callerIsHideCross) {\n jQuery('.apbct_long_desc').remove();\n jQuery(document).off('click', removeDescFunc);\n }\n };\n\n label.after('
');\n let obj = jQuery('#apbct_long_desc__'+settingId);\n obj.append('')\n .append('
')\n .css({\n top: label.position().top - 5,\n left: label.position().left + 25,\n });\n\n\n apbct_admin_sendAJAX(\n {action: 'apbct_settings__get__long_description', setting_id: settingId},\n {\n spinner: obj.children('img'),\n callback: function(result, data, params, obj) {\n obj.empty()\n .append('
')\n .append('')\n .append('

'+result.title+'

')\n .append('

'+result.desc+'

');\n\n jQuery(document).on('click', removeDescFunc);\n },\n },\n obj,\n );\n}\n\n/**\n * Set position for navigation menu\n * @return {void}\n */\nfunction apbctNavigationMenuPosition() {\n const navBlock = document.querySelector('#apbct_hidden_section_nav ul');\n const rightBtnSave = document.querySelector('#apbct_settings__button_section');\n if (!navBlock || !rightBtnSave) {\n return;\n }\n const scrollPosition = window.scrollY;\n const windowWidth = window.innerWidth;\n if (scrollPosition > 1000) {\n navBlock.style.position = 'fixed';\n rightBtnSave.style.position = 'fixed';\n } else {\n navBlock.style.position = 'static';\n rightBtnSave.style.position = 'static';\n }\n\n if (windowWidth < 768) {\n rightBtnSave.style.position = 'fixed';\n }\n}\n\n/**\n * Set position for save button, hide it if scrolled to the bottom\n * @return {void}\n */\nfunction apbctSaveButtonPosition() {\n if (\n document.getElementById('apbct_settings__before_advanced_settings') === null ||\n document.getElementById('apbct_settings__after_advanced_settings') === null ||\n document.getElementById('apbct_settings__button_section') === null ||\n document.getElementById('apbct_settings__advanced_settings') === null ||\n document.getElementById('apbct_hidden_section_nav') === null\n ) {\n return;\n }\n\n if (!ctSettingsPage.key_is_ok) {\n jQuery('#apbct_settings__main_save_button').hide();\n return;\n }\n\n const additionalSaveButton =\n document.querySelector('#apbct_settings__button_section, cleantalk_link[value=\"save_changes\"]');\n if (!additionalSaveButton) {\n return;\n }\n\n const scrollPosition = window.scrollY;\n const documentHeight = document.documentElement.scrollHeight;\n const windowHeight = window.innerHeight;\n const threshold = 800;\n if (scrollPosition + windowHeight >= documentHeight - threshold) {\n additionalSaveButton.style.display = 'none';\n } else {\n additionalSaveButton.style.display = 'block';\n }\n\n const advSettingsBlock = document.getElementById('apbct_settings__advanced_settings');\n const mainSaveButton = document.getElementById('apbct_settings__block_main_save_button');\n if (!advSettingsBlock || !mainSaveButton) {\n return;\n }\n\n if (advSettingsBlock.style.display == 'none') {\n mainSaveButton.classList.remove('apbct_settings__position_main_save_button');\n } else {\n mainSaveButton.classList.add('apbct_settings__position_main_save_button');\n }\n}\n\n/**\n * Hightlights element\n *\n * @param {string} id\n * @param {int} times\n */\nfunction apbctHighlightElement(id, times) {\n times = times-1 || 0;\n let keyField = jQuery('#'+id);\n jQuery('html, body').animate({scrollTop: keyField.offset().top - 100}, 'slow');\n keyField.addClass('apbct_highlighted');\n keyField.animate({opacity: 0}, 400, 'linear', function() {\n keyField.animate({opacity: 1}, 400, 'linear', function() {\n if (times>0) {\n apbctHighlightElement(id, times);\n } else {\n keyField.removeClass('apbct_highlighted');\n }\n });\n });\n}\n"],"file":"cleantalk-admin-settings-page.min.js"} \ No newline at end of file diff --git a/js/cleantalk-admin.min.js b/js/cleantalk-admin.min.js index f36a09939..13545bde2 100644 --- a/js/cleantalk-admin.min.js +++ b/js/cleantalk-admin.min.js @@ -1,2 +1,608 @@ -function apbct_admin_sendAJAX(t,n,c){let o=n.callback||null,i=n.callback_context||null,a=n.callback_params||null;var e=n.async||!0;let d=n.notJson||null;var l=n.timeout||15e3,c=c||null;let r=n.button||null,s=n.spinner||null,u=n.progressbar||null;"string"==typeof t?t=t+"&_ajax_nonce="+ctAdminCommon._ajax_nonce+"&no_cache="+Math.random():(t._ajax_nonce=ctAdminCommon._ajax_nonce,t.no_cache=Math.random()),r&&(r.setAttribute("disabled","disabled"),r.style.cursor="not-allowed"),s&&jQuery(s).css("display","inline"),jQuery.ajax({type:"POST",url:ctAdminCommon._ajax_url,data:t,async:e,success:function(e){r&&(r.removeAttribute("disabled"),r.style.cursor="pointer"),s&&jQuery(s).css("display","none"),(e=d?e:JSON.parse(e)).error?(setTimeout(function(){u&&u.fadeOut("slow")},1e3),"undefined"!=typeof cleantalkModal?(cleantalkModal.loaded="Error:
"+e.error.toString(),cleantalkModal.open()):alert("Error happens: "+(e.error||"Unkown"))):o&&(a?o.apply(i,a.concat(e,t,n,c)):o(e,t,n,c))},error:function(e,t,n){r&&(r.removeAttribute("disabled"),r.style.cursor="pointer"),s&&jQuery(s).css("display","none"),console.log("APBCT_AJAX_ERROR"),console.log(e),console.log(t),console.log(n)},timeout:l})}function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],n=document.createElement("div");n.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===a.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=o.data[0].decoded_email;var n=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,n&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?n.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:n.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,n.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),n=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(n&&n.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(n=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?n.innerText=ctPublicFunctions.text__ee_got_it:n.innerText=ctAdminCommon.text__ee_got_it,n.classList="apbct-email-encoder-got-it-button",n.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(i,o),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&a&&a.click()}),c.append(n),t.append(c))}},3e3):a?o.success?(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_blocked?ctShowDecodeComment(ctPublicFunctions.text__ee_blocked+": "+o.data[0].comment):ctShowDecodeComment(ctAdminCommon.text__ee_blocked+": "+o.data[0].comment)):(resetEncodedNodes(),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_cannot_connect?ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect+": "+o.apbct.comment):ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect+": "+o.data[0].comment)):console.log("result",o)}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 n=document.getElementById("apbct_popup_text");null!==t&&(document.body.classList.remove("apbct-popup-fade"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_email_decoder?n.innerText=ctPublicFunctions.text__ee_email_decoder+": "+e:n.innerText=ctAdminCommon.text__ee_email_decoder+": "+e,setTimeout(function(){t.setAttribute("style","display:none")},3e3))}function fillDecodedNodes(c,o){if(0{e.encoded_email===c[n].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[n].href||0!==c[n].href.indexOf("mailto:")&&0!==c[n].href.indexOf("tel:"))c[n].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[n])},2e3);else{let e;if(0===c[n].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[n].href.indexOf("tel:"))continue;e="tel:"}var i=c[n].href.replace(e,""),a=c[n].innerHTML;c[n].innerHTML=a.replace(i,t.decoded_email),c[n].href=e+t.decoded_email,c[n].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let n="";o.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(n=e.decoded_email)}),t.innerHTML=n})}c[n].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=o.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")}jQuery(document).ready(function(t){jQuery(".apbct_update_notice").on("click","button",function(){var e=new Date((new Date).getTime()+2592e6),t="https:"===location.protocol?"; secure":"";document.cookie="apbct_update_banner_closed=1; path=/; expires="+e.toUTCString()+"; samesite=lax"+t}),jQuery('li a[href="options-general.php?page=cleantalk"]').css("white-space","nowrap").css("display","inline-block"),jQuery("body").on("click",".apbct-notice .notice-dismiss-link",function(e){jQuery(e.target).parent().parent(".notice").after('

'+ctAdminCommon.apbctNoticeDismissSuccess+"

"),setTimeout(function(){jQuery("#apbct-notice-dismiss-success").fadeOut()},2e3),jQuery(e.target).parent().siblings(".apbct-notice .notice-dismiss").click()}),jQuery("body").on("click",".apbct-notice .notice-dismiss",function(e){e=jQuery(e.target).parent().attr("id");e&&apbct_admin_sendAJAX({action:"cleantalk_dismiss_notice",notice_id:e},{callback:null,notJson:!0})}),jQuery(".ct_username .row-actions .delete a").on("click",function(e){e.preventDefault(),confirm(ctAdminCommon.notice_when_deleting_user_text)&&(window.location=this.href)});let n=document.querySelector("#apbct_setting_forms__force_protection__On");var e;n&&n.addEventListener("click",function(e){n.checked&&!confirm(ctAdminCommon.apbctNoticeForceProtectionOn)&&e.preventDefault()}),t(".apbct-restore-spam-order-button").click(function(){var e=t(this).data("spam-order-id"),e={action:"apbct_restore_spam_order",_ajax_nonce:ctAdminCommon._ajax_nonce,order_id:e};t.ajax({type:"POST",url:ctAdminCommon._ajax_url,data:e,success:function(e){e.success?window.location.reload():alert(e.data.message)}})}),window.location.href.includes("options-general.php?page=cleantalk")&&(e=document.querySelector("[data-original-string]"))&&((ctAdminCommon.encodedEmailNode=e).style.cursor="pointer",e.addEventListener("click",ctFillDecodedEmailHandler))}); +jQuery(document).ready(function($) { + // Auto update banner close handler + jQuery('.apbct_update_notice').on('click', 'button', function() { + let ctDate = new Date(new Date().getTime() + 1000 * 86400 * 30 ); + let ctSecure = location.protocol === 'https:' ? '; secure' : ''; + document.cookie = 'apbct_update_banner_closed=1; path=/; expires=' + + ctDate.toUTCString() + '; samesite=lax' + ctSecure; + }); + + jQuery('li a[href="options-general.php?page=cleantalk"]').css('white-space', 'nowrap') + .css('display', 'inline-block'); + + jQuery('body').on('click', '.apbct-notice .notice-dismiss-link', function(e) { + jQuery(e.target).parent() + .parent('.notice') + .after('

' + + ctAdminCommon.apbctNoticeDismissSuccess + + '

'); + setTimeout(function() { + jQuery('#apbct-notice-dismiss-success').fadeOut(); + }, 2000); + jQuery(e.target).parent().siblings('.apbct-notice .notice-dismiss').click(); + }); + jQuery('body').on('click', '.apbct-notice .notice-dismiss', function(e) { + let apbctNoticeName = jQuery(e.target).parent().attr('id'); + if ( apbctNoticeName ) { + apbct_admin_sendAJAX( + { + 'action': 'cleantalk_dismiss_notice', + 'notice_id': apbctNoticeName, + }, + { + 'callback': null, + 'notJson': true, + }, + ); + } + }); + + // Notice when deleting user + jQuery('.ct_username .row-actions .delete a').on('click', function(e) { + e.preventDefault(); + + let result = confirm(ctAdminCommon.notice_when_deleting_user_text); + + if (result) { + window.location = this.href; + } + }); + + let btnForceProtectionOn = document.querySelector('#apbct_setting_forms__force_protection__On'); + if (btnForceProtectionOn) { + btnForceProtectionOn.addEventListener('click', function(e) { + if (btnForceProtectionOn.checked) { + let result = confirm(ctAdminCommon.apbctNoticeForceProtectionOn); + + if (!result) { + e.preventDefault(); + } + } + }); + } + // Restore spam order + $('.apbct-restore-spam-order-button').click(function() { + const spmOrderId = $(this).data('spam-order-id'); + let data = { + action: 'apbct_restore_spam_order', + _ajax_nonce: ctAdminCommon._ajax_nonce, + order_id: spmOrderId, + }; + $.ajax({ + type: 'POST', + url: ctAdminCommon._ajax_url, + data: data, + success: function(result) { + if (result.success) { + window.location.reload(); + } else { + alert(result.data.message); + } + }, + }); + }); + + // Email decoder example + if (window.location.href.includes('options-general.php?page=cleantalk')) { + let encodedEmailNode = document.querySelector('[data-original-string]'); + if (encodedEmailNode) { + ctAdminCommon.encodedEmailNode = encodedEmailNode; + encodedEmailNode.style.cursor = 'pointer'; + encodedEmailNode.addEventListener('click', ctFillDecodedEmailHandler); + } + } +}); +// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars +function apbct_admin_sendAJAX(data, params, obj) { + // Default params + let callback = params.callback || null; + let callbackContext = params.callback_context || null; + let callbackParams = params.callback_params || null; + let async = params.async || true; + let notJson = params.notJson || null; + let timeout = params.timeout || 15000; + var obj = obj || null; // eslint-disable-line no-var + let button = params.button || null; + let spinner = params.spinner || null; + let progressbar = params.progressbar || null; + + if (typeof (data) === 'string') { + data = data + '&_ajax_nonce=' + ctAdminCommon._ajax_nonce + '&no_cache=' + Math.random(); + } else { + data._ajax_nonce = ctAdminCommon._ajax_nonce; + data.no_cache = Math.random(); + } + // Button and spinner + if (button) { + button.setAttribute('disabled', 'disabled'); button.style.cursor = 'not-allowed'; + } + if (spinner) jQuery(spinner).css('display', 'inline'); + + jQuery.ajax({ + type: 'POST', + url: ctAdminCommon._ajax_url, + data: data, + async: async, + success: function(result) { + if (button) { + button.removeAttribute('disabled'); button.style.cursor = 'pointer'; + } + if (spinner) jQuery(spinner).css('display', 'none'); + if (!notJson) result = JSON.parse(result); + if (result.error) { + setTimeout(function() { + if (progressbar) progressbar.fadeOut('slow'); + }, 1000); + if ( typeof cleantalkModal !== 'undefined' ) { + // Show the result by modal + cleantalkModal.loaded = 'Error:
' + result.error.toString(); + cleantalkModal.open(); + } else { + alert('Error happens: ' + (result.error || 'Unkown')); + } + } else { + if (callback) { + if (callbackParams) { + callback.apply( callbackContext, callbackParams.concat( result, data, params, obj ) ); + } else { + callback(result, data, params, obj); + } + } + } + }, + error: function(jqXHR, textStatus, errorThrown) { + if (button) { + button.removeAttribute('disabled'); button.style.cursor = 'pointer'; + } + if (spinner) jQuery(spinner).css('display', 'none'); + console.log('APBCT_AJAX_ERROR'); + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + }, + timeout: timeout, + }); +} + +/** + * @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'); +} + //# sourceMappingURL=cleantalk-admin.min.js.map diff --git a/js/cleantalk-admin.min.js.map b/js/cleantalk-admin.min.js.map index 00466407a..c2304c29e 100644 --- a/js/cleantalk-admin.min.js.map +++ b/js/cleantalk-admin.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["cleantalk-admin.js","apbct-common-functions.js"],"names":["apbct_admin_sendAJAX","data","params","obj","let","callback","callbackContext","callback_context","callbackParams","callback_params","async","notJson","timeout","button","spinner","progressbar","ctAdminCommon","_ajax_nonce","Math","random","no_cache","setAttribute","style","cursor","jQuery","css","ajax","type","url","_ajax_url","success","result","removeAttribute","JSON","parse","error","setTimeout","fadeOut","cleantalkModal","loaded","toString","open","alert","apply","concat","jqXHR","textStatus","errorThrown","console","log","apbctSetEmailDecoderPopupAnimation","animationElements","animationWrapper","document","createElement","classList","i","length","apbctEEAnimationDogOne","innerText","append","ctFillDecodedEmailHandler","event","clickSource","ctWlBrandname","encodedEmail","ctPublic","this","removeEventListener","encodedEmailNodesIsMixed","wl_brandname","encodedEmailNodes","plugin_name","encodedEmailNode","body","add","popupHeaderWrapper","popupTextWrapper","popupTextWaiting","popupTextDecoding","encoderPopup","getElementById","ctPublicFunctions","text__ee_wait_for_decoding","innerHTML","waitingPopup","popupHeader","color","id","text__ee_decoding_process","apbctAjaxEmailDecodeBulk","event_javascript_data","getJavascriptClientData","post_url","location","href","referrer","encodedEmails","encodedEmailsCollection","indexOf","preventDefault","apbctTooltip","apbct","dataset","originalString","stringify","data__ajax_type","apbct_public_sendREST","method","ctSetCookie","emailEncoderPassKey","apbctEmailEncoderCallbackBulk","onErrorCallback","res","resetEncodedNodes","ctShowDecodeComment","action","apbct_public_sendAJAX","0","appendChild","is_allowed","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","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","ctFillDecodedEmail","target","ready","$","on","ctDate","Date","getTime","ctSecure","protocol","cookie","toUTCString","e","parent","after","apbctNoticeDismissSuccess","siblings","apbctNoticeName","attr","notice_id","confirm","notice_when_deleting_user_text","window","btnForceProtectionOn","checked","apbctNoticeForceProtectionOn","spmOrderId","order_id","reload","message","includes"],"mappings":"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","file":"cleantalk-admin.min.js","sourcesContent":["jQuery(document).ready(function($) {\n // Auto update banner close handler\n jQuery('.apbct_update_notice').on('click', 'button', function() {\n let ctDate = new Date(new Date().getTime() + 1000 * 86400 * 30 );\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = 'apbct_update_banner_closed=1; path=/; expires=' +\n ctDate.toUTCString() + '; samesite=lax' + ctSecure;\n });\n\n jQuery('li a[href=\"options-general.php?page=cleantalk\"]').css('white-space', 'nowrap')\n .css('display', 'inline-block');\n\n jQuery('body').on('click', '.apbct-notice .notice-dismiss-link', function(e) {\n jQuery(e.target).parent()\n .parent('.notice')\n .after('

' +\n ctAdminCommon.apbctNoticeDismissSuccess +\n '

');\n setTimeout(function() {\n jQuery('#apbct-notice-dismiss-success').fadeOut();\n }, 2000);\n jQuery(e.target).parent().siblings('.apbct-notice .notice-dismiss').click();\n });\n jQuery('body').on('click', '.apbct-notice .notice-dismiss', function(e) {\n let apbctNoticeName = jQuery(e.target).parent().attr('id');\n if ( apbctNoticeName ) {\n apbct_admin_sendAJAX(\n {\n 'action': 'cleantalk_dismiss_notice',\n 'notice_id': apbctNoticeName,\n },\n {\n 'callback': null,\n 'notJson': true,\n },\n );\n }\n });\n\n // Notice when deleting user\n jQuery('.ct_username .row-actions .delete a').on('click', function(e) {\n e.preventDefault();\n\n let result = confirm(ctAdminCommon.notice_when_deleting_user_text);\n\n if (result) {\n window.location = this.href;\n }\n });\n\n let btnForceProtectionOn = document.querySelector('#apbct_setting_forms__force_protection__On');\n if (btnForceProtectionOn) {\n btnForceProtectionOn.addEventListener('click', function(e) {\n if (btnForceProtectionOn.checked) {\n let result = confirm(ctAdminCommon.apbctNoticeForceProtectionOn);\n\n if (!result) {\n e.preventDefault();\n }\n }\n });\n }\n // Restore spam order\n $('.apbct-restore-spam-order-button').click(function() {\n const spmOrderId = $(this).data('spam-order-id');\n let data = {\n action: 'apbct_restore_spam_order',\n _ajax_nonce: ctAdminCommon._ajax_nonce,\n order_id: spmOrderId,\n };\n $.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n success: function(result) {\n if (result.success) {\n window.location.reload();\n } else {\n alert(result.data.message);\n }\n },\n });\n });\n\n // Email decoder example\n if (window.location.href.includes('options-general.php?page=cleantalk')) {\n let encodedEmailNode = document.querySelector('[data-original-string]');\n if (encodedEmailNode) {\n ctAdminCommon.encodedEmailNode = encodedEmailNode;\n encodedEmailNode.style.cursor = 'pointer';\n encodedEmailNode.addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n});\n// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars\nfunction apbct_admin_sendAJAX(data, params, obj) {\n // Default params\n let callback = params.callback || null;\n let callbackContext = params.callback_context || null;\n let callbackParams = params.callback_params || null;\n let async = params.async || true;\n let notJson = params.notJson || null;\n let timeout = params.timeout || 15000;\n var obj = obj || null; // eslint-disable-line no-var\n let button = params.button || null;\n let spinner = params.spinner || null;\n let progressbar = params.progressbar || null;\n\n if (typeof (data) === 'string') {\n data = data + '&_ajax_nonce=' + ctAdminCommon._ajax_nonce + '&no_cache=' + Math.random();\n } else {\n data._ajax_nonce = ctAdminCommon._ajax_nonce;\n data.no_cache = Math.random();\n }\n // Button and spinner\n if (button) {\n button.setAttribute('disabled', 'disabled'); button.style.cursor = 'not-allowed';\n }\n if (spinner) jQuery(spinner).css('display', 'inline');\n\n jQuery.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n async: async,\n success: function(result) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n if (!notJson) result = JSON.parse(result);\n if (result.error) {\n setTimeout(function() {\n if (progressbar) progressbar.fadeOut('slow');\n }, 1000);\n if ( typeof cleantalkModal !== 'undefined' ) {\n // Show the result by modal\n cleantalkModal.loaded = 'Error:
' + result.error.toString();\n cleantalkModal.open();\n } else {\n alert('Error happens: ' + (result.error || 'Unkown'));\n }\n } else {\n if (callback) {\n if (callbackParams) {\n callback.apply( callbackContext, callbackParams.concat( result, data, params, obj ) );\n } else {\n callback(result, data, params, obj);\n }\n }\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n console.log('APBCT_AJAX_ERROR');\n console.log(jqXHR);\n console.log(textStatus);\n console.log(errorThrown);\n },\n timeout: timeout,\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"]} \ No newline at end of file +{"version":3,"sources":["cleantalk-admin.js","apbct-common-functions.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"cleantalk-admin.min.js","sourcesContent":["jQuery(document).ready(function($) {\n // Auto update banner close handler\n jQuery('.apbct_update_notice').on('click', 'button', function() {\n let ctDate = new Date(new Date().getTime() + 1000 * 86400 * 30 );\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = 'apbct_update_banner_closed=1; path=/; expires=' +\n ctDate.toUTCString() + '; samesite=lax' + ctSecure;\n });\n\n jQuery('li a[href=\"options-general.php?page=cleantalk\"]').css('white-space', 'nowrap')\n .css('display', 'inline-block');\n\n jQuery('body').on('click', '.apbct-notice .notice-dismiss-link', function(e) {\n jQuery(e.target).parent()\n .parent('.notice')\n .after('

' +\n ctAdminCommon.apbctNoticeDismissSuccess +\n '

');\n setTimeout(function() {\n jQuery('#apbct-notice-dismiss-success').fadeOut();\n }, 2000);\n jQuery(e.target).parent().siblings('.apbct-notice .notice-dismiss').click();\n });\n jQuery('body').on('click', '.apbct-notice .notice-dismiss', function(e) {\n let apbctNoticeName = jQuery(e.target).parent().attr('id');\n if ( apbctNoticeName ) {\n apbct_admin_sendAJAX(\n {\n 'action': 'cleantalk_dismiss_notice',\n 'notice_id': apbctNoticeName,\n },\n {\n 'callback': null,\n 'notJson': true,\n },\n );\n }\n });\n\n // Notice when deleting user\n jQuery('.ct_username .row-actions .delete a').on('click', function(e) {\n e.preventDefault();\n\n let result = confirm(ctAdminCommon.notice_when_deleting_user_text);\n\n if (result) {\n window.location = this.href;\n }\n });\n\n let btnForceProtectionOn = document.querySelector('#apbct_setting_forms__force_protection__On');\n if (btnForceProtectionOn) {\n btnForceProtectionOn.addEventListener('click', function(e) {\n if (btnForceProtectionOn.checked) {\n let result = confirm(ctAdminCommon.apbctNoticeForceProtectionOn);\n\n if (!result) {\n e.preventDefault();\n }\n }\n });\n }\n // Restore spam order\n $('.apbct-restore-spam-order-button').click(function() {\n const spmOrderId = $(this).data('spam-order-id');\n let data = {\n action: 'apbct_restore_spam_order',\n _ajax_nonce: ctAdminCommon._ajax_nonce,\n order_id: spmOrderId,\n };\n $.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n success: function(result) {\n if (result.success) {\n window.location.reload();\n } else {\n alert(result.data.message);\n }\n },\n });\n });\n\n // Email decoder example\n if (window.location.href.includes('options-general.php?page=cleantalk')) {\n let encodedEmailNode = document.querySelector('[data-original-string]');\n if (encodedEmailNode) {\n ctAdminCommon.encodedEmailNode = encodedEmailNode;\n encodedEmailNode.style.cursor = 'pointer';\n encodedEmailNode.addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n});\n// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars\nfunction apbct_admin_sendAJAX(data, params, obj) {\n // Default params\n let callback = params.callback || null;\n let callbackContext = params.callback_context || null;\n let callbackParams = params.callback_params || null;\n let async = params.async || true;\n let notJson = params.notJson || null;\n let timeout = params.timeout || 15000;\n var obj = obj || null; // eslint-disable-line no-var\n let button = params.button || null;\n let spinner = params.spinner || null;\n let progressbar = params.progressbar || null;\n\n if (typeof (data) === 'string') {\n data = data + '&_ajax_nonce=' + ctAdminCommon._ajax_nonce + '&no_cache=' + Math.random();\n } else {\n data._ajax_nonce = ctAdminCommon._ajax_nonce;\n data.no_cache = Math.random();\n }\n // Button and spinner\n if (button) {\n button.setAttribute('disabled', 'disabled'); button.style.cursor = 'not-allowed';\n }\n if (spinner) jQuery(spinner).css('display', 'inline');\n\n jQuery.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n async: async,\n success: function(result) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n if (!notJson) result = JSON.parse(result);\n if (result.error) {\n setTimeout(function() {\n if (progressbar) progressbar.fadeOut('slow');\n }, 1000);\n if ( typeof cleantalkModal !== 'undefined' ) {\n // Show the result by modal\n cleantalkModal.loaded = 'Error:
' + result.error.toString();\n cleantalkModal.open();\n } else {\n alert('Error happens: ' + (result.error || 'Unkown'));\n }\n } else {\n if (callback) {\n if (callbackParams) {\n callback.apply( callbackContext, callbackParams.concat( result, data, params, obj ) );\n } else {\n callback(result, data, params, obj);\n }\n }\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n console.log('APBCT_AJAX_ERROR');\n console.log(jqXHR);\n console.log(textStatus);\n console.log(errorThrown);\n },\n timeout: timeout,\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"]} \ No newline at end of file diff --git a/js/cleantalk-comments-checkspam.min.js b/js/cleantalk-comments-checkspam.min.js index 7b50ba8e1..fa9c2b468 100644 --- a/js/cleantalk-comments-checkspam.min.js +++ b/js/cleantalk-comments-checkspam.min.js @@ -1,2 +1,503 @@ -let ctWorking=!(String.prototype.printf=function(){let e=this;for(var t in arguments){var c=e.substring(0,e.indexOf("%s",0)),a=e.substring(e.indexOf("%s",0)+2,e.length);e=c+arguments[t]+a}return e}),ctNewCheck=!0,ctCoolingDownFlag=!1,ctCloseAnimate=!0,ctAccurateCheck=!1,ctPause=!1,ctPrevAccurate=ctCommentsCheck.ct_prev_accurate,ctPrevFrom=ctCommentsCheck.ct_prev_from,ctPrevTill=ctCommentsCheck.ct_prev_till,ctCoolDownTime=9e4,ctRequestsCounter=0,ctMaxRequests=60,ctAjaxNonce=ctCommentsCheck.ct_ajax_nonce,ctCommentsTotal=0,ctCommentsChecked=0,ctCommentsSpam=0,ctCommentsBad=0,ctUnchecked="unset",ctDateFrom=0,ctDateTill=0;function animateComment(e,t){ctCloseAnimate?.3==e?jQuery("#comment-"+t).fadeTo(200,e,function(){animateComment(1,t)}):jQuery("#comment-"+t).fadeTo(200,e,function(){animateComment(.3,t)}):ctCloseAnimate=!0}function ctClearComments(){let e=0,t=0;jQuery("#ct_allow_date_range").is(":checked")&&(e=jQuery("#ct_date_range_from").val(),t=jQuery("#ct_date_range_till").val());var c="https:"===location.protocol?"; secure":"",c=(document.cookie="apbct_check_comments_offset=0; path=/; samesite=lax"+c,{action:"ajax_clear_comments",security:ctAjaxNonce,from:e,till:t});jQuery.ajax({type:"POST",url:ajaxurl,data:c,success:function(e){ctShowInfo(),ctSendComments()}})}function ctCoolingDownToggle(){ctCoolingDownFlag=!1,ctSendComments(),ctShowInfo()}function ctSendComments(){var e;!0!==ctCoolingDownFlag&&(ctRequestsCounter>=ctMaxRequests?(setTimeout(ctCoolingDownToggle,ctCoolDownTime),ctRequestsCounter=0,ctCoolingDownFlag=!0):(ctRequestsCounter++,e={action:"ajax_check_comments",security:ctAjaxNonce,new_check:ctNewCheck,unchecked:ctUnchecked,offset:Number(ctGetCookie("apbct_check_comments_offset"))},ctAccurateCheck&&(e.accurate_check=!0),ctDateFrom&&ctDateTill&&(e.from=ctDateFrom,e.till=ctDateTill),jQuery.ajax({type:"POST",url:ajaxurl,data:e,success:function(t){if(t=jQuery.parseJSON(t),parseInt(t.error))if(ctWorking=!1,confirm(t.error_message+". Do you want to proceed?"))ctSendComments();else{let e="edit-comments.php?page=ct_check_spam";0!=ctDateFrom&&0!=ctDateTill&&(e+="&from="+ctDateFrom+"&till="+ctDateTill),location.href=e}else{ctNewCheck=!1;var c=Number(ctGetCookie("apbct_check_comments_offset"))+100;if(1==parseInt(t.end)||!0===ctPause){1==parseInt(t.end)&&(document.cookie="ct_paused_spam_check=0; path=/; samesite=lax"),ctWorking=!1,jQuery("#ct_working_message").hide();let e="edit-comments.php?page=ct_check_spam";0!=ctDateFrom&&0!=ctDateTill&&(e+="&from="+ctDateFrom+"&till="+ctDateTill),document.cookie="apbct_check_comments_offset="+c+"; path=/; samesite=lax"+ctSecure,location.href=e}else if(0==parseInt(t.end)){ctCommentsChecked+=t.checked,ctCommentsSpam+=t.spam,ctCommentsBad+=t.bad,ctCommentsTotal+=t.total,ctUnchecked=ctCommentsTotal-ctCommentsChecked-ctCommentsBad;let e=String(ctCommentsCheck.ct_status_string);e=e.printf(ctCommentsChecked,ctCommentsSpam,ctCommentsBad),0= ctMaxRequests) { + setTimeout(ctCoolingDownToggle, ctCoolDownTime); + ctRequestsCounter = 0; + ctCoolingDownFlag = true; + return; + } else { + ctRequestsCounter++; + } + + let data = { + 'action': 'ajax_check_comments', + 'security': ctAjaxNonce, + 'new_check': ctNewCheck, + 'unchecked': ctUnchecked, + 'offset': Number(ctGetCookie('apbct_check_comments_offset')), + }; + + if (ctAccurateCheck) { + data['accurate_check'] = true; + } + + if (ctDateFrom && ctDateTill) { + data['from'] = ctDateFrom; + data['till'] = ctDateTill; + } + + jQuery.ajax({ + type: 'POST', + url: ajaxurl, + data: data, + success: function(msg) { + msg = jQuery.parseJSON(msg); + + if (parseInt(msg.error)) { + ctWorking = false; + if (!confirm(msg.error_message+'. Do you want to proceed?')) { + let newHref = 'edit-comments.php?page=ct_check_spam'; + if (ctDateFrom != 0 && ctDateTill != 0) { + newHref+='&from='+ctDateFrom+'&till='+ctDateTill; + } + location.href = newHref; + } else { + ctSendComments(); + } + } else { + ctNewCheck = false; + let offset = Number(ctGetCookie('apbct_check_comments_offset')) + 100; + + if (parseInt(msg.end) == 1 || ctPause === true) { + if (parseInt(msg.end) == 1) { + document.cookie = 'ct_paused_spam_check=0; path=/; samesite=lax'; + } + ctWorking = false; + jQuery('#ct_working_message').hide(); + let newHref = 'edit-comments.php?page=ct_check_spam'; + if (ctDateFrom != 0 && ctDateTill != 0) { + newHref+='&from='+ctDateFrom+'&till='+ctDateTill; + } + + document.cookie = 'apbct_check_comments_offset' + '=' + offset + '; path=/; samesite=lax'+ctSecure; + + location.href = newHref; + } else if (parseInt(msg.end) == 0) { + ctCommentsChecked += msg.checked; + ctCommentsSpam += msg.spam; + ctCommentsBad += msg.bad; + ctCommentsTotal += msg.total; + ctUnchecked = ctCommentsTotal - ctCommentsChecked - ctCommentsBad; + let statusString = String(ctCommentsCheck.ct_status_string); + statusString = statusString.printf(ctCommentsChecked, ctCommentsSpam, ctCommentsBad); + if (parseInt(ctCommentsSpam) > 0) { + statusString += ctCommentsCheck.ct_status_string_warning; + } + jQuery('#ct_checking_status').html(statusString); + jQuery('#ct_error_message').hide(); + // If DB woks not properly + if (+ctCommentsTotal < ctCommentsChecked + ctCommentsBad) { + document.cookie = 'ct_comments_start_check=1; path=/; samesite=lax'; + location.href = 'edit-comments.php?page=ct_check_spam'; + } + + document.cookie = 'apbct_check_comments_offset' + '=' + offset + '; path=/; samesite=lax'+ctSecure; + + ctSendComments(); + } + } + }, + error: function(jqXHR, textStatus, errorThrown) { + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('Check comments'); + setTimeout(ctSendComments(), 3000); + }, + timeout: 25000, + }); +} + +/** + * show info + */ +function ctShowInfo() { + if (ctWorking) { + if (ctCoolingDownFlag == true) { + jQuery('#ct_cooling_notice').html('Waiting for API to cool down. (About a minute)'); + jQuery('#ct_cooling_notice').show(); + return; + } else { + jQuery('#ct_cooling_notice').hide(); + } + + if (!ctCommentsTotal) { + let data = { + 'action': 'ajax_info_comments', + 'security': ctAjaxNonce, + }; + + if (ctDateFrom && ctDateTill) { + data['from'] = ctDateFrom; + data['till'] = ctDateTill; + } + + jQuery.ajax({ + type: 'POST', + url: ajaxurl, + data: data, + success: function(msg) { + msg = jQuery.parseJSON(msg); + jQuery('#ct_checking_status').html(msg.message); + ctCommentsTotal = msg.total; + ctCommentsSpam = msg.spam; + ctCommentsChecked = msg.checked; + ctCommentsBad = msg.bad; + }, + error: function(jqXHR, textStatus, errorThrown) { + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('Check comments'); + setTimeout(ctShowInfo(), 3000); + }, + timeout: 15000, + }); + } + } +} + +/** + * Function to toggle dependences + * + * @param {object} obj + * @param {mixed} secondary + */ +function ctToggleDepended(obj, secondary) { // eslint-disable-line no-unused-vars + secondary = secondary || null; + + let depended = jQuery(obj.data('depended')); + let state = obj.data('state'); + + if (!state && !secondary) { + obj.data('state', true); + depended.removeProp('disabled'); + } else { + obj.data('state', false); + depended.prop('disabled', true); + depended.removeProp('checked'); + if (depended.data('depended')) { + ctToggleDepended(depended, true); + } + } +} + +/** + * trash all + * + * @param {object} e + */ +function ctTrashAll( e ) { + let data = { + 'action': 'ajax_trash_all', + 'security': ctAjaxNonce, + }; + + jQuery('.' + e.target.id).addClass('disabled'); + jQuery('.spinner').css('visibility', 'visible'); + jQuery.ajax({ + type: 'POST', + url: ajaxurl, + data: data, + success: function( msg ) { + if ( msg > 0 ) { + jQuery('#cleantalk_comments_left').html(msg); + ctTrashAll( e ); + } else { + jQuery('.' + e.target.id).removeClass('disabled'); + jQuery('.spinner').css('visibility', 'hidden'); + location.href='edit-comments.php?page=ct_check_spam'; + } + }, + error: function(jqXHR, textStatus, errorThrown) { + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('Check comments'); + setTimeout(ctTrashAll( e ), 3000); + }, + timeout: 25000, + }); +} + +/** + * spam all + * + * @param {object} e + */ +function ctSpamAll( e ) { + let data = { + 'action': 'ajax_spam_all', + 'security': ctAjaxNonce, + }; + + jQuery('.' + e.target.id).addClass('disabled'); + jQuery('.spinner').css('visibility', 'visible'); + jQuery.ajax({ + type: 'POST', + url: ajaxurl, + data: data, + success: function( msg ) { + if ( msg > 0 ) { + jQuery('#cleantalk_comments_left').html(msg); + ctSpamAll( e ); + } else { + jQuery('.' + e.target.id).removeClass('disabled'); + jQuery('.spinner').css('visibility', 'hidden'); + location.href='edit-comments.php?page=ct_check_spam'; + } + }, + error: function(jqXHR, textStatus, errorThrown) { + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('Check comments'); + setTimeout(ctSpamAll( e ), 3000); + }, + timeout: 25000, + }); +} + +jQuery(document).ready(function() { + // Prev check parameters + if (ctPrevAccurate) { + jQuery('#ct_accurate_check').prop('checked', true); + } + if (ctPrevFrom) { + jQuery('#ct_allow_date_range').prop('checked', true).data('state', true); + jQuery('#ct_date_range_from').removeProp('disabled').val(ctPrevFrom); + jQuery('#ct_date_range_till').removeProp('disabled').val(ctPrevTill); + } + + // Toggle dependences + jQuery('#ct_allow_date_range').on('change', function() { + document.cookie = 'ct_spam_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax'; + document.cookie = 'ct_spam_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax'; + if ( this.checked ) { + document.cookie = 'ct_spam_dates_allowed=1; path=/; samesite=lax'; + jQuery('.ct_date').prop('checked', true).attr('disabled', false); + } else { + document.cookie = 'ct_spam_dates_allowed=0; path=/; samesite=lax'; + jQuery('.ct_date').prop('disabled', true).attr('disabled', true); + } + }); + + jQuery.datepicker.setDefaults(jQuery.datepicker.regional['en']); + var dates = jQuery('#ct_date_range_from, #ct_date_range_till').datepicker( // eslint-disable-line no-var + { + dateFormat: 'M d yy', + maxDate: '+0D', + changeMonth: true, + changeYear: true, + showAnim: 'slideDown', + onSelect: function(selectedDate) { + let option = this.id == 'ct_date_range_from' ? 'minDate' : 'maxDate'; + let instance = jQuery( this ).data( 'datepicker' ); + let date = jQuery.datepicker.parseDate( + instance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat, + selectedDate, instance.settings); + dates.not(this).datepicker('option', option, date); + document.cookie = 'ct_spam_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax'; + document.cookie = 'ct_spam_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax'; + }, + }, + ); + + // eslint-disable-next-line require-jsdoc + function ctStartCheck(continueCheck) { + continueCheck = continueCheck || null; + + if (jQuery('#ct_allow_date_range').is(':checked')) { + ctDateFrom = jQuery('#ct_date_range_from').val(); + ctDateTill = jQuery('#ct_date_range_till').val(); + + if (!(ctDateFrom != '' && ctDateTill != '')) { + alert('Please, specify a date range.'); + return; + } + } + + if (jQuery('#ct_accurate_check').is(':checked')) { + ctAccurateCheck = true; + } + + if ( + jQuery('#ct_accurate_check').is(':checked') && + ! jQuery('#ct_allow_date_range').is(':checked') + ) { + alert('Please, select a date range.'); + return; + } + + jQuery('.ct_to_hide').hide(); + jQuery('#ct_working_message').show(); + jQuery('#ct_preloader').show(); + jQuery('#ct_pause').show(); + + ctWorking = true; + + if (continueCheck) { + ctShowInfo(); + ctSendComments(); + } else { + ctClearComments(); + } + } + + // Check comments + jQuery('#ct_check_spam_button').click(function() { + document.cookie = 'ct_paused_spam_check=0; path=/; samesite=lax'; + ctStartCheck(false); + }); + jQuery('#ct_proceed_check_button').click(function() { + ctStartCheck(true); + }); + + // Pause the check + jQuery('#ct_pause').on('click', function() { + ctPause = true; + let ctCheck = { + 'accurate': ctAccurateCheck, + 'from': ctDateFrom, + 'till': ctDateTill, + }; + document.cookie = 'ct_paused_spam_check=' + JSON.stringify(ctCheck) + '; path=/; samesite=lax'; + }); + + + if (ctCommentsCheck.start === '1') { + document.cookie = 'ct_comments_start_check=0; expires=' + new Date(0).toUTCString() + '; path=/; samesite=lax'; + jQuery('#ct_check_spam_button').click(); + } + + // Delete all spam comments + jQuery('.ct_trash_all').click(function( e ) { + if (!confirm(ctCommentsCheck.ct_confirm_trash_all)) { + return false; + } + + ctTrashAll( e ); + }); + + // Mark as spam all spam comments + jQuery('.ct_spam_all').click(function( e ) { + if (!confirm(ctCommentsCheck.ct_confirm_spam_all)) { + return false; + } + + ctSpamAll( e ); + }); + + /** + * Checked ct_accurate_check + */ + jQuery('#ct_accurate_check').change(function() { + if (this.checked) { + jQuery('#ct_allow_date_range').prop('checked', true); + jQuery('.ct_date').prop('checked', true).attr('disabled', false); + } + }); +}); + + +/** + * Get cookie by name + * @param {string} name + * @return {string|undefined} + */ +function ctGetCookie(name) { + let matches = document.cookie.match(new RegExp( + '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)', + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + //# sourceMappingURL=cleantalk-comments-checkspam.min.js.map diff --git a/js/cleantalk-comments-checkspam.min.js.map b/js/cleantalk-comments-checkspam.min.js.map index d78e2fde4..34161b184 100644 --- a/js/cleantalk-comments-checkspam.min.js.map +++ b/js/cleantalk-comments-checkspam.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cleantalk-comments-checkspam.min.js","sources":["cleantalk-comments-checkspam.js"],"sourcesContent":["// Printf for JS\nString.prototype.printf = function() { // eslint-disable-line no-extend-native\n let formatted = this;\n for ( let arg in arguments ) { // eslint-disable-line guard-for-in,prefer-rest-params\n let beforeFormatted = formatted.substring(0, formatted.indexOf('%s', 0));\n let afterFormatted = formatted.substring(formatted.indexOf('%s', 0)+2, formatted.length);\n // eslint-disable-next-line guard-for-in,prefer-rest-params\n formatted = beforeFormatted + arguments[arg] + afterFormatted;\n }\n return formatted;\n};\n\n// Flags\nlet ctWorking = false;\nlet ctNewCheck = true;\nlet ctCoolingDownFlag = false;\nlet ctCloseAnimate = true;\nlet ctAccurateCheck = false;\nlet ctPause = false;\nlet ctPrevAccurate = ctCommentsCheck.ct_prev_accurate;\nlet ctPrevFrom = ctCommentsCheck.ct_prev_from;\nlet ctPrevTill = ctCommentsCheck.ct_prev_till;\n// Settings\nlet ctCoolDownTime = 90000;\nlet ctRequestsCounter = 0;\nlet ctMaxRequests = 60;\n// Variables\nlet ctAjaxNonce = ctCommentsCheck.ct_ajax_nonce;\nlet ctCommentsTotal = 0;\nlet ctCommentsChecked = 0;\nlet ctCommentsSpam = 0;\nlet ctCommentsBad = 0;\nlet ctUnchecked = 'unset';\nlet ctDateFrom = 0;\nlet ctDateTill = 0;\n\n/**\n * @param {mixed} to\n * @param {string} id\n */\nfunction animateComment(to, id) { // eslint-disable-line no-unused-vars\n if (ctCloseAnimate) {\n if (to==0.3) {\n jQuery('#comment-'+id).fadeTo(200, to, function() {\n animateComment(1, id);\n });\n } else {\n jQuery('#comment-'+id).fadeTo(200, to, function() {\n animateComment(0.3, id);\n });\n }\n } else {\n ctCloseAnimate =true;\n }\n}\n\n/**\n * clear comments\n */\nfunction ctClearComments() {\n let from = 0; let till = 0;\n if (jQuery('#ct_allow_date_range').is(':checked')) {\n from = jQuery('#ct_date_range_from').val();\n till = jQuery('#ct_date_range_till').val();\n }\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = 'apbct_check_comments_offset' + '=' + 0 + '; path=/; samesite=lax' + ctSecure;\n\n let data = {\n 'action': 'ajax_clear_comments',\n 'security': ctAjaxNonce,\n 'from': from,\n 'till': till,\n };\n\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function(msg) {\n ctShowInfo();\n ctSendComments();\n },\n });\n}\n\n/**\n * Continues the check after cooldown time\n * Called by ct_send_users();\n */\nfunction ctCoolingDownToggle() {\n ctCoolingDownFlag = false;\n ctSendComments();\n ctShowInfo();\n}\n\n/**\n * send comments\n */\nfunction ctSendComments() {\n if (ctCoolingDownFlag === true) {\n return;\n }\n\n if (ctRequestsCounter >= ctMaxRequests) {\n setTimeout(ctCoolingDownToggle, ctCoolDownTime);\n ctRequestsCounter = 0;\n ctCoolingDownFlag = true;\n return;\n } else {\n ctRequestsCounter++;\n }\n\n let data = {\n 'action': 'ajax_check_comments',\n 'security': ctAjaxNonce,\n 'new_check': ctNewCheck,\n 'unchecked': ctUnchecked,\n 'offset': Number(ctGetCookie('apbct_check_comments_offset')),\n };\n\n if (ctAccurateCheck) {\n data['accurate_check'] = true;\n }\n\n if (ctDateFrom && ctDateTill) {\n data['from'] = ctDateFrom;\n data['till'] = ctDateTill;\n }\n\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function(msg) {\n msg = jQuery.parseJSON(msg);\n\n if (parseInt(msg.error)) {\n ctWorking = false;\n if (!confirm(msg.error_message+'. Do you want to proceed?')) {\n let newHref = 'edit-comments.php?page=ct_check_spam';\n if (ctDateFrom != 0 && ctDateTill != 0) {\n newHref+='&from='+ctDateFrom+'&till='+ctDateTill;\n }\n location.href = newHref;\n } else {\n ctSendComments();\n }\n } else {\n ctNewCheck = false;\n let offset = Number(ctGetCookie('apbct_check_comments_offset')) + 100;\n\n if (parseInt(msg.end) == 1 || ctPause === true) {\n if (parseInt(msg.end) == 1) {\n document.cookie = 'ct_paused_spam_check=0; path=/; samesite=lax';\n }\n ctWorking = false;\n jQuery('#ct_working_message').hide();\n let newHref = 'edit-comments.php?page=ct_check_spam';\n if (ctDateFrom != 0 && ctDateTill != 0) {\n newHref+='&from='+ctDateFrom+'&till='+ctDateTill;\n }\n\n document.cookie = 'apbct_check_comments_offset' + '=' + offset + '; path=/; samesite=lax'+ctSecure;\n\n location.href = newHref;\n } else if (parseInt(msg.end) == 0) {\n ctCommentsChecked += msg.checked;\n ctCommentsSpam += msg.spam;\n ctCommentsBad += msg.bad;\n ctCommentsTotal += msg.total;\n ctUnchecked = ctCommentsTotal - ctCommentsChecked - ctCommentsBad;\n let statusString = String(ctCommentsCheck.ct_status_string);\n statusString = statusString.printf(ctCommentsChecked, ctCommentsSpam, ctCommentsBad);\n if (parseInt(ctCommentsSpam) > 0) {\n statusString += ctCommentsCheck.ct_status_string_warning;\n }\n jQuery('#ct_checking_status').html(statusString);\n jQuery('#ct_error_message').hide();\n // If DB woks not properly\n if (+ctCommentsTotal < ctCommentsChecked + ctCommentsBad) {\n document.cookie = 'ct_comments_start_check=1; path=/; samesite=lax';\n location.href = 'edit-comments.php?page=ct_check_spam';\n }\n\n document.cookie = 'apbct_check_comments_offset' + '=' + offset + '; path=/; samesite=lax'+ctSecure;\n\n ctSendComments();\n }\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctSendComments(), 3000);\n },\n timeout: 25000,\n });\n}\n\n/**\n * show info\n */\nfunction ctShowInfo() {\n if (ctWorking) {\n if (ctCoolingDownFlag == true) {\n jQuery('#ct_cooling_notice').html('Waiting for API to cool down. (About a minute)');\n jQuery('#ct_cooling_notice').show();\n return;\n } else {\n jQuery('#ct_cooling_notice').hide();\n }\n\n if (!ctCommentsTotal) {\n let data = {\n 'action': 'ajax_info_comments',\n 'security': ctAjaxNonce,\n };\n\n if (ctDateFrom && ctDateTill) {\n data['from'] = ctDateFrom;\n data['till'] = ctDateTill;\n }\n\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function(msg) {\n msg = jQuery.parseJSON(msg);\n jQuery('#ct_checking_status').html(msg.message);\n ctCommentsTotal = msg.total;\n ctCommentsSpam = msg.spam;\n ctCommentsChecked = msg.checked;\n ctCommentsBad = msg.bad;\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctShowInfo(), 3000);\n },\n timeout: 15000,\n });\n }\n }\n}\n\n/**\n * Function to toggle dependences\n *\n * @param {object} obj\n * @param {mixed} secondary\n */\nfunction ctToggleDepended(obj, secondary) { // eslint-disable-line no-unused-vars\n secondary = secondary || null;\n\n let depended = jQuery(obj.data('depended'));\n let state = obj.data('state');\n\n if (!state && !secondary) {\n obj.data('state', true);\n depended.removeProp('disabled');\n } else {\n obj.data('state', false);\n depended.prop('disabled', true);\n depended.removeProp('checked');\n if (depended.data('depended')) {\n ctToggleDepended(depended, true);\n }\n }\n}\n\n/**\n * trash all\n *\n * @param {object} e\n */\nfunction ctTrashAll( e ) {\n let data = {\n 'action': 'ajax_trash_all',\n 'security': ctAjaxNonce,\n };\n\n jQuery('.' + e.target.id).addClass('disabled');\n jQuery('.spinner').css('visibility', 'visible');\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function( msg ) {\n if ( msg > 0 ) {\n jQuery('#cleantalk_comments_left').html(msg);\n ctTrashAll( e );\n } else {\n jQuery('.' + e.target.id).removeClass('disabled');\n jQuery('.spinner').css('visibility', 'hidden');\n location.href='edit-comments.php?page=ct_check_spam';\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctTrashAll( e ), 3000);\n },\n timeout: 25000,\n });\n}\n\n/**\n * spam all\n *\n * @param {object} e\n */\nfunction ctSpamAll( e ) {\n let data = {\n 'action': 'ajax_spam_all',\n 'security': ctAjaxNonce,\n };\n\n jQuery('.' + e.target.id).addClass('disabled');\n jQuery('.spinner').css('visibility', 'visible');\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function( msg ) {\n if ( msg > 0 ) {\n jQuery('#cleantalk_comments_left').html(msg);\n ctSpamAll( e );\n } else {\n jQuery('.' + e.target.id).removeClass('disabled');\n jQuery('.spinner').css('visibility', 'hidden');\n location.href='edit-comments.php?page=ct_check_spam';\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctSpamAll( e ), 3000);\n },\n timeout: 25000,\n });\n}\n\njQuery(document).ready(function() {\n // Prev check parameters\n if (ctPrevAccurate) {\n jQuery('#ct_accurate_check').prop('checked', true);\n }\n if (ctPrevFrom) {\n jQuery('#ct_allow_date_range').prop('checked', true).data('state', true);\n jQuery('#ct_date_range_from').removeProp('disabled').val(ctPrevFrom);\n jQuery('#ct_date_range_till').removeProp('disabled').val(ctPrevTill);\n }\n\n // Toggle dependences\n jQuery('#ct_allow_date_range').on('change', function() {\n document.cookie = 'ct_spam_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n document.cookie = 'ct_spam_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n if ( this.checked ) {\n document.cookie = 'ct_spam_dates_allowed=1; path=/; samesite=lax';\n jQuery('.ct_date').prop('checked', true).attr('disabled', false);\n } else {\n document.cookie = 'ct_spam_dates_allowed=0; path=/; samesite=lax';\n jQuery('.ct_date').prop('disabled', true).attr('disabled', true);\n }\n });\n\n jQuery.datepicker.setDefaults(jQuery.datepicker.regional['en']);\n var dates = jQuery('#ct_date_range_from, #ct_date_range_till').datepicker( // eslint-disable-line no-var\n {\n dateFormat: 'M d yy',\n maxDate: '+0D',\n changeMonth: true,\n changeYear: true,\n showAnim: 'slideDown',\n onSelect: function(selectedDate) {\n let option = this.id == 'ct_date_range_from' ? 'minDate' : 'maxDate';\n let instance = jQuery( this ).data( 'datepicker' );\n let date = jQuery.datepicker.parseDate(\n instance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat,\n selectedDate, instance.settings);\n dates.not(this).datepicker('option', option, date);\n document.cookie = 'ct_spam_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n document.cookie = 'ct_spam_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n },\n },\n );\n\n // eslint-disable-next-line require-jsdoc\n function ctStartCheck(continueCheck) {\n continueCheck = continueCheck || null;\n\n if (jQuery('#ct_allow_date_range').is(':checked')) {\n ctDateFrom = jQuery('#ct_date_range_from').val();\n ctDateTill = jQuery('#ct_date_range_till').val();\n\n if (!(ctDateFrom != '' && ctDateTill != '')) {\n alert('Please, specify a date range.');\n return;\n }\n }\n\n if (jQuery('#ct_accurate_check').is(':checked')) {\n ctAccurateCheck = true;\n }\n\n if (\n jQuery('#ct_accurate_check').is(':checked') &&\n ! jQuery('#ct_allow_date_range').is(':checked')\n ) {\n alert('Please, select a date range.');\n return;\n }\n\n jQuery('.ct_to_hide').hide();\n jQuery('#ct_working_message').show();\n jQuery('#ct_preloader').show();\n jQuery('#ct_pause').show();\n\n ctWorking = true;\n\n if (continueCheck) {\n ctShowInfo();\n ctSendComments();\n } else {\n ctClearComments();\n }\n }\n\n // Check comments\n jQuery('#ct_check_spam_button').click(function() {\n document.cookie = 'ct_paused_spam_check=0; path=/; samesite=lax';\n ctStartCheck(false);\n });\n jQuery('#ct_proceed_check_button').click(function() {\n ctStartCheck(true);\n });\n\n // Pause the check\n jQuery('#ct_pause').on('click', function() {\n ctPause = true;\n let ctCheck = {\n 'accurate': ctAccurateCheck,\n 'from': ctDateFrom,\n 'till': ctDateTill,\n };\n document.cookie = 'ct_paused_spam_check=' + JSON.stringify(ctCheck) + '; path=/; samesite=lax';\n });\n\n\n if (ctCommentsCheck.start === '1') {\n document.cookie = 'ct_comments_start_check=0; expires=' + new Date(0).toUTCString() + '; path=/; samesite=lax';\n jQuery('#ct_check_spam_button').click();\n }\n\n // Delete all spam comments\n jQuery('.ct_trash_all').click(function( e ) {\n if (!confirm(ctCommentsCheck.ct_confirm_trash_all)) {\n return false;\n }\n\n ctTrashAll( e );\n });\n\n // Mark as spam all spam comments\n jQuery('.ct_spam_all').click(function( e ) {\n if (!confirm(ctCommentsCheck.ct_confirm_spam_all)) {\n return false;\n }\n\n ctSpamAll( e );\n });\n\n /**\n * Checked ct_accurate_check\n */\n jQuery('#ct_accurate_check').change(function() {\n if (this.checked) {\n jQuery('#ct_allow_date_range').prop('checked', true);\n jQuery('.ct_date').prop('checked', true).attr('disabled', false);\n }\n });\n});\n\n\n/**\n * Get cookie by name\n * @param {string} name\n * @return {string|undefined}\n */\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"],"names":["let","ctWorking","String","prototype","printf","formatted","this","arg","arguments","beforeFormatted","substring","indexOf","afterFormatted","length","ctNewCheck","ctCoolingDownFlag","ctCloseAnimate","ctAccurateCheck","ctPause","ctPrevAccurate","ctCommentsCheck","ct_prev_accurate","ctPrevFrom","ct_prev_from","ctPrevTill","ct_prev_till","ctCoolDownTime","ctRequestsCounter","ctMaxRequests","ctAjaxNonce","ct_ajax_nonce","ctCommentsTotal","ctCommentsChecked","ctCommentsSpam","ctCommentsBad","ctUnchecked","ctDateFrom","ctDateTill","animateComment","to","id","jQuery","fadeTo","ctClearComments","from","till","is","val","ctSecure","location","protocol","data","document","cookie","action","security","ajax","type","url","ajaxurl","success","msg","ctShowInfo","ctSendComments","ctCoolingDownToggle","setTimeout","new_check","unchecked","offset","Number","ctGetCookie","parseJSON","parseInt","error","confirm","error_message","newHref","href","end","hide","checked","spam","bad","total","statusString","ct_status_string","ct_status_string_warning","html","jqXHR","textStatus","errorThrown","show","timeout","message","ctToggleDepended","obj","secondary","depended","prop","removeProp","ctTrashAll","e","target","addClass","css","removeClass","ctSpamAll","name","matches","match","RegExp","replace","decodeURIComponent","undefined","ready","on","attr","datepicker","setDefaults","regional","dates","dateFormat","maxDate","changeMonth","changeYear","showAnim","onSelect","selectedDate","option","instance","date","parseDate","settings","_defaults","not","ctStartCheck","continueCheck","alert","click","ctCheck","accurate","JSON","stringify","start","Date","toUTCString","ct_confirm_trash_all","ct_confirm_spam_all","change"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["cleantalk-comments-checkspam.js"],"sourcesContent":["// Printf for JS\nString.prototype.printf = function() { // eslint-disable-line no-extend-native\n let formatted = this;\n for ( let arg in arguments ) { // eslint-disable-line guard-for-in,prefer-rest-params\n let beforeFormatted = formatted.substring(0, formatted.indexOf('%s', 0));\n let afterFormatted = formatted.substring(formatted.indexOf('%s', 0)+2, formatted.length);\n // eslint-disable-next-line guard-for-in,prefer-rest-params\n formatted = beforeFormatted + arguments[arg] + afterFormatted;\n }\n return formatted;\n};\n\n// Flags\nlet ctWorking = false;\nlet ctNewCheck = true;\nlet ctCoolingDownFlag = false;\nlet ctCloseAnimate = true;\nlet ctAccurateCheck = false;\nlet ctPause = false;\nlet ctPrevAccurate = ctCommentsCheck.ct_prev_accurate;\nlet ctPrevFrom = ctCommentsCheck.ct_prev_from;\nlet ctPrevTill = ctCommentsCheck.ct_prev_till;\n// Settings\nlet ctCoolDownTime = 90000;\nlet ctRequestsCounter = 0;\nlet ctMaxRequests = 60;\n// Variables\nlet ctAjaxNonce = ctCommentsCheck.ct_ajax_nonce;\nlet ctCommentsTotal = 0;\nlet ctCommentsChecked = 0;\nlet ctCommentsSpam = 0;\nlet ctCommentsBad = 0;\nlet ctUnchecked = 'unset';\nlet ctDateFrom = 0;\nlet ctDateTill = 0;\n\n/**\n * @param {mixed} to\n * @param {string} id\n */\nfunction animateComment(to, id) { // eslint-disable-line no-unused-vars\n if (ctCloseAnimate) {\n if (to==0.3) {\n jQuery('#comment-'+id).fadeTo(200, to, function() {\n animateComment(1, id);\n });\n } else {\n jQuery('#comment-'+id).fadeTo(200, to, function() {\n animateComment(0.3, id);\n });\n }\n } else {\n ctCloseAnimate =true;\n }\n}\n\n/**\n * clear comments\n */\nfunction ctClearComments() {\n let from = 0; let till = 0;\n if (jQuery('#ct_allow_date_range').is(':checked')) {\n from = jQuery('#ct_date_range_from').val();\n till = jQuery('#ct_date_range_till').val();\n }\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = 'apbct_check_comments_offset' + '=' + 0 + '; path=/; samesite=lax' + ctSecure;\n\n let data = {\n 'action': 'ajax_clear_comments',\n 'security': ctAjaxNonce,\n 'from': from,\n 'till': till,\n };\n\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function(msg) {\n ctShowInfo();\n ctSendComments();\n },\n });\n}\n\n/**\n * Continues the check after cooldown time\n * Called by ct_send_users();\n */\nfunction ctCoolingDownToggle() {\n ctCoolingDownFlag = false;\n ctSendComments();\n ctShowInfo();\n}\n\n/**\n * send comments\n */\nfunction ctSendComments() {\n if (ctCoolingDownFlag === true) {\n return;\n }\n\n if (ctRequestsCounter >= ctMaxRequests) {\n setTimeout(ctCoolingDownToggle, ctCoolDownTime);\n ctRequestsCounter = 0;\n ctCoolingDownFlag = true;\n return;\n } else {\n ctRequestsCounter++;\n }\n\n let data = {\n 'action': 'ajax_check_comments',\n 'security': ctAjaxNonce,\n 'new_check': ctNewCheck,\n 'unchecked': ctUnchecked,\n 'offset': Number(ctGetCookie('apbct_check_comments_offset')),\n };\n\n if (ctAccurateCheck) {\n data['accurate_check'] = true;\n }\n\n if (ctDateFrom && ctDateTill) {\n data['from'] = ctDateFrom;\n data['till'] = ctDateTill;\n }\n\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function(msg) {\n msg = jQuery.parseJSON(msg);\n\n if (parseInt(msg.error)) {\n ctWorking = false;\n if (!confirm(msg.error_message+'. Do you want to proceed?')) {\n let newHref = 'edit-comments.php?page=ct_check_spam';\n if (ctDateFrom != 0 && ctDateTill != 0) {\n newHref+='&from='+ctDateFrom+'&till='+ctDateTill;\n }\n location.href = newHref;\n } else {\n ctSendComments();\n }\n } else {\n ctNewCheck = false;\n let offset = Number(ctGetCookie('apbct_check_comments_offset')) + 100;\n\n if (parseInt(msg.end) == 1 || ctPause === true) {\n if (parseInt(msg.end) == 1) {\n document.cookie = 'ct_paused_spam_check=0; path=/; samesite=lax';\n }\n ctWorking = false;\n jQuery('#ct_working_message').hide();\n let newHref = 'edit-comments.php?page=ct_check_spam';\n if (ctDateFrom != 0 && ctDateTill != 0) {\n newHref+='&from='+ctDateFrom+'&till='+ctDateTill;\n }\n\n document.cookie = 'apbct_check_comments_offset' + '=' + offset + '; path=/; samesite=lax'+ctSecure;\n\n location.href = newHref;\n } else if (parseInt(msg.end) == 0) {\n ctCommentsChecked += msg.checked;\n ctCommentsSpam += msg.spam;\n ctCommentsBad += msg.bad;\n ctCommentsTotal += msg.total;\n ctUnchecked = ctCommentsTotal - ctCommentsChecked - ctCommentsBad;\n let statusString = String(ctCommentsCheck.ct_status_string);\n statusString = statusString.printf(ctCommentsChecked, ctCommentsSpam, ctCommentsBad);\n if (parseInt(ctCommentsSpam) > 0) {\n statusString += ctCommentsCheck.ct_status_string_warning;\n }\n jQuery('#ct_checking_status').html(statusString);\n jQuery('#ct_error_message').hide();\n // If DB woks not properly\n if (+ctCommentsTotal < ctCommentsChecked + ctCommentsBad) {\n document.cookie = 'ct_comments_start_check=1; path=/; samesite=lax';\n location.href = 'edit-comments.php?page=ct_check_spam';\n }\n\n document.cookie = 'apbct_check_comments_offset' + '=' + offset + '; path=/; samesite=lax'+ctSecure;\n\n ctSendComments();\n }\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctSendComments(), 3000);\n },\n timeout: 25000,\n });\n}\n\n/**\n * show info\n */\nfunction ctShowInfo() {\n if (ctWorking) {\n if (ctCoolingDownFlag == true) {\n jQuery('#ct_cooling_notice').html('Waiting for API to cool down. (About a minute)');\n jQuery('#ct_cooling_notice').show();\n return;\n } else {\n jQuery('#ct_cooling_notice').hide();\n }\n\n if (!ctCommentsTotal) {\n let data = {\n 'action': 'ajax_info_comments',\n 'security': ctAjaxNonce,\n };\n\n if (ctDateFrom && ctDateTill) {\n data['from'] = ctDateFrom;\n data['till'] = ctDateTill;\n }\n\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function(msg) {\n msg = jQuery.parseJSON(msg);\n jQuery('#ct_checking_status').html(msg.message);\n ctCommentsTotal = msg.total;\n ctCommentsSpam = msg.spam;\n ctCommentsChecked = msg.checked;\n ctCommentsBad = msg.bad;\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctShowInfo(), 3000);\n },\n timeout: 15000,\n });\n }\n }\n}\n\n/**\n * Function to toggle dependences\n *\n * @param {object} obj\n * @param {mixed} secondary\n */\nfunction ctToggleDepended(obj, secondary) { // eslint-disable-line no-unused-vars\n secondary = secondary || null;\n\n let depended = jQuery(obj.data('depended'));\n let state = obj.data('state');\n\n if (!state && !secondary) {\n obj.data('state', true);\n depended.removeProp('disabled');\n } else {\n obj.data('state', false);\n depended.prop('disabled', true);\n depended.removeProp('checked');\n if (depended.data('depended')) {\n ctToggleDepended(depended, true);\n }\n }\n}\n\n/**\n * trash all\n *\n * @param {object} e\n */\nfunction ctTrashAll( e ) {\n let data = {\n 'action': 'ajax_trash_all',\n 'security': ctAjaxNonce,\n };\n\n jQuery('.' + e.target.id).addClass('disabled');\n jQuery('.spinner').css('visibility', 'visible');\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function( msg ) {\n if ( msg > 0 ) {\n jQuery('#cleantalk_comments_left').html(msg);\n ctTrashAll( e );\n } else {\n jQuery('.' + e.target.id).removeClass('disabled');\n jQuery('.spinner').css('visibility', 'hidden');\n location.href='edit-comments.php?page=ct_check_spam';\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctTrashAll( e ), 3000);\n },\n timeout: 25000,\n });\n}\n\n/**\n * spam all\n *\n * @param {object} e\n */\nfunction ctSpamAll( e ) {\n let data = {\n 'action': 'ajax_spam_all',\n 'security': ctAjaxNonce,\n };\n\n jQuery('.' + e.target.id).addClass('disabled');\n jQuery('.spinner').css('visibility', 'visible');\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: data,\n success: function( msg ) {\n if ( msg > 0 ) {\n jQuery('#cleantalk_comments_left').html(msg);\n ctSpamAll( e );\n } else {\n jQuery('.' + e.target.id).removeClass('disabled');\n jQuery('.spinner').css('visibility', 'hidden');\n location.href='edit-comments.php?page=ct_check_spam';\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n jQuery('#ct_error_message').show();\n jQuery('#cleantalk_ajax_error').html(textStatus);\n jQuery('#cleantalk_js_func').html('Check comments');\n setTimeout(ctSpamAll( e ), 3000);\n },\n timeout: 25000,\n });\n}\n\njQuery(document).ready(function() {\n // Prev check parameters\n if (ctPrevAccurate) {\n jQuery('#ct_accurate_check').prop('checked', true);\n }\n if (ctPrevFrom) {\n jQuery('#ct_allow_date_range').prop('checked', true).data('state', true);\n jQuery('#ct_date_range_from').removeProp('disabled').val(ctPrevFrom);\n jQuery('#ct_date_range_till').removeProp('disabled').val(ctPrevTill);\n }\n\n // Toggle dependences\n jQuery('#ct_allow_date_range').on('change', function() {\n document.cookie = 'ct_spam_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n document.cookie = 'ct_spam_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n if ( this.checked ) {\n document.cookie = 'ct_spam_dates_allowed=1; path=/; samesite=lax';\n jQuery('.ct_date').prop('checked', true).attr('disabled', false);\n } else {\n document.cookie = 'ct_spam_dates_allowed=0; path=/; samesite=lax';\n jQuery('.ct_date').prop('disabled', true).attr('disabled', true);\n }\n });\n\n jQuery.datepicker.setDefaults(jQuery.datepicker.regional['en']);\n var dates = jQuery('#ct_date_range_from, #ct_date_range_till').datepicker( // eslint-disable-line no-var\n {\n dateFormat: 'M d yy',\n maxDate: '+0D',\n changeMonth: true,\n changeYear: true,\n showAnim: 'slideDown',\n onSelect: function(selectedDate) {\n let option = this.id == 'ct_date_range_from' ? 'minDate' : 'maxDate';\n let instance = jQuery( this ).data( 'datepicker' );\n let date = jQuery.datepicker.parseDate(\n instance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat,\n selectedDate, instance.settings);\n dates.not(this).datepicker('option', option, date);\n document.cookie = 'ct_spam_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n document.cookie = 'ct_spam_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n },\n },\n );\n\n // eslint-disable-next-line require-jsdoc\n function ctStartCheck(continueCheck) {\n continueCheck = continueCheck || null;\n\n if (jQuery('#ct_allow_date_range').is(':checked')) {\n ctDateFrom = jQuery('#ct_date_range_from').val();\n ctDateTill = jQuery('#ct_date_range_till').val();\n\n if (!(ctDateFrom != '' && ctDateTill != '')) {\n alert('Please, specify a date range.');\n return;\n }\n }\n\n if (jQuery('#ct_accurate_check').is(':checked')) {\n ctAccurateCheck = true;\n }\n\n if (\n jQuery('#ct_accurate_check').is(':checked') &&\n ! jQuery('#ct_allow_date_range').is(':checked')\n ) {\n alert('Please, select a date range.');\n return;\n }\n\n jQuery('.ct_to_hide').hide();\n jQuery('#ct_working_message').show();\n jQuery('#ct_preloader').show();\n jQuery('#ct_pause').show();\n\n ctWorking = true;\n\n if (continueCheck) {\n ctShowInfo();\n ctSendComments();\n } else {\n ctClearComments();\n }\n }\n\n // Check comments\n jQuery('#ct_check_spam_button').click(function() {\n document.cookie = 'ct_paused_spam_check=0; path=/; samesite=lax';\n ctStartCheck(false);\n });\n jQuery('#ct_proceed_check_button').click(function() {\n ctStartCheck(true);\n });\n\n // Pause the check\n jQuery('#ct_pause').on('click', function() {\n ctPause = true;\n let ctCheck = {\n 'accurate': ctAccurateCheck,\n 'from': ctDateFrom,\n 'till': ctDateTill,\n };\n document.cookie = 'ct_paused_spam_check=' + JSON.stringify(ctCheck) + '; path=/; samesite=lax';\n });\n\n\n if (ctCommentsCheck.start === '1') {\n document.cookie = 'ct_comments_start_check=0; expires=' + new Date(0).toUTCString() + '; path=/; samesite=lax';\n jQuery('#ct_check_spam_button').click();\n }\n\n // Delete all spam comments\n jQuery('.ct_trash_all').click(function( e ) {\n if (!confirm(ctCommentsCheck.ct_confirm_trash_all)) {\n return false;\n }\n\n ctTrashAll( e );\n });\n\n // Mark as spam all spam comments\n jQuery('.ct_spam_all').click(function( e ) {\n if (!confirm(ctCommentsCheck.ct_confirm_spam_all)) {\n return false;\n }\n\n ctSpamAll( e );\n });\n\n /**\n * Checked ct_accurate_check\n */\n jQuery('#ct_accurate_check').change(function() {\n if (this.checked) {\n jQuery('#ct_allow_date_range').prop('checked', true);\n jQuery('.ct_date').prop('checked', true).attr('disabled', false);\n }\n });\n});\n\n\n/**\n * Get cookie by name\n * @param {string} name\n * @return {string|undefined}\n */\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"],"file":"cleantalk-comments-checkspam.min.js"} \ No newline at end of file diff --git a/js/cleantalk-comments-editscreen.min.js b/js/cleantalk-comments-editscreen.min.js index 8b20479bb..673a71a16 100644 --- a/js/cleantalk-comments-editscreen.min.js +++ b/js/cleantalk-comments-editscreen.min.js @@ -1,2 +1,134 @@ -function ct_is_email(e){return e.search(/.*@.*\..*/)}function ct_is_ip(e){return e.search(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)}function ct_send_feedback_request(t,c,n){var e={action:"ct_feedback_comment",security:ctCommentsScreen.ct_ajax_nonce,comment_id:t,comment_status:c};jQuery.ajax({type:"POST",url:ajaxurl,data:e,success:function(e){ct_feedback_message_output(t,c,e,n)},error:function(e,t,c){console.log(e),console.log(t),console.log(c)},timeout:5e3})}function ct_feedback_message_output(e,t,c,n){1==c&&("approve"!=t||n||jQuery("tr#comment-"+e).html("").show().append("").children("td").css("background","rgba(110,240,110,0.7)").append("
"+ctCommentsScreen.ct_feedback_msg+"
"),"spam"==t)&&(jQuery("tr").is("#undo-"+e)?(jQuery("tr#undo-"+e).css("background","rgba(240,110,110,0.7)"),jQuery("tr#undo-"+e+" div.spam-undo-inside").append(" "+ctCommentsScreen.ct_feedback_msg)):jQuery("tr#comment-"+e).html("").show().css("background","rgba(240,110,110,0.7)").append("").children("td").append("
"+ctCommentsScreen.ct_feedback_msg+"
"))}jQuery(document).ready(function(){var t;parseInt(ctCommentsScreen.ct_show_check_links)&&jQuery(".column-author a, .comment-author a").each(function(){var e=jQuery(this).html();-1==ct_is_email(e)&&-1==ct_is_ip(e)||jQuery(this).after(' ')}),jQuery("span.approve").on("click",function(){var e=(e=jQuery(this).children("a").attr("href")).match(/^comment\.php\?.*c=(\d*).*/);t=e[1],ct_send_feedback_request(undo_comment_id=t,"approve",0)}),jQuery("span.unapprove").on("click",function(){var e=(e=jQuery(this).children("a").attr("href")).match(/^comment\.php\?.*c=(\d*).*/);t=e[1],ct_send_feedback_request(undo_comment_id=t,"spam",0)}),jQuery("span.spam").on("click",function(){var e=(e=jQuery(this).children("a").attr("href")).match(/^comment\.php\?.*c=(\d*).*/);t=e[1],ct_send_feedback_request(undo_comment_id=t,"spam",0),setTimeout(function(){jQuery("tr#undo-"+t+" span.unspam a").click(function(){var e=(e=jQuery(this).attr("href")).match(/^comment\.php\?.*&c=(\d*).*/);ct_send_feedback_request(t=e[1],"approve",1)})},202)}),jQuery("span.unspam").on("click",function(){var e=(e=jQuery(this).children("a").attr("href")).match(/^comment\.php\?.*c=(\d*).*/);ct_send_feedback_request(t=e[1],"approve",0)}),jQuery("span.untrash a").on("click",function(){var e=(e=jQuery(this).attr("href")).match(/^comment\.php\?.*c=(\d*).*/);t=e[1],feedback_result=ct_send_feedback_request(t,"approve",0)})}); +function ct_is_email(str){ + return str.search(/.*@.*\..*/); +} +function ct_is_ip(str){ + return str.search(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/); +} + +jQuery(document).ready(function(){ + /* Shows link to blacklists near every email and IP address */ + if(parseInt(ctCommentsScreen.ct_show_check_links)) + jQuery('.column-author a, .comment-author a').each(function(){ + var ct_curr_str = jQuery(this).html(); + if(ct_is_email(ct_curr_str) != -1 || ct_is_ip(ct_curr_str) != -1){ + jQuery(this).after(' '); + } + }); + + /* Feedback for comments */ + var ct_comment_id; + + // For approved + jQuery('span.approve').on('click', function(){ + var result = jQuery(this).children('a').attr('href'); + result = result.match(/^comment\.php\?.*c=(\d*).*/); + ct_comment_id = result[1]; + undo_comment_id = ct_comment_id; + ct_send_feedback_request(ct_comment_id, 'approve', 0); + }); + + // For unapprove + jQuery('span.unapprove').on('click', function(){ + var result = jQuery(this).children('a').attr('href'); + result = result.match(/^comment\.php\?.*c=(\d*).*/); + ct_comment_id = result[1]; + undo_comment_id = ct_comment_id; + ct_send_feedback_request(ct_comment_id, 'spam', 0); + }); + + // For spammed + jQuery('span.spam').on('click', function(){ + var result = jQuery(this).children('a').attr('href'); + result = result.match(/^comment\.php\?.*c=(\d*).*/); + ct_comment_id = result[1]; + undo_comment_id = ct_comment_id; + ct_send_feedback_request(ct_comment_id, 'spam', 0); + setTimeout(function(){ + jQuery('tr#undo-'+ct_comment_id+' span.unspam a').click(function(){ + var result = jQuery(this).attr('href'); + result = result.match(/^comment\.php\?.*&c=(\d*).*/); + ct_comment_id = result[1]; + ct_send_feedback_request(ct_comment_id, 'approve', 1); + }); + }, 202); + + }); + + // For unspammed + jQuery('span.unspam').on('click', function(){ + var result = jQuery(this).children('a').attr('href'); + result = result.match(/^comment\.php\?.*c=(\d*).*/); + ct_comment_id = result[1]; + ct_send_feedback_request(ct_comment_id, 'approve', 0); + }); + + // For untrashed + jQuery('span.untrash a').on('click', function(){ + var result = jQuery(this).attr('href'); + result = result.match(/^comment\.php\?.*c=(\d*).*/); + ct_comment_id = result[1]; + feedback_result = ct_send_feedback_request(ct_comment_id, 'approve', 0); + }); +}); + +// Send feedback to backend +function ct_send_feedback_request(ct_comment_id, ct_comment_status, ct_undo){ + + var data = { + 'action': 'ct_feedback_comment', + 'security': ctCommentsScreen.ct_ajax_nonce, + 'comment_id': ct_comment_id, + 'comment_status': ct_comment_status + }; + + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function(msg){ + ct_feedback_message_output(ct_comment_id, ct_comment_status, msg, ct_undo); + }, + error: function(jqXHR, textStatus, errorThrown) { + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + }, + timeout: 5000 + }); +} + +// Outputs CT message about feedback +function ct_feedback_message_output(ct_comment_id, ct_comment_status, ct_result, ct_undo){ + if(ct_result == 1){ + if(ct_comment_status == 'approve' && !ct_undo){ + jQuery('tr#comment-'+ct_comment_id) + .html('') + .show() + .append("").children('td') + .css('background', 'rgba(110,240,110,0.7)') + .append("
"+ctCommentsScreen.ct_feedback_msg+"
"); + } + if(ct_comment_status == 'spam'){ + if(jQuery('tr').is('#undo-'+ct_comment_id)){ + jQuery('tr#undo-'+ct_comment_id) + .css('background', 'rgba(240,110,110,0.7)'); + jQuery('tr#undo-'+ct_comment_id+' div.spam-undo-inside') + .append(" "+ctCommentsScreen.ct_feedback_msg); + }else{ + jQuery('tr#comment-'+ct_comment_id) + .html('') + .show() + .css('background', 'rgba(240,110,110,0.7)') + .append("").children('td') + .append("
"+ctCommentsScreen.ct_feedback_msg+"
"); + } + } + } + if(ct_result == 0){ + // Error occurred + }if(ct_result == 'no_hash'){ + // No hash for this comment + } +} + //# sourceMappingURL=cleantalk-comments-editscreen.min.js.map diff --git a/js/cleantalk-comments-editscreen.min.js.map b/js/cleantalk-comments-editscreen.min.js.map index 67782f63a..b18995382 100644 --- a/js/cleantalk-comments-editscreen.min.js.map +++ b/js/cleantalk-comments-editscreen.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cleantalk-comments-editscreen.min.js","sources":["cleantalk-comments-editscreen.js"],"sourcesContent":["function ct_is_email(str){\n\treturn str.search(/.*@.*\\..*/);\n}\nfunction ct_is_ip(str){\n\treturn str.search(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/);\n}\n\njQuery(document).ready(function(){\n\t/* Shows link to blacklists near every email and IP address */\n\tif(parseInt(ctCommentsScreen.ct_show_check_links))\n\t\tjQuery('.column-author a, .comment-author a').each(function(){\n\t\t\tvar ct_curr_str = jQuery(this).html();\n\t\t\tif(ct_is_email(ct_curr_str) != -1 || ct_is_ip(ct_curr_str) != -1){\n\t\t\t\tjQuery(this).after(' ');\n\t\t\t}\n\t\t});\n\n\t/* Feedback for comments */\n\tvar ct_comment_id;\n\n\t// For approved\n\tjQuery('span.approve').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tundo_comment_id = ct_comment_id;\n\t\tct_send_feedback_request(ct_comment_id, 'approve', 0);\n\t});\n\n\t// For unapprove\n\tjQuery('span.unapprove').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tundo_comment_id = ct_comment_id;\n\t\tct_send_feedback_request(ct_comment_id, 'spam', 0);\n\t});\n\n\t// For spammed\n\tjQuery('span.spam').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tundo_comment_id = ct_comment_id;\n\t\tct_send_feedback_request(ct_comment_id, 'spam', 0);\n\t\tsetTimeout(function(){\n\t\t\tjQuery('tr#undo-'+ct_comment_id+' span.unspam a').click(function(){\n\t\t\t\tvar result = jQuery(this).attr('href');\n\t\t\t\tresult = result.match(/^comment\\.php\\?.*&c=(\\d*).*/);\n\t\t\t\tct_comment_id = result[1];\n\t\t\t\tct_send_feedback_request(ct_comment_id, 'approve', 1);\n\t\t\t});\n\t\t}, 202);\n\n\t});\n\n\t// For unspammed\n\tjQuery('span.unspam').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tct_send_feedback_request(ct_comment_id, 'approve', 0);\n\t});\n\n\t// For untrashed\n\tjQuery('span.untrash a').on('click', function(){\n\t\tvar result = jQuery(this).attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tfeedback_result = ct_send_feedback_request(ct_comment_id, 'approve', 0);\n\t});\n});\n\n// Send feedback to backend\nfunction ct_send_feedback_request(ct_comment_id, ct_comment_status, ct_undo){\n\n\tvar data = {\n\t\t'action': 'ct_feedback_comment',\n\t\t'security': ctCommentsScreen.ct_ajax_nonce,\n\t\t'comment_id': ct_comment_id,\n\t\t'comment_status': ct_comment_status\n\t};\n\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function(msg){\n\t\t\tct_feedback_message_output(ct_comment_id, ct_comment_status, msg, ct_undo);\n\t\t},\n error: function(jqXHR, textStatus, errorThrown) {\n\t\t\tconsole.log(jqXHR);\n\t\t\tconsole.log(textStatus);\n\t\t\tconsole.log(errorThrown);\n\t\t},\n timeout: 5000\n\t});\n}\n\n// Outputs CT message about feedback\nfunction ct_feedback_message_output(ct_comment_id, ct_comment_status, ct_result, ct_undo){\n\tif(ct_result == 1){\n\t\tif(ct_comment_status == 'approve' && !ct_undo){\n\t\t\tjQuery('tr#comment-'+ct_comment_id)\n\t\t\t\t.html('')\n\t\t\t\t.show()\n\t\t\t\t.append(\"\").children('td')\n\t\t\t\t\t.css('background', 'rgba(110,240,110,0.7)')\n\t\t\t\t\t.append(\"
\"+ctCommentsScreen.ct_feedback_msg+\"
\");\n\t\t}\n\t\tif(ct_comment_status == 'spam'){\n\t\t\tif(jQuery('tr').is('#undo-'+ct_comment_id)){\n\t\t\t\tjQuery('tr#undo-'+ct_comment_id)\n\t\t\t\t\t.css('background', 'rgba(240,110,110,0.7)');\n\t\t\t\tjQuery('tr#undo-'+ct_comment_id+' div.spam-undo-inside')\n\t\t\t\t\t.append(\" \"+ctCommentsScreen.ct_feedback_msg);\n\t\t\t}else{\n\t\t\t\tjQuery('tr#comment-'+ct_comment_id)\n\t\t\t\t.html('')\n\t\t\t\t.show()\n\t\t\t\t.css('background', 'rgba(240,110,110,0.7)')\n\t\t\t\t.append(\"\").children('td')\n\t\t\t\t\t.append(\"
\"+ctCommentsScreen.ct_feedback_msg+\"
\");\n\t\t\t}\n\t\t}\n\t}\n\tif(ct_result == 0){\n\t\t// Error occurred\n\t}if(ct_result == 'no_hash'){\n\t\t// No hash for this comment\n\t}\n}\n"],"names":["ct_is_email","str","search","ct_is_ip","ct_send_feedback_request","ct_comment_id","ct_comment_status","ct_undo","data","action","security","ctCommentsScreen","ct_ajax_nonce","comment_id","comment_status","jQuery","ajax","type","url","ajaxurl","success","msg","ct_feedback_message_output","error","jqXHR","textStatus","errorThrown","console","log","timeout","ct_result","html","show","append","children","css","ct_feedback_msg","is","document","ready","parseInt","ct_show_check_links","each","ct_curr_str","this","after","ct_img_src_new_tab","on","result","attr","match","undo_comment_id","setTimeout","click","feedback_result"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["cleantalk-comments-editscreen.js"],"sourcesContent":["function ct_is_email(str){\n\treturn str.search(/.*@.*\\..*/);\n}\nfunction ct_is_ip(str){\n\treturn str.search(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/);\n}\n\njQuery(document).ready(function(){\n\t/* Shows link to blacklists near every email and IP address */\n\tif(parseInt(ctCommentsScreen.ct_show_check_links))\n\t\tjQuery('.column-author a, .comment-author a').each(function(){\n\t\t\tvar ct_curr_str = jQuery(this).html();\n\t\t\tif(ct_is_email(ct_curr_str) != -1 || ct_is_ip(ct_curr_str) != -1){\n\t\t\t\tjQuery(this).after(' ');\n\t\t\t}\n\t\t});\n\n\t/* Feedback for comments */\n\tvar ct_comment_id;\n\n\t// For approved\n\tjQuery('span.approve').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tundo_comment_id = ct_comment_id;\n\t\tct_send_feedback_request(ct_comment_id, 'approve', 0);\n\t});\n\n\t// For unapprove\n\tjQuery('span.unapprove').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tundo_comment_id = ct_comment_id;\n\t\tct_send_feedback_request(ct_comment_id, 'spam', 0);\n\t});\n\n\t// For spammed\n\tjQuery('span.spam').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tundo_comment_id = ct_comment_id;\n\t\tct_send_feedback_request(ct_comment_id, 'spam', 0);\n\t\tsetTimeout(function(){\n\t\t\tjQuery('tr#undo-'+ct_comment_id+' span.unspam a').click(function(){\n\t\t\t\tvar result = jQuery(this).attr('href');\n\t\t\t\tresult = result.match(/^comment\\.php\\?.*&c=(\\d*).*/);\n\t\t\t\tct_comment_id = result[1];\n\t\t\t\tct_send_feedback_request(ct_comment_id, 'approve', 1);\n\t\t\t});\n\t\t}, 202);\n\n\t});\n\n\t// For unspammed\n\tjQuery('span.unspam').on('click', function(){\n\t\tvar result = jQuery(this).children('a').attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tct_send_feedback_request(ct_comment_id, 'approve', 0);\n\t});\n\n\t// For untrashed\n\tjQuery('span.untrash a').on('click', function(){\n\t\tvar result = jQuery(this).attr('href');\n\t\tresult = result.match(/^comment\\.php\\?.*c=(\\d*).*/);\n\t\tct_comment_id = result[1];\n\t\tfeedback_result = ct_send_feedback_request(ct_comment_id, 'approve', 0);\n\t});\n});\n\n// Send feedback to backend\nfunction ct_send_feedback_request(ct_comment_id, ct_comment_status, ct_undo){\n\n\tvar data = {\n\t\t'action': 'ct_feedback_comment',\n\t\t'security': ctCommentsScreen.ct_ajax_nonce,\n\t\t'comment_id': ct_comment_id,\n\t\t'comment_status': ct_comment_status\n\t};\n\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function(msg){\n\t\t\tct_feedback_message_output(ct_comment_id, ct_comment_status, msg, ct_undo);\n\t\t},\n error: function(jqXHR, textStatus, errorThrown) {\n\t\t\tconsole.log(jqXHR);\n\t\t\tconsole.log(textStatus);\n\t\t\tconsole.log(errorThrown);\n\t\t},\n timeout: 5000\n\t});\n}\n\n// Outputs CT message about feedback\nfunction ct_feedback_message_output(ct_comment_id, ct_comment_status, ct_result, ct_undo){\n\tif(ct_result == 1){\n\t\tif(ct_comment_status == 'approve' && !ct_undo){\n\t\t\tjQuery('tr#comment-'+ct_comment_id)\n\t\t\t\t.html('')\n\t\t\t\t.show()\n\t\t\t\t.append(\"\").children('td')\n\t\t\t\t\t.css('background', 'rgba(110,240,110,0.7)')\n\t\t\t\t\t.append(\"
\"+ctCommentsScreen.ct_feedback_msg+\"
\");\n\t\t}\n\t\tif(ct_comment_status == 'spam'){\n\t\t\tif(jQuery('tr').is('#undo-'+ct_comment_id)){\n\t\t\t\tjQuery('tr#undo-'+ct_comment_id)\n\t\t\t\t\t.css('background', 'rgba(240,110,110,0.7)');\n\t\t\t\tjQuery('tr#undo-'+ct_comment_id+' div.spam-undo-inside')\n\t\t\t\t\t.append(\" \"+ctCommentsScreen.ct_feedback_msg);\n\t\t\t}else{\n\t\t\t\tjQuery('tr#comment-'+ct_comment_id)\n\t\t\t\t.html('')\n\t\t\t\t.show()\n\t\t\t\t.css('background', 'rgba(240,110,110,0.7)')\n\t\t\t\t.append(\"\").children('td')\n\t\t\t\t\t.append(\"
\"+ctCommentsScreen.ct_feedback_msg+\"
\");\n\t\t\t}\n\t\t}\n\t}\n\tif(ct_result == 0){\n\t\t// Error occurred\n\t}if(ct_result == 'no_hash'){\n\t\t// No hash for this comment\n\t}\n}\n"],"file":"cleantalk-comments-editscreen.min.js"} \ No newline at end of file diff --git a/js/cleantalk-dashboard-widget.min.js b/js/cleantalk-dashboard-widget.min.js index 09a5e06b9..fe48711d7 100644 --- a/js/cleantalk-dashboard-widget.min.js +++ b/js/cleantalk-dashboard-widget.min.js @@ -1,2 +1,92 @@ -jQuery(document).ready(function(){jQuery(".ct_widget_refresh_link").on("click",function(){jQuery(".ct_preloader").show(),setTimeout(function(){window.scrollTo(0,jQuery("#ct_widget_wrapper").offset().top-130)},1),setTimeout(function(){jQuery("#ct_refresh_form").submit()},2500)}),"#ct_widget"==location.hash&&setTimeout(function(){window.scrollTo(0,jQuery("#ct_widget_wrapper").offset().top-130)},1),jQuery("#ct_widget_wrapper").parent().css("padding",0),locale=navigator.language||navigator.userLanguage;var o=new Intl.DateTimeFormat(locale,{month:"short",day:"numeric"});var e=document.getElementById("ct_widget_chart"),t=(t=>{var a={labels:[],counts:[]};for(let e=0;e 0 && e != 'rgba(0, 0, 0, 0)') { + jQuery('.ct_comment_info').css('background', e); + return false; + } + }); + + // Set same float style with article + var ct_post_float = jQuery('.ct_comment_info').prev().last().css('float'); + jQuery('.ct_comment_info').css('float', ct_post_float); + + var ct_posts = jQuery('.ct_comment_info'); + + jQuery(ct_posts).each(function (indx, elem) { + curr_elem = jQuery(elem); + curr_elem.parent().prepend(curr_elem); + }); + + // Handler for buttons + jQuery('.ct_this_is').on('click', function () { + + var ct_current_button = jQuery(this), + ct_feedback_wrap = jQuery(this).siblings('.ct_feedback_wrap'), + ct_feedback_msg = jQuery('.ct_feedback_msg'), + ct_comment_status; + + if (ct_current_button.hasClass('ct_this_is_spam')) + ct_comment_status = 'spam'; + else + ct_comment_status = 'approve'; + + var data = { + 'action': 'ct_feedback_comment', + 'security': ctPublicAdmin.ct_ajax_nonce, + 'comment_id': ct_current_button.attr('commentid'), + 'comment_status': ct_comment_status, + 'change_status': 1 + }; + + apbct_public_sendAJAX( + data, + { + callback: function (msg) { + + ct_current_button.hide(); + ct_current_button.siblings('span.ct_this_is').show(); + + jQuery('.ct_feedback_result').hide(); + if (ct_comment_status == 'approve') { + jQuery('.ct_feedback_result_not_spam').show(); + } else { + jQuery('.ct_feedback_result_spam').show(); + } + + if (msg == 1) { + ct_feedback_msg.addClass('ct_feedback_success'); + ct_feedback_msg.html(ctPublicAdmin.ct_feedback_msg); + } else if (msg == 0) { + // Error occurred + ct_feedback_msg.addClass('ct_feedback_error'); + ct_feedback_msg.html(ctPublicAdmin.ct_feedback_error); + } else if (msg == 'no_hash') { + // No hash for this comment + ct_feedback_msg.addClass('ct_feedback_no_hash'); + ct_feedback_msg.html(ctPublicAdmin.ct_feedback_no_hash); + } + // Hidding feedback message for every message type + ct_feedback_wrap.show(); + ct_feedback_wrap.css('display', 'inline-block'); + + var ct_timeout_id = ct_feedback_wrap.data('interval_id'); + clearInterval(ct_timeout_id); + ct_timeout_id = setTimeout(function () { + ct_feedback_wrap.fadeOut(1000); + }, 5000); + ct_feedback_wrap.data('interval_id', ct_timeout_id); + }, + button: ct_current_button[0], + spinner: ct_current_button[0].querySelectorAll('.apbct_preloader_button')[0], + notJson: true + } + ); + }); +}); //# sourceMappingURL=cleantalk-public-admin.min.js.map diff --git a/js/cleantalk-public-admin.min.js.map b/js/cleantalk-public-admin.min.js.map index 0c3e8d2de..2408bf809 100644 --- a/js/cleantalk-public-admin.min.js.map +++ b/js/cleantalk-public-admin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cleantalk-public-admin.min.js","sources":["cleantalk-public-admin.js"],"sourcesContent":["document.addEventListener(\"DOMContentLoaded\", function () {\n\n // Set background-color similar to parents\n jQuery('.ct_comment_info').parents().each(function () {\n if ((e = jQuery(this).css('background-color')).length > 0 && e != 'rgba(0, 0, 0, 0)') {\n jQuery('.ct_comment_info').css('background', e);\n return false;\n }\n });\n\n // Set same float style with article\n var ct_post_float = jQuery('.ct_comment_info').prev().last().css('float');\n jQuery('.ct_comment_info').css('float', ct_post_float);\n\n var ct_posts = jQuery('.ct_comment_info');\n\n jQuery(ct_posts).each(function (indx, elem) {\n curr_elem = jQuery(elem);\n curr_elem.parent().prepend(curr_elem);\n });\n\n // Handler for buttons\n jQuery('.ct_this_is').on('click', function () {\n\n var ct_current_button = jQuery(this),\n ct_feedback_wrap = jQuery(this).siblings('.ct_feedback_wrap'),\n ct_feedback_msg = jQuery('.ct_feedback_msg'),\n ct_comment_status;\n\n if (ct_current_button.hasClass('ct_this_is_spam'))\n ct_comment_status = 'spam';\n else\n ct_comment_status = 'approve';\n\n var data = {\n 'action': 'ct_feedback_comment',\n 'security': ctPublicAdmin.ct_ajax_nonce,\n 'comment_id': ct_current_button.attr('commentid'),\n 'comment_status': ct_comment_status,\n 'change_status': 1\n };\n\n apbct_public_sendAJAX(\n data,\n {\n callback: function (msg) {\n\n ct_current_button.hide();\n ct_current_button.siblings('span.ct_this_is').show();\n\n jQuery('.ct_feedback_result').hide();\n if (ct_comment_status == 'approve') {\n jQuery('.ct_feedback_result_not_spam').show();\n } else {\n jQuery('.ct_feedback_result_spam').show();\n }\n\n if (msg == 1) {\n ct_feedback_msg.addClass('ct_feedback_success');\n ct_feedback_msg.html(ctPublicAdmin.ct_feedback_msg);\n } else if (msg == 0) {\n // Error occurred\n ct_feedback_msg.addClass('ct_feedback_error');\n ct_feedback_msg.html(ctPublicAdmin.ct_feedback_error);\n } else if (msg == 'no_hash') {\n // No hash for this comment\n ct_feedback_msg.addClass('ct_feedback_no_hash');\n ct_feedback_msg.html(ctPublicAdmin.ct_feedback_no_hash);\n }\n // Hidding feedback message for every message type\n ct_feedback_wrap.show();\n ct_feedback_wrap.css('display', 'inline-block');\n\n var ct_timeout_id = ct_feedback_wrap.data('interval_id');\n clearInterval(ct_timeout_id);\n ct_timeout_id = setTimeout(function () {\n ct_feedback_wrap.fadeOut(1000);\n }, 5000);\n ct_feedback_wrap.data('interval_id', ct_timeout_id);\n },\n button: ct_current_button[0],\n spinner: ct_current_button[0].querySelectorAll('.apbct_preloader_button')[0],\n notJson: true\n }\n );\n });\n});"],"names":["document","addEventListener","jQuery","parents","each","e","this","css","length","ct_post_float","prev","last","ct_posts","indx","elem","curr_elem","parent","prepend","on","ct_current_button","ct_feedback_wrap","siblings","ct_feedback_msg","ct_comment_status","hasClass","data","action","security","ctPublicAdmin","ct_ajax_nonce","comment_id","attr","comment_status","change_status","apbct_public_sendAJAX","callback","msg","hide","show","addClass","html","ct_feedback_error","ct_feedback_no_hash","ct_timeout_id","clearInterval","setTimeout","fadeOut","button","spinner","querySelectorAll","notJson"],"mappings":"AAAAA,SAASC,iBAAiB,mBAAoB,WAG1CC,OAAO,kBAAkB,EAAEC,QAAQ,EAAEC,KAAK,WACtC,GAAwD,GAAnDC,EAAIH,OAAOI,IAAI,EAAEC,IAAI,kBAAkB,GAAGC,QAAmB,oBAALH,EAEzD,OADAH,OAAO,kBAAkB,EAAEK,IAAI,aAAcF,CAAC,EACvC,CAAA,CAEf,CAAC,EAGD,IAAII,EAAgBP,OAAO,kBAAkB,EAAEQ,KAAK,EAAEC,KAAK,EAAEJ,IAAI,OAAO,EAGpEK,GAFJV,OAAO,kBAAkB,EAAEK,IAAI,QAASE,CAAa,EAEtCP,OAAO,kBAAkB,GAExCA,OAAOU,CAAQ,EAAER,KAAK,SAAUS,EAAMC,IAClCC,UAAYb,OAAOY,CAAI,GACbE,OAAO,EAAEC,QAAQF,SAAS,CACxC,CAAC,EAGDb,OAAO,aAAa,EAAEgB,GAAG,QAAS,WAE9B,IAAIC,EAAoBjB,OAAOI,IAAI,EAC/Bc,EAAmBlB,OAAOI,IAAI,EAAEe,SAAS,mBAAmB,EAC5DC,EAAkBpB,OAAO,kBAAkB,EAI3CqB,EADAJ,EAAkBK,SAAS,iBAAiB,EACxB,OAEA,UAEpBC,EAAO,CACPC,OAAU,sBACVC,SAAYC,cAAcC,cAC1BC,WAAcX,EAAkBY,KAAK,WAAW,EAChDC,eAAkBT,EAClBU,cAAiB,CACrB,EAEAC,sBACIT,EACA,CACIU,SAAU,SAAUC,GAEhBjB,EAAkBkB,KAAK,EACvBlB,EAAkBE,SAAS,iBAAiB,EAAEiB,KAAK,EAEnDpC,OAAO,qBAAqB,EAAEmC,KAAK,GACV,WAArBd,EACArB,OAAO,8BAA8B,EAErCA,OAAO,0BAA0B,GAFMoC,KAAK,EAKrC,GAAPF,GACAd,EAAgBiB,SAAS,qBAAqB,EAC9CjB,EAAgBkB,KAAKZ,cAAcN,eAAe,GACpC,GAAPc,GAEPd,EAAgBiB,SAAS,mBAAmB,EAC5CjB,EAAgBkB,KAAKZ,cAAca,iBAAiB,GACtC,WAAPL,IAEPd,EAAgBiB,SAAS,qBAAqB,EAC9CjB,EAAgBkB,KAAKZ,cAAcc,mBAAmB,GAG1DtB,EAAiBkB,KAAK,EACtBlB,EAAiBb,IAAI,UAAW,cAAc,EAE1CoC,EAAgBvB,EAAiBK,KAAK,aAAa,EACvDmB,cAAcD,CAAa,EAC3BA,EAAgBE,WAAW,WACvBzB,EAAiB0B,QAAQ,GAAI,CACjC,EAAG,GAAI,EACP1B,EAAiBK,KAAK,cAAekB,CAAa,CACtD,EACAI,OAAQ5B,EAAkB,GAC1B6B,QAAS7B,EAAkB,GAAG8B,iBAAiB,yBAAyB,EAAE,GAC1EC,QAAS,CAAA,CACb,CACJ,CACJ,CAAC,CACL,CAAC"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["cleantalk-public-admin.js"],"sourcesContent":["document.addEventListener(\"DOMContentLoaded\", function () {\n\n // Set background-color similar to parents\n jQuery('.ct_comment_info').parents().each(function () {\n if ((e = jQuery(this).css('background-color')).length > 0 && e != 'rgba(0, 0, 0, 0)') {\n jQuery('.ct_comment_info').css('background', e);\n return false;\n }\n });\n\n // Set same float style with article\n var ct_post_float = jQuery('.ct_comment_info').prev().last().css('float');\n jQuery('.ct_comment_info').css('float', ct_post_float);\n\n var ct_posts = jQuery('.ct_comment_info');\n\n jQuery(ct_posts).each(function (indx, elem) {\n curr_elem = jQuery(elem);\n curr_elem.parent().prepend(curr_elem);\n });\n\n // Handler for buttons\n jQuery('.ct_this_is').on('click', function () {\n\n var ct_current_button = jQuery(this),\n ct_feedback_wrap = jQuery(this).siblings('.ct_feedback_wrap'),\n ct_feedback_msg = jQuery('.ct_feedback_msg'),\n ct_comment_status;\n\n if (ct_current_button.hasClass('ct_this_is_spam'))\n ct_comment_status = 'spam';\n else\n ct_comment_status = 'approve';\n\n var data = {\n 'action': 'ct_feedback_comment',\n 'security': ctPublicAdmin.ct_ajax_nonce,\n 'comment_id': ct_current_button.attr('commentid'),\n 'comment_status': ct_comment_status,\n 'change_status': 1\n };\n\n apbct_public_sendAJAX(\n data,\n {\n callback: function (msg) {\n\n ct_current_button.hide();\n ct_current_button.siblings('span.ct_this_is').show();\n\n jQuery('.ct_feedback_result').hide();\n if (ct_comment_status == 'approve') {\n jQuery('.ct_feedback_result_not_spam').show();\n } else {\n jQuery('.ct_feedback_result_spam').show();\n }\n\n if (msg == 1) {\n ct_feedback_msg.addClass('ct_feedback_success');\n ct_feedback_msg.html(ctPublicAdmin.ct_feedback_msg);\n } else if (msg == 0) {\n // Error occurred\n ct_feedback_msg.addClass('ct_feedback_error');\n ct_feedback_msg.html(ctPublicAdmin.ct_feedback_error);\n } else if (msg == 'no_hash') {\n // No hash for this comment\n ct_feedback_msg.addClass('ct_feedback_no_hash');\n ct_feedback_msg.html(ctPublicAdmin.ct_feedback_no_hash);\n }\n // Hidding feedback message for every message type\n ct_feedback_wrap.show();\n ct_feedback_wrap.css('display', 'inline-block');\n\n var ct_timeout_id = ct_feedback_wrap.data('interval_id');\n clearInterval(ct_timeout_id);\n ct_timeout_id = setTimeout(function () {\n ct_feedback_wrap.fadeOut(1000);\n }, 5000);\n ct_feedback_wrap.data('interval_id', ct_timeout_id);\n },\n button: ct_current_button[0],\n spinner: ct_current_button[0].querySelectorAll('.apbct_preloader_button')[0],\n notJson: true\n }\n );\n });\n});"],"file":"cleantalk-public-admin.min.js"} \ No newline at end of file diff --git a/js/cleantalk-users-checkspam.min.js b/js/cleantalk-users-checkspam.min.js index c0dc20e78..21cd985b1 100644 --- a/js/cleantalk-users-checkspam.min.js +++ b/js/cleantalk-users-checkspam.min.js @@ -1,2 +1,641 @@ -String.prototype.printf=function(){var e,t=this;for(e in arguments)var c=t.substring(0,t.indexOf("%s",0)),a=t.substring(t.indexOf("%s",0)+2,t.length),t=c+arguments[e]+a;return t};var ct_working=!(document.cookie="ct_check_users__amount=100; path=/; samesite=lax"),ct_new_check=!0,ct_cooling_down_flag=!1,ct_close_animate=!0,ct_accurate_check=!1,ct_pause=!1,ct_prev_accurate=ctUsersCheck.ct_prev_accurate,ct_prev_from=ctUsersCheck.ct_prev_from,ct_prev_till=ctUsersCheck.ct_prev_till,ct_cool_down_time=9e4,ct_requests_counter=0,ct_max_requests=60,ct_ajax_nonce=ctUsersCheck.ct_ajax_nonce,ct_users_total=0,ct_users_checked=0,ct_users_spam=0,ct_users_bad=0,ct_unchecked="unset",ct_date_from=0,ct_date_till=0;function apbct_cookie__get(_,r){var s={};return"string"==typeof(_=_||null)&&(_=_.split()),"string"==typeof(r="none"===(r=r||["apbct_","ct_"])?null:r)&&(r=r.split()),document.cookie.split(";").forEach(function(e,t,c){var a=e.trim().split("=");_&&_.forEach(function(e,t,c){a[0]===e&&(s[a[0]]=a[1])}),r&&r.forEach(function(e,t,c){0===a[0].indexOf(e)&&(s[a[0]]=a[1])})}),s}function apbct_get_cookie(e){var t=apbct_cookie__get(e,e);return"object"==typeof t&&void 0!==t[e]?t[e]:null}function animate_comment(e,t){ct_close_animate?.3===e?jQuery("#comment-"+t).fadeTo(200,e,function(){animate_comment(1,t)}):jQuery("#comment-"+t).fadeTo(200,e,function(){animate_comment(.3,t)}):ct_close_animate=!0}function ct_clear_users(){var e=0,t=0,c=(jQuery("#ct_allow_date_range").is(":checked")&&(e=jQuery("#ct_date_range_from").val(),t=jQuery("#ct_date_range_till").val()),"https:"===location.protocol?"; secure":""),c=(document.cookie="apbct_check_users_offset=0; path=/; samesite=lax"+c,{action:"ajax_clear_users",security:ct_ajax_nonce,from:e,till:t,no_cache:Math.random()});jQuery.ajax({type:"POST",url:ajaxurl,data:c,success:function(e){ct_show_users_info(),ct_send_users()}})}function ct_cooling_down_toggle(){ct_cooling_down_flag=!1,ct_send_users(),ct_show_users_info()}function ct_send_users(){if(!0!==ct_cooling_down_flag)if(!0===ct_pause){ct_working=!1,jQuery("#ct_working_message").hide();let e="users.php?page=ct_check_users&ct_worked=1";0!==ct_date_from&&0!==ct_date_till&&(e+="&from="+ct_date_from+"&till="+ct_date_till),void(location.href=e)}else{var a,e;ct_max_requests<=ct_requests_counter?(setTimeout(ct_cooling_down_toggle,ct_cool_down_time),ct_cooling_down_flag=!(ct_requests_counter=0)):(ct_requests_counter++,a=apbct_get_cookie("ct_check_users__amount"),e={action:"ajax_check_users",security:ct_ajax_nonce,new_check:ct_new_check,unchecked:ct_unchecked,amount:a,no_cache:Math.random(),offset:Number(getCookie("apbct_check_users_offset"))},ct_accurate_check&&(e.accurate_check=!0),ct_date_from&&ct_date_till&&(e.from=ct_date_from,e.till=ct_date_till),jQuery.ajax({type:"POST",url:ajaxurl,data:e,success:function(e){var t;e=jQuery.parseJSON(e),parseInt(e.error)?(ct_working=!1,confirm(e.error_message+". Do you want to proceed?")?ct_send_users():(t="users.php?page=ct_check_users",0!=ct_date_from&&0!=ct_date_till&&(t+="&from="+ct_date_from+"&till="+ct_date_till),location.href=t)):(ct_new_check=!1,1==parseInt(e.end)?(1==parseInt(e.end)&&(document.cookie="ct_paused_users_check=0; path=/; samesite=lax"),ct_working=!1,jQuery("#ct_working_message").hide(),t="users.php?page=ct_check_users&ct_worked=1",0!=ct_date_from&&0!=ct_date_till&&(t+="&from="+ct_date_from+"&till="+ct_date_till),location.href=t):0==parseInt(e.end)&&(ct_users_checked=parseInt(ct_users_checked)+parseInt(e.checked),ct_users_spam=parseInt(ct_users_spam)+parseInt(e.spam),ct_users_bad=parseInt(e.bad),ct_unchecked=ct_users_total-ct_users_checked-ct_users_bad,t=(t=String(ctUsersCheck.ct_status_string)).printf(ct_users_checked,ct_users_spam,ct_users_bad),0 20){ + check_amount -= 20; + document.cookie = "ct_check_users__amount=" + check_amount + "; path=/; samesite=lax"; + } + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('Check users'); + setTimeout(ct_send_users(), 3000); + }, + timeout: 25000 + }); +} +function ct_show_users_info(){ + + if( ct_working ){ + + if(ct_cooling_down_flag === true){ + jQuery('#ct_cooling_notice').html('Waiting for API to cool down. (About a minute)').show(); + return; + }else{ + jQuery('#ct_cooling_notice').hide(); + } + + if( ! ct_users_total ){ + + var data = { + 'action': 'ajax_info_users', + 'security': ct_ajax_nonce, + 'no_cache': Math.random() + }; + + if( ct_date_from && ct_date_till ){ + data['from'] = ct_date_from; + data['till'] = ct_date_till; + } + + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function(msg){ + msg = jQuery.parseJSON(msg); + jQuery('#ct_checking_status').html(msg.message); + ct_users_spam = msg.spam; + ct_users_checked = msg.checked; + ct_users_bad = msg.bad; + }, + error: function (jqXHR, textStatus, errorThrown){ + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('Show users'); + setTimeout(ct_show_users_info(), 3000); + }, + timeout: 15000 + }); + } + } +} +// Function to toggle dependences +function ct_toggle_depended(obj, secondary){ + + secondary = secondary || null; + + var depended = jQuery(obj.data('depended')), + state = obj.data('state'); + + if(!state && !secondary){ + obj.data('state', true); + depended.removeProp('disabled'); + }else{ + obj.data('state', false); + depended.prop('disabled', true); + depended.removeProp('checked'); + if(depended.data('depended')) + ct_toggle_depended(depended, true); + } +} + +// Main function of checking +function ct_start_check( continue_check ){ + + continue_check = continue_check || null; + + if(jQuery('#ct_allow_date_range').is(':checked')){ + + ct_date_from = jQuery('#ct_date_range_from').val(); + ct_date_till = jQuery('#ct_date_range_till').val(); + + if(!(ct_date_from !== '' && ct_date_till !== '')){ + alert(ctUsersCheck.ct_specify_date_range); + return; + } + } + + if(jQuery('#ct_accurate_check').is(':checked')){ + ct_accurate_check = true; + } + + // + if ( + jQuery('#ct_accurate_check').is(':checked') && + ! jQuery('#ct_allow_date_range').is(':checked') + ) { + alert(ctUsersCheck.ct_select_date_range); + return; + } + + jQuery('.ct_to_hide').hide(); + jQuery('#ct_working_message').show(); + jQuery('#ct_preloader').show(); + jQuery('#ct_pause').show(); + + ct_working = true; + + if( continue_check ){ + ct_show_users_info(); + ct_send_users(); + } else { + ct_clear_users(); + } + +} + +function ct_delete_all_users( e ){ + + var data = { + 'action': 'ajax_delete_all_users', + 'security': ct_ajax_nonce, + 'no_cache': Math.random() + }; + + jQuery('.' + e.target.id).addClass('disabled'); + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function( msg ){ + if( msg > 0 ){ + jQuery('#cleantalk_users_left').html(msg); + ct_delete_all_users( e, data ); + }else{ + jQuery('.' + e.target.id).removeClass('disabled'); + location.href='users.php?page=ct_check_users'; + } + }, + error: function(jqXHR, textStatus, errorThrown) { + jQuery('#ct_error_message').show(); + jQuery('#cleantalk_ajax_error').html(textStatus); + jQuery('#cleantalk_js_func').html('All users deleteion'); + setTimeout(ct_delete_all_users( e ), 3000); + }, + timeout: 25000 + }); +} + +jQuery(document).ready(function(){ + + // Setting dependences + + // Prev check parameters + if(ct_prev_accurate){ + jQuery("#ct_accurate_check").prop('checked', true); + } + if(ct_prev_from){ + jQuery("#ct_allow_date_range").prop('checked', true).data('state', true); + jQuery("#ct_date_range_from").removeProp('disabled').val(ct_prev_from); + jQuery("#ct_date_range_till").removeProp('disabled').val(ct_prev_till); + } + + // Toggle dependences + jQuery("#ct_allow_date_range").on('change', function(){ + document.cookie = 'ct_users_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax'; + document.cookie = 'ct_users_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax'; + if( this.checked ) { + document.cookie = 'ct_users_dates_allowed=1; path=/; samesite=lax'; + jQuery('.ct_date').prop('checked', true).attr('disabled',false); + } else { + document.cookie = 'ct_users_dates_allowed=0; path=/; samesite=lax'; + jQuery('.ct_date').prop('disabled', true).attr('disabled',true); + } + }); + + jQuery.datepicker.setDefaults(jQuery.datepicker.regional['en']); + var dates = jQuery('#ct_date_range_from, #ct_date_range_till').datepicker( + { + dateFormat: 'M d yy', + maxDate:"+0D", + changeMonth:true, + changeYear:true, + showAnim: 'slideDown', + onSelect: function(selectedDate){ + var option = this.id == "ct_date_range_from" ? "minDate" : "maxDate", + instance = jQuery( this ).data( "datepicker" ), + date = jQuery.datepicker.parseDate( + instance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat, + selectedDate, instance.settings); + dates.not(this).datepicker("option", option, date); + document.cookie = 'ct_users_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax'; + document.cookie = 'ct_users_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax'; + } + } + ); + + // Check users + jQuery("#ct_check_spam_button").click(function(){ + document.cookie = 'ct_paused_users_check=0; path=/; samesite=lax'; + ct_pause = false; + + // + + + ct_start_check(false); + }); + jQuery("#ct_proceed_check_button").click(function(){ + ct_pause = false; + ct_start_check(true); + }); + + // Pause the check + jQuery('#ct_pause').on('click', function(){ + ct_pause = true; + var ct_check = { + 'accurate': ct_accurate_check, + 'from' : ct_date_from, + 'till' : ct_date_till + }; + document.cookie = 'ct_paused_users_check=' + JSON.stringify(ct_check) + '; path=/; samesite=lax'; + }); + + //Approve button + jQuery(".cleantalk_delete_from_list_button").click(function(){ + ct_id = jQuery(this).attr("data-id"); + // Approving + var data = { + 'action': 'ajax_ct_approve_user', + 'security': ct_ajax_nonce, + 'id': ct_id, + 'no_cache': Math.random() + }; + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function(msg){ + jQuery("#comment-"+ct_id).fadeOut('slow', function(){ + jQuery("#comment-"+ct_id).remove(); + }); + }, + }); + + // Positive feedback + var data = { + 'action': 'ct_feedback_user', + 'security': ct_ajax_nonce, + 'user_id': ct_id, + 'status': 'approve', + 'no_cache': Math.random() + }; + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function(msg){ + if(msg == 1){ + // Success + } + if(msg == 0){ + // Error occurred + } + if(msg == 'no_hash'){ + // No hash + } + }, + error: function(jqXHR, textStatus, errorThrown) { + + }, + timeout: 5000 + }); + + }); + + function blinkElement(id) { + jQuery("#" + id).fadeTo(500, 0.25).fadeTo(500, 1); + } + + function stopBlinkElement(id) { + jQuery("#" + id).fadeTo(1) + } + + // Request to Download CSV file. + jQuery(".ct_get_csv_file").click(function( e ){ + var data = { + 'action': 'ajax_ct_get_csv_file', + 'security': ct_ajax_nonce, + 'filename': ctUsersCheck.ct_csv_filename, + 'no_cache': Math.random() + }; + jQuery('.' + e.target.id).addClass('disabled'); + blinkElement('ct_get_csv_file'); + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function(msg){ + if( parseInt(msg) === 0 ) { + alert(ctUsersCheck.ct_bad_csv); + } else { + var url = URL.createObjectURL(new Blob([msg])); + + var dummy = document.createElement('a'); + dummy.href = url; + dummy.download = ctUsersCheck.ct_csv_filename + '.csv'; + + document.body.appendChild(dummy); + dummy.click(); + } + jQuery('.' + e.target.id).removeClass('disabled'); + stopBlinkElement('ct_get_csv_file'); + } + }); + }); + + // Delete inserted users + jQuery(".ct_insert_users").click(function( e ){ + ct_insert_users(); + }); + + // Insert users + jQuery(".ct_insert_users__delete").click(function( e ){ + ct_insert_users( true ); + }); + + // Delete all spam users + jQuery(".ct_delete_all_users").click(function( e ){ + + if ( ! confirm( ctUsersCheck.ct_confirm_deletion_all ) ) + return false; + blinkElement('ct_delete_all_users'); + ct_delete_all_users( e ); + + }); + + function ct_insert_users(delete_accounts){ + + delete_accounts = delete_accounts || null; + + var data = { + 'action': 'ajax_insert_users', + 'security': ct_ajax_nonce, + 'no_cache': Math.random() + }; + + if(delete_accounts) + data['delete'] = true; + + let waitingPopup = document.createElement('div'); + waitingPopup.setAttribute('class', 'apbct-popup'); + waitingPopup.setAttribute('id', 'apbct_popup'); + waitingPopup.setAttribute('style', 'font-size: 20px'); + waitingPopup.innerText = 'Wait for users handling!..' + document.body.append(waitingPopup); + document.body.classList.add('apbct-popup-fade'); + + jQuery.ajax({ + type: "POST", + url: ajaxurl, + data: data, + success: function(msg){ + if(delete_accounts) + alert('Deleted ' + msg + ' users'); + else + alert('Inserted ' + msg + ' users'); + jQuery('#apbct_popup')[0].remove() + document.body.classList.remove('apbct-popup-fade'); + window.location.reload(); + } + }); + } + + + /** + * Checked ct_accurate_check + */ + jQuery('#ct_accurate_check').change(function () { + if(this.checked) { + jQuery('#ct_allow_date_range').prop('checked', true); + jQuery('.ct_date').prop('checked', true).attr('disabled',false); + } + }); +}); + +/** + * Get cookie by name + * @param name + * @returns {string|undefined} + */ +function getCookie(name) { + let matches = document.cookie.match(new RegExp( + "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + +// Binds the bulk action events to the submit buttons. +// This code has been copied from wordpress core js file wp-admin/js/media.js:184 +jQuery( '#doaction' ).on( 'click', function( event ) { + /* + * Handle the bulk action based on its value. + */ + jQuery( 'select[name="action"]' ).each( function() { + var optionValue = jQuery( this ).val(); + if ( 'delete' === optionValue ) { + if ( ! showNotice.warn() ) { + event.preventDefault(); + } + } + }); +}); + //# sourceMappingURL=cleantalk-users-checkspam.min.js.map diff --git a/js/cleantalk-users-checkspam.min.js.map b/js/cleantalk-users-checkspam.min.js.map index 1feb75dc8..ef2ba504a 100644 --- a/js/cleantalk-users-checkspam.min.js.map +++ b/js/cleantalk-users-checkspam.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cleantalk-users-checkspam.min.js","sources":["cleantalk-users-checkspam.js"],"sourcesContent":["// Printf for JS\nString.prototype.printf = function(){\n var formatted = this;\n for( var arg in arguments ) {\n\t\tvar before_formatted = formatted.substring(0, formatted.indexOf(\"%s\", 0));\n\t\tvar after_formatted = formatted.substring(formatted.indexOf(\"%s\", 0)+2, formatted.length);\n\t\tformatted = before_formatted + arguments[arg] + after_formatted;\n }\n return formatted;\n};\n\n// Set deafult amount to check by request.\ndocument.cookie = \"ct_check_users__amount=\" + 100 + \"; path=/; samesite=lax\";\n\n// Flags\nvar ct_working = false,\n\tct_new_check = true,\n\tct_cooling_down_flag = false,\n\tct_close_animate = true,\n\tct_accurate_check = false,\n\tct_pause = false,\n\tct_prev_accurate = ctUsersCheck.ct_prev_accurate,\n\tct_prev_from = ctUsersCheck.ct_prev_from,\n\tct_prev_till = ctUsersCheck.ct_prev_till;\n// Settings\nvar ct_cool_down_time = 90000,\n\tct_requests_counter = 0,\n\tct_max_requests = 60;\n// Variables\nvar ct_ajax_nonce = ctUsersCheck.ct_ajax_nonce,\n\tct_users_total = 0,\n\tct_users_checked = 0,\n\tct_users_spam = 0,\n\tct_users_bad = 0,\n\tct_unchecked = 'unset',\n\tct_date_from = 0,\n\tct_date_till = 0;\n\n/* Function: Reuturns cookie with prefix */\nfunction apbct_cookie__get(names, prefixes){\n\tvar cookie = {};\n\tnames = names || null;\n\tif(typeof names == 'string') names = names.split();\n\tprefixes = prefixes || ['apbct_', 'ct_'];\n\tif(prefixes === 'none') prefixes = null;\n\tif(typeof prefixes == 'string') prefixes = prefixes.split();\n\tdocument.cookie.split(';').forEach(function(item, i, arr){\n\t\tvar curr = item.trim().split('=');\n\t\t// Detect by full cookie name\n\t\tif(names){\n\t\t\tnames.forEach(function(name, i, all){\n\t\t\t\tif(curr[0] === name)\n\t\t\t\t\tcookie[curr[0]] = (curr[1]);\n\t\t\t});\n\t\t}\n\t\t// Detect by name prefix\n\t\tif(prefixes){\n\t\t\tprefixes.forEach(function(prefix, i, all){\n\t\t\t\tif(curr[0].indexOf(prefix) === 0)\n\t\t\t\t\tcookie[curr[0]] = (curr[1]);\n\t\t\t});\n\t\t}\n\t});\n\treturn cookie;\n}\n\nfunction apbct_get_cookie( name ){\n\tvar cookie = apbct_cookie__get( name, name );\n\tif(typeof cookie === 'object' && typeof cookie[name] != 'undefined'){\n\t\treturn cookie[name];\n\t}else\n\t\treturn null;\n}\n\nfunction animate_comment(to,id){\n\tif(ct_close_animate){\n\t\tif(to === 0.3){\n\t\t\tjQuery('#comment-'+id).fadeTo(200,to,function(){\n\t\t\t\tanimate_comment(1,id)\n\t\t\t});\n\t\t}else{\n\t\t\tjQuery('#comment-'+id).fadeTo(200,to,function(){\n\t\t\t\tanimate_comment(0.3,id)\n\t\t\t});\n\t\t}\n\t}else{\n\t\tct_close_animate=true;\n\t}\n}\n\nfunction ct_clear_users(){\n\n\tvar from = 0, till = 0;\n\tif(jQuery('#ct_allow_date_range').is(':checked')) {\n\t\tfrom = jQuery('#ct_date_range_from').val();\n\t\ttill = jQuery('#ct_date_range_till').val();\n\t}\n\n\tvar ctSecure = location.protocol === 'https:' ? '; secure' : '';\n\tdocument.cookie = 'apbct_check_users_offset' + \"=\" + 0 + \"; path=/; samesite=lax\" + ctSecure;\n\n\tvar data = {\n\t\t'action' : 'ajax_clear_users',\n\t\t'security' : ct_ajax_nonce,\n\t\t'from' : from,\n\t\t'till' : till,\n\t\t'no_cache': Math.random()\n\t};\n\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function(msg){\n\t\t\tct_show_users_info();\n\t\t\tct_send_users();\n\t\t}\n\t});\n\n}\n\n//Continues the check after cooldown time\n//Called by ct_send_users();\nfunction ct_cooling_down_toggle(){\n\tct_cooling_down_flag = false;\n\tct_send_users();\n\tct_show_users_info();\n}\n\nfunction ct_send_users(){\n\n\tif(ct_cooling_down_flag === true)\n\t\treturn;\n\tif (ct_pause === true) {\n\t\tct_working=false;\n\t\tjQuery('#ct_working_message').hide();\n\t\tlet new_href = 'users.php?page=ct_check_users&ct_worked=1';\n\t\tif(ct_date_from !== 0 && ct_date_till !== 0)\n\t\t\tnew_href+='&from='+ct_date_from+'&till='+ct_date_till;\n\t\tlocation.href = new_href;\n\t\treturn;\n\t}\n\n\tif(ct_requests_counter >= ct_max_requests){\n\t\tsetTimeout(ct_cooling_down_toggle, ct_cool_down_time);\n\t\tct_requests_counter = 0;\n\t\tct_cooling_down_flag = true;\n\t\treturn;\n\t}else{\n\t\tct_requests_counter++;\n\t}\n\n\tvar check_amount = apbct_get_cookie('ct_check_users__amount');\n\n\tvar data = {\n\t\taction: 'ajax_check_users',\n\t\tsecurity: ct_ajax_nonce,\n\t\tnew_check: ct_new_check,\n\t\tunchecked: ct_unchecked,\n\t\tamount: check_amount,\n\t\t'no_cache': Math.random(),\n\t\t'offset' : Number(getCookie('apbct_check_users_offset'))\n\t};\n\n\tif(ct_accurate_check)\n\t\tdata['accurate_check'] = true;\n\n\tif(ct_date_from && ct_date_till){\n\t\tdata['from'] = ct_date_from;\n\t\tdata['till'] = ct_date_till;\n\t}\n\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function(msg){\n\n\t\t\tmsg = jQuery.parseJSON(msg);\n\n\t\t\tif(parseInt(msg.error)){\n\t\t\t\tct_working=false;\n\t\t\t\tif(!confirm(msg.error_message+\". Do you want to proceed?\")){\n\t\t\t\t\tvar new_href = 'users.php?page=ct_check_users';\n\t\t\t\t\tif(ct_date_from != 0 && ct_date_till != 0)\n\t\t\t\t\t\tnew_href+='&from='+ct_date_from+'&till='+ct_date_till;\n\t\t\t\t\tlocation.href = new_href;\n\t\t\t\t}else\n\t\t\t\t\tct_send_users();\n\t\t\t}else{\n\t\t\t\tct_new_check = false;\n\t\t\t\tif(parseInt(msg.end) == 1){\n\t\t\t\t\tif(parseInt(msg.end) == 1)\n\t\t\t\t\t\tdocument.cookie = 'ct_paused_users_check=0; path=/; samesite=lax';\n\t\t\t\t\tct_working=false;\n\t\t\t\t\tjQuery('#ct_working_message').hide();\n\t\t\t\t\tvar new_href = 'users.php?page=ct_check_users&ct_worked=1';\n\t\t\t\t\tif(ct_date_from != 0 && ct_date_till != 0)\n\t\t\t\t\t\tnew_href+='&from='+ct_date_from+'&till='+ct_date_till;\n\t\t\t\t\tlocation.href = new_href;\n\t\t\t\t}else if(parseInt(msg.end) == 0){\n\t\t\t\t\tct_users_checked = parseInt( ct_users_checked ) + parseInt( msg.checked );\n\t\t\t\t\tct_users_spam = parseInt( ct_users_spam ) + parseInt (msg.spam );\n\t\t\t\t\tct_users_bad = parseInt( msg.bad );\n\t\t\t\t\tct_unchecked = ct_users_total - ct_users_checked - ct_users_bad;\n\t\t\t\t\tvar status_string = String(ctUsersCheck.ct_status_string);\n\t\t\t\t\tstatus_string = status_string.printf(ct_users_checked, ct_users_spam, ct_users_bad);\n\t\t\t\t\tif(parseInt(ct_users_spam) > 0)\n\t\t\t\t\t\tstatus_string += ctUsersCheck.ct_status_string_warning;\n\t\t\t\t\tjQuery('#ct_checking_status').html(status_string);\n\t\t\t\t\tjQuery('#ct_error_message').hide();\n\n\t\t\t\t\tvar offset = Number(getCookie('apbct_check_users_offset')) + 100;\n\t\t\t\t\tvar ctSecure = location.protocol === 'https:' ? '; secure' : '';\n\t\t\t\t\tdocument.cookie = 'apbct_check_users_offset' + \"=\" + offset + \"; path=/; samesite=lax\" + ctSecure;\n\n\t\t\t\t\tct_send_users();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n error: function(jqXHR, textStatus, errorThrown) {\n\t\t\tif(check_amount > 20){\n\t\t\t\tcheck_amount -= 20;\n\t\t\t\tdocument.cookie = \"ct_check_users__amount=\" + check_amount + \"; path=/; samesite=lax\";\n\t\t\t}\n\t\t\tjQuery('#ct_error_message').show();\n\t\t\tjQuery('#cleantalk_ajax_error').html(textStatus);\n\t\t\tjQuery('#cleantalk_js_func').html('Check users');\n\t\t\tsetTimeout(ct_send_users(), 3000);\n },\n timeout: 25000\n\t});\n}\nfunction ct_show_users_info(){\n\n\tif( ct_working ){\n\n\t\tif(ct_cooling_down_flag === true){\n\t\t\tjQuery('#ct_cooling_notice').html('Waiting for API to cool down. (About a minute)').show();\n\t\t\treturn;\n\t\t}else{\n\t\t\tjQuery('#ct_cooling_notice').hide();\n\t\t}\n\n\t\tif( ! ct_users_total ){\n\n\t\t\tvar data = {\n\t\t\t\t'action': 'ajax_info_users',\n\t\t\t\t'security': ct_ajax_nonce,\n\t\t\t\t'no_cache': Math.random()\n\t\t\t};\n\n\t\t\tif( ct_date_from && ct_date_till ){\n\t\t\t\tdata['from'] = ct_date_from;\n\t\t\t\tdata['till'] = ct_date_till;\n\t\t\t}\n\n\t\t\tjQuery.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: ajaxurl,\n\t\t\t\tdata: data,\n\t\t\t\tsuccess: function(msg){\n\t\t\t\t\tmsg = jQuery.parseJSON(msg);\n\t\t\t\t\tjQuery('#ct_checking_status').html(msg.message);\n\t\t\t\t\tct_users_spam = msg.spam;\n\t\t\t\t\tct_users_checked = msg.checked;\n\t\t\t\t\tct_users_bad = msg.bad;\n\t\t\t\t},\n\t\t\t\terror: function (jqXHR, textStatus, errorThrown){\n\t\t\t\t\tjQuery('#ct_error_message').show();\n\t\t\t\t\tjQuery('#cleantalk_ajax_error').html(textStatus);\n\t\t\t\t\tjQuery('#cleantalk_js_func').html('Show users');\n\t\t\t\t\tsetTimeout(ct_show_users_info(), 3000);\n\t\t\t\t},\n\t\t\t\ttimeout: 15000\n\t\t\t});\n\t\t}\n\t}\n}\n// Function to toggle dependences\nfunction ct_toggle_depended(obj, secondary){\n\n secondary = secondary || null;\n\n\tvar depended = jQuery(obj.data('depended')),\n\t\tstate = obj.data('state');\n\n\tif(!state && !secondary){\n\t\tobj.data('state', true);\n\t\tdepended.removeProp('disabled');\n\t}else{\n\t\tobj.data('state', false);\n\t\tdepended.prop('disabled', true);\n\t\tdepended.removeProp('checked');\n\t\tif(depended.data('depended'))\n\t\t\tct_toggle_depended(depended, true);\n\t}\n}\n\n// Main function of checking\nfunction ct_start_check( continue_check ){\n\n\tcontinue_check = continue_check || null;\n\n\tif(jQuery('#ct_allow_date_range').is(':checked')){\n\n\t\tct_date_from = jQuery('#ct_date_range_from').val();\n\t\tct_date_till = jQuery('#ct_date_range_till').val();\n\n\t\tif(!(ct_date_from !== '' && ct_date_till !== '')){\n\t\t\talert(ctUsersCheck.ct_specify_date_range);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif(jQuery('#ct_accurate_check').is(':checked')){\n\t\tct_accurate_check = true;\n\t}\n\n\t//\n\tif (\n\t\tjQuery('#ct_accurate_check').is(':checked') &&\n\t\t! jQuery('#ct_allow_date_range').is(':checked')\n\t) {\n\t\talert(ctUsersCheck.ct_select_date_range);\n\t\treturn;\n\t}\n\n\tjQuery('.ct_to_hide').hide();\n\tjQuery('#ct_working_message').show();\n\tjQuery('#ct_preloader').show();\n\tjQuery('#ct_pause').show();\n\n\tct_working = true;\n\n\tif( continue_check ){\n\t\tct_show_users_info();\n\t\tct_send_users();\n\t} else {\n\t\tct_clear_users();\n\t}\n\n}\n\nfunction ct_delete_all_users( e ){\n\n\tvar data = {\n\t\t'action': 'ajax_delete_all_users',\n\t\t'security': ct_ajax_nonce,\n\t\t'no_cache': Math.random()\n\t};\n\n\tjQuery('.' + e.target.id).addClass('disabled');\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function( msg ){\n\t\t\tif( msg > 0 ){\n\t\t\t\tjQuery('#cleantalk_users_left').html(msg);\n\t\t\t\tct_delete_all_users( e, data );\n\t\t\t}else{\n\t\t\t\tjQuery('.' + e.target.id).removeClass('disabled');\n\t\t\t\tlocation.href='users.php?page=ct_check_users';\n\t\t\t}\n\t\t},\n\t\terror: function(jqXHR, textStatus, errorThrown) {\n\t\t\tjQuery('#ct_error_message').show();\n\t\t\tjQuery('#cleantalk_ajax_error').html(textStatus);\n\t\t\tjQuery('#cleantalk_js_func').html('All users deleteion');\n\t\t\tsetTimeout(ct_delete_all_users( e ), 3000);\n\t\t},\n\t\ttimeout: 25000\n\t});\n}\n\njQuery(document).ready(function(){\n\n\t// Setting dependences\n\n\t// Prev check parameters\n\tif(ct_prev_accurate){\n\t\tjQuery(\"#ct_accurate_check\").prop('checked', true);\n\t}\n\tif(ct_prev_from){\n\t\tjQuery(\"#ct_allow_date_range\").prop('checked', true).data('state', true);\n\t\tjQuery(\"#ct_date_range_from\").removeProp('disabled').val(ct_prev_from);\n\t\tjQuery(\"#ct_date_range_till\").removeProp('disabled').val(ct_prev_till);\n\t}\n\n\t// Toggle dependences\n\tjQuery(\"#ct_allow_date_range\").on('change', function(){\n\t\tdocument.cookie = 'ct_users_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n\t\tdocument.cookie = 'ct_users_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n\t\tif( this.checked ) {\n\t\t\tdocument.cookie = 'ct_users_dates_allowed=1; path=/; samesite=lax';\n\t\t\tjQuery('.ct_date').prop('checked', true).attr('disabled',false);\n\t\t} else {\n\t\t\tdocument.cookie = 'ct_users_dates_allowed=0; path=/; samesite=lax';\n\t\t\tjQuery('.ct_date').prop('disabled', true).attr('disabled',true);\n\t\t}\n\t});\n\n\tjQuery.datepicker.setDefaults(jQuery.datepicker.regional['en']);\n\tvar dates = jQuery('#ct_date_range_from, #ct_date_range_till').datepicker(\n\t\t{\n\t\t\tdateFormat: 'M d yy',\n\t\t\tmaxDate:\"+0D\",\n\t\t\tchangeMonth:true,\n\t\t\tchangeYear:true,\n\t\t\tshowAnim: 'slideDown',\n\t\t\tonSelect: function(selectedDate){\n\t\t\tvar option = this.id == \"ct_date_range_from\" ? \"minDate\" : \"maxDate\",\n\t\t\t\tinstance = jQuery( this ).data( \"datepicker\" ),\n\t\t\t\tdate = jQuery.datepicker.parseDate(\n\t\t\t\t\tinstance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat,\n\t\t\t\t\tselectedDate, instance.settings);\n\t\t\t\tdates.not(this).datepicker(\"option\", option, date);\n\t\t\t\tdocument.cookie = 'ct_users_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n\t\t\t\tdocument.cookie = 'ct_users_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n\t\t\t}\n\t\t}\n\t);\n\n\t// Check users\n\tjQuery(\"#ct_check_spam_button\").click(function(){\n\t\tdocument.cookie = 'ct_paused_users_check=0; path=/; samesite=lax';\n\t\tct_pause = false;\n\n\t\t//\n\n\n\t\tct_start_check(false);\n\t});\n\tjQuery(\"#ct_proceed_check_button\").click(function(){\n\t\tct_pause = false;\n\t\tct_start_check(true);\n\t});\n\n\t// Pause the check\n\tjQuery('#ct_pause').on('click', function(){\n\t\tct_pause = true;\n\t\tvar ct_check = {\n\t\t\t'accurate': ct_accurate_check,\n\t\t\t'from' : ct_date_from,\n\t\t\t'till' : ct_date_till\n\t\t};\n\t\tdocument.cookie = 'ct_paused_users_check=' + JSON.stringify(ct_check) + '; path=/; samesite=lax';\n\t});\n\n\t//Approve button\n\tjQuery(\".cleantalk_delete_from_list_button\").click(function(){\n\t\tct_id = jQuery(this).attr(\"data-id\");\n\t\t// Approving\n\t\tvar data = {\n\t\t\t'action': 'ajax_ct_approve_user',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'id': ct_id,\n\t\t\t'no_cache': Math.random()\n\t\t};\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tjQuery(\"#comment-\"+ct_id).fadeOut('slow', function(){\n\t\t\t\t\tjQuery(\"#comment-\"+ct_id).remove();\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\t// Positive feedback\n\t\tvar data = {\n\t\t\t'action': 'ct_feedback_user',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'user_id': ct_id,\n\t\t\t'status': 'approve',\n\t\t\t'no_cache': Math.random()\n\t\t};\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tif(msg == 1){\n\t\t\t\t\t// Success\n\t\t\t\t}\n\t\t\t\tif(msg == 0){\n\t\t\t\t\t// Error occurred\n\t\t\t\t}\n\t\t\t\tif(msg == 'no_hash'){\n\t\t\t\t\t// No hash\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function(jqXHR, textStatus, errorThrown) {\n\n\t\t\t},\n\t\t\ttimeout: 5000\n\t\t});\n\n\t});\n\n\tfunction blinkElement(id) {\n\t\tjQuery(\"#\" + id).fadeTo(500, 0.25).fadeTo(500, 1);\n\t}\n\n\tfunction stopBlinkElement(id) {\n\t\tjQuery(\"#\" + id).fadeTo(1)\n\t}\n\n\t// Request to Download CSV file.\n\tjQuery(\".ct_get_csv_file\").click(function( e ){\n\t\tvar data = {\n\t\t\t'action': 'ajax_ct_get_csv_file',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'filename': ctUsersCheck.ct_csv_filename,\n\t\t\t'no_cache': Math.random()\n\t\t};\n\t\tjQuery('.' + e.target.id).addClass('disabled');\n\t\tblinkElement('ct_get_csv_file');\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tif( parseInt(msg) === 0 ) {\n\t\t\t\t\talert(ctUsersCheck.ct_bad_csv);\n\t\t\t\t} else {\n\t\t\t\t\tvar url = URL.createObjectURL(new Blob([msg]));\n\n\t\t\t\t\tvar dummy = document.createElement('a');\n\t\t\t\t\tdummy.href = url;\n\t\t\t\t\tdummy.download = ctUsersCheck.ct_csv_filename + '.csv';\n\n\t\t\t\t\tdocument.body.appendChild(dummy);\n\t\t\t\t\tdummy.click();\n\t\t\t\t}\n\t\t\t\tjQuery('.' + e.target.id).removeClass('disabled');\n\t\t\t\tstopBlinkElement('ct_get_csv_file');\n\t\t\t}\n\t\t});\n\t});\n\n\t// Delete inserted users\n\tjQuery(\".ct_insert_users\").click(function( e ){\n\t\tct_insert_users();\n\t});\n\n\t// Insert users\n\tjQuery(\".ct_insert_users__delete\").click(function( e ){\n\t\tct_insert_users( true );\n\t});\n\n\t// Delete all spam users\n\tjQuery(\".ct_delete_all_users\").click(function( e ){\n\n\t\tif ( ! confirm( ctUsersCheck.ct_confirm_deletion_all ) )\n\t\t\treturn false;\n\t\tblinkElement('ct_delete_all_users');\n\t\tct_delete_all_users( e );\n\n\t});\n\n\tfunction ct_insert_users(delete_accounts){\n\n\t\tdelete_accounts = delete_accounts || null;\n\n\t\tvar data = {\n\t\t\t'action': 'ajax_insert_users',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'no_cache': Math.random()\n\t\t};\n\n\t\tif(delete_accounts)\n\t\t\tdata['delete'] = true;\n\n\t\tlet waitingPopup = document.createElement('div');\n\t\twaitingPopup.setAttribute('class', 'apbct-popup');\n\t\twaitingPopup.setAttribute('id', 'apbct_popup');\n\t\twaitingPopup.setAttribute('style', 'font-size: 20px');\n\t\twaitingPopup.innerText = 'Wait for users handling!..'\n\t\tdocument.body.append(waitingPopup);\n\t\tdocument.body.classList.add('apbct-popup-fade');\n\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tif(delete_accounts)\n\t\t\t\t\talert('Deleted ' + msg + ' users');\n\t\t\t\telse\n\t\t\t\t\talert('Inserted ' + msg + ' users');\n\t\t\t\tjQuery('#apbct_popup')[0].remove()\n\t\t\t\tdocument.body.classList.remove('apbct-popup-fade');\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t});\n\t}\n\n\n\t/**\n\t * Checked ct_accurate_check\n\t */\n\tjQuery('#ct_accurate_check').change(function () {\n\t\tif(this.checked) {\n\t\t\tjQuery('#ct_allow_date_range').prop('checked', true);\n\t\t\tjQuery('.ct_date').prop('checked', true).attr('disabled',false);\n\t\t}\n\t});\n});\n\n/**\n * Get cookie by name\n * @param name\n * @returns {string|undefined}\n */\nfunction getCookie(name) {\n\tlet matches = document.cookie.match(new RegExp(\n\t\t\"(?:^|; )\" + name.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g, '\\\\$1') + \"=([^;]*)\"\n\t));\n\treturn matches ? decodeURIComponent(matches[1]) : undefined;\n}\n\n// Binds the bulk action events to the submit buttons.\n// This code has been copied from wordpress core js file wp-admin/js/media.js:184\njQuery( '#doaction' ).on( 'click', function( event ) {\n\t/*\n * Handle the bulk action based on its value.\n */\n\tjQuery( 'select[name=\"action\"]' ).each( function() {\n\t\tvar optionValue = jQuery( this ).val();\n\t\tif ( 'delete' === optionValue ) {\n\t\t\tif ( ! showNotice.warn() ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n});\n"],"names":["String","prototype","printf","arg","formatted","this","arguments","before_formatted","substring","indexOf","after_formatted","length","ct_working","document","cookie","ct_new_check","ct_cooling_down_flag","ct_close_animate","ct_accurate_check","ct_pause","ct_prev_accurate","ctUsersCheck","ct_prev_from","ct_prev_till","ct_cool_down_time","ct_requests_counter","ct_max_requests","ct_ajax_nonce","ct_users_total","ct_users_checked","ct_users_spam","ct_users_bad","ct_unchecked","ct_date_from","ct_date_till","apbct_cookie__get","names","prefixes","split","forEach","item","i","arr","curr","trim","name","all","prefix","apbct_get_cookie","animate_comment","to","id","jQuery","fadeTo","ct_clear_users","from","till","ctSecure","is","val","location","protocol","data","action","security","no_cache","Math","random","ajax","type","url","ajaxurl","success","msg","ct_show_users_info","ct_send_users","ct_cooling_down_toggle","hide","let","new_href","href","check_amount","setTimeout","new_check","unchecked","amount","offset","Number","getCookie","parseJSON","parseInt","error","confirm","error_message","end","checked","spam","bad","status_string","ct_status_string","ct_status_string_warning","html","jqXHR","textStatus","errorThrown","show","timeout","message","ct_toggle_depended","obj","secondary","depended","prop","removeProp","ct_start_check","continue_check","alert","ct_specify_date_range","ct_select_date_range","ct_delete_all_users","e","target","addClass","removeClass","matches","match","RegExp","replace","decodeURIComponent","undefined","ready","on","attr","datepicker","setDefaults","regional","dates","dateFormat","maxDate","changeMonth","changeYear","showAnim","onSelect","selectedDate","option","instance","date","parseDate","settings","_defaults","not","blinkElement","ct_insert_users","delete_accounts","waitingPopup","createElement","setAttribute","innerText","body","append","classList","add","remove","window","reload","click","ct_check","accurate","JSON","stringify","ct_id","fadeOut","user_id","status","filename","ct_csv_filename","dummy","ct_bad_csv","URL","createObjectURL","Blob","download","appendChild","ct_confirm_deletion_all","change","event","each","showNotice","warn","preventDefault"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["cleantalk-users-checkspam.js"],"sourcesContent":["// Printf for JS\nString.prototype.printf = function(){\n var formatted = this;\n for( var arg in arguments ) {\n\t\tvar before_formatted = formatted.substring(0, formatted.indexOf(\"%s\", 0));\n\t\tvar after_formatted = formatted.substring(formatted.indexOf(\"%s\", 0)+2, formatted.length);\n\t\tformatted = before_formatted + arguments[arg] + after_formatted;\n }\n return formatted;\n};\n\n// Set deafult amount to check by request.\ndocument.cookie = \"ct_check_users__amount=\" + 100 + \"; path=/; samesite=lax\";\n\n// Flags\nvar ct_working = false,\n\tct_new_check = true,\n\tct_cooling_down_flag = false,\n\tct_close_animate = true,\n\tct_accurate_check = false,\n\tct_pause = false,\n\tct_prev_accurate = ctUsersCheck.ct_prev_accurate,\n\tct_prev_from = ctUsersCheck.ct_prev_from,\n\tct_prev_till = ctUsersCheck.ct_prev_till;\n// Settings\nvar ct_cool_down_time = 90000,\n\tct_requests_counter = 0,\n\tct_max_requests = 60;\n// Variables\nvar ct_ajax_nonce = ctUsersCheck.ct_ajax_nonce,\n\tct_users_total = 0,\n\tct_users_checked = 0,\n\tct_users_spam = 0,\n\tct_users_bad = 0,\n\tct_unchecked = 'unset',\n\tct_date_from = 0,\n\tct_date_till = 0;\n\n/* Function: Reuturns cookie with prefix */\nfunction apbct_cookie__get(names, prefixes){\n\tvar cookie = {};\n\tnames = names || null;\n\tif(typeof names == 'string') names = names.split();\n\tprefixes = prefixes || ['apbct_', 'ct_'];\n\tif(prefixes === 'none') prefixes = null;\n\tif(typeof prefixes == 'string') prefixes = prefixes.split();\n\tdocument.cookie.split(';').forEach(function(item, i, arr){\n\t\tvar curr = item.trim().split('=');\n\t\t// Detect by full cookie name\n\t\tif(names){\n\t\t\tnames.forEach(function(name, i, all){\n\t\t\t\tif(curr[0] === name)\n\t\t\t\t\tcookie[curr[0]] = (curr[1]);\n\t\t\t});\n\t\t}\n\t\t// Detect by name prefix\n\t\tif(prefixes){\n\t\t\tprefixes.forEach(function(prefix, i, all){\n\t\t\t\tif(curr[0].indexOf(prefix) === 0)\n\t\t\t\t\tcookie[curr[0]] = (curr[1]);\n\t\t\t});\n\t\t}\n\t});\n\treturn cookie;\n}\n\nfunction apbct_get_cookie( name ){\n\tvar cookie = apbct_cookie__get( name, name );\n\tif(typeof cookie === 'object' && typeof cookie[name] != 'undefined'){\n\t\treturn cookie[name];\n\t}else\n\t\treturn null;\n}\n\nfunction animate_comment(to,id){\n\tif(ct_close_animate){\n\t\tif(to === 0.3){\n\t\t\tjQuery('#comment-'+id).fadeTo(200,to,function(){\n\t\t\t\tanimate_comment(1,id)\n\t\t\t});\n\t\t}else{\n\t\t\tjQuery('#comment-'+id).fadeTo(200,to,function(){\n\t\t\t\tanimate_comment(0.3,id)\n\t\t\t});\n\t\t}\n\t}else{\n\t\tct_close_animate=true;\n\t}\n}\n\nfunction ct_clear_users(){\n\n\tvar from = 0, till = 0;\n\tif(jQuery('#ct_allow_date_range').is(':checked')) {\n\t\tfrom = jQuery('#ct_date_range_from').val();\n\t\ttill = jQuery('#ct_date_range_till').val();\n\t}\n\n\tvar ctSecure = location.protocol === 'https:' ? '; secure' : '';\n\tdocument.cookie = 'apbct_check_users_offset' + \"=\" + 0 + \"; path=/; samesite=lax\" + ctSecure;\n\n\tvar data = {\n\t\t'action' : 'ajax_clear_users',\n\t\t'security' : ct_ajax_nonce,\n\t\t'from' : from,\n\t\t'till' : till,\n\t\t'no_cache': Math.random()\n\t};\n\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function(msg){\n\t\t\tct_show_users_info();\n\t\t\tct_send_users();\n\t\t}\n\t});\n\n}\n\n//Continues the check after cooldown time\n//Called by ct_send_users();\nfunction ct_cooling_down_toggle(){\n\tct_cooling_down_flag = false;\n\tct_send_users();\n\tct_show_users_info();\n}\n\nfunction ct_send_users(){\n\n\tif(ct_cooling_down_flag === true)\n\t\treturn;\n\tif (ct_pause === true) {\n\t\tct_working=false;\n\t\tjQuery('#ct_working_message').hide();\n\t\tlet new_href = 'users.php?page=ct_check_users&ct_worked=1';\n\t\tif(ct_date_from !== 0 && ct_date_till !== 0)\n\t\t\tnew_href+='&from='+ct_date_from+'&till='+ct_date_till;\n\t\tlocation.href = new_href;\n\t\treturn;\n\t}\n\n\tif(ct_requests_counter >= ct_max_requests){\n\t\tsetTimeout(ct_cooling_down_toggle, ct_cool_down_time);\n\t\tct_requests_counter = 0;\n\t\tct_cooling_down_flag = true;\n\t\treturn;\n\t}else{\n\t\tct_requests_counter++;\n\t}\n\n\tvar check_amount = apbct_get_cookie('ct_check_users__amount');\n\n\tvar data = {\n\t\taction: 'ajax_check_users',\n\t\tsecurity: ct_ajax_nonce,\n\t\tnew_check: ct_new_check,\n\t\tunchecked: ct_unchecked,\n\t\tamount: check_amount,\n\t\t'no_cache': Math.random(),\n\t\t'offset' : Number(getCookie('apbct_check_users_offset'))\n\t};\n\n\tif(ct_accurate_check)\n\t\tdata['accurate_check'] = true;\n\n\tif(ct_date_from && ct_date_till){\n\t\tdata['from'] = ct_date_from;\n\t\tdata['till'] = ct_date_till;\n\t}\n\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function(msg){\n\n\t\t\tmsg = jQuery.parseJSON(msg);\n\n\t\t\tif(parseInt(msg.error)){\n\t\t\t\tct_working=false;\n\t\t\t\tif(!confirm(msg.error_message+\". Do you want to proceed?\")){\n\t\t\t\t\tvar new_href = 'users.php?page=ct_check_users';\n\t\t\t\t\tif(ct_date_from != 0 && ct_date_till != 0)\n\t\t\t\t\t\tnew_href+='&from='+ct_date_from+'&till='+ct_date_till;\n\t\t\t\t\tlocation.href = new_href;\n\t\t\t\t}else\n\t\t\t\t\tct_send_users();\n\t\t\t}else{\n\t\t\t\tct_new_check = false;\n\t\t\t\tif(parseInt(msg.end) == 1){\n\t\t\t\t\tif(parseInt(msg.end) == 1)\n\t\t\t\t\t\tdocument.cookie = 'ct_paused_users_check=0; path=/; samesite=lax';\n\t\t\t\t\tct_working=false;\n\t\t\t\t\tjQuery('#ct_working_message').hide();\n\t\t\t\t\tvar new_href = 'users.php?page=ct_check_users&ct_worked=1';\n\t\t\t\t\tif(ct_date_from != 0 && ct_date_till != 0)\n\t\t\t\t\t\tnew_href+='&from='+ct_date_from+'&till='+ct_date_till;\n\t\t\t\t\tlocation.href = new_href;\n\t\t\t\t}else if(parseInt(msg.end) == 0){\n\t\t\t\t\tct_users_checked = parseInt( ct_users_checked ) + parseInt( msg.checked );\n\t\t\t\t\tct_users_spam = parseInt( ct_users_spam ) + parseInt (msg.spam );\n\t\t\t\t\tct_users_bad = parseInt( msg.bad );\n\t\t\t\t\tct_unchecked = ct_users_total - ct_users_checked - ct_users_bad;\n\t\t\t\t\tvar status_string = String(ctUsersCheck.ct_status_string);\n\t\t\t\t\tstatus_string = status_string.printf(ct_users_checked, ct_users_spam, ct_users_bad);\n\t\t\t\t\tif(parseInt(ct_users_spam) > 0)\n\t\t\t\t\t\tstatus_string += ctUsersCheck.ct_status_string_warning;\n\t\t\t\t\tjQuery('#ct_checking_status').html(status_string);\n\t\t\t\t\tjQuery('#ct_error_message').hide();\n\n\t\t\t\t\tvar offset = Number(getCookie('apbct_check_users_offset')) + 100;\n\t\t\t\t\tvar ctSecure = location.protocol === 'https:' ? '; secure' : '';\n\t\t\t\t\tdocument.cookie = 'apbct_check_users_offset' + \"=\" + offset + \"; path=/; samesite=lax\" + ctSecure;\n\n\t\t\t\t\tct_send_users();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n error: function(jqXHR, textStatus, errorThrown) {\n\t\t\tif(check_amount > 20){\n\t\t\t\tcheck_amount -= 20;\n\t\t\t\tdocument.cookie = \"ct_check_users__amount=\" + check_amount + \"; path=/; samesite=lax\";\n\t\t\t}\n\t\t\tjQuery('#ct_error_message').show();\n\t\t\tjQuery('#cleantalk_ajax_error').html(textStatus);\n\t\t\tjQuery('#cleantalk_js_func').html('Check users');\n\t\t\tsetTimeout(ct_send_users(), 3000);\n },\n timeout: 25000\n\t});\n}\nfunction ct_show_users_info(){\n\n\tif( ct_working ){\n\n\t\tif(ct_cooling_down_flag === true){\n\t\t\tjQuery('#ct_cooling_notice').html('Waiting for API to cool down. (About a minute)').show();\n\t\t\treturn;\n\t\t}else{\n\t\t\tjQuery('#ct_cooling_notice').hide();\n\t\t}\n\n\t\tif( ! ct_users_total ){\n\n\t\t\tvar data = {\n\t\t\t\t'action': 'ajax_info_users',\n\t\t\t\t'security': ct_ajax_nonce,\n\t\t\t\t'no_cache': Math.random()\n\t\t\t};\n\n\t\t\tif( ct_date_from && ct_date_till ){\n\t\t\t\tdata['from'] = ct_date_from;\n\t\t\t\tdata['till'] = ct_date_till;\n\t\t\t}\n\n\t\t\tjQuery.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: ajaxurl,\n\t\t\t\tdata: data,\n\t\t\t\tsuccess: function(msg){\n\t\t\t\t\tmsg = jQuery.parseJSON(msg);\n\t\t\t\t\tjQuery('#ct_checking_status').html(msg.message);\n\t\t\t\t\tct_users_spam = msg.spam;\n\t\t\t\t\tct_users_checked = msg.checked;\n\t\t\t\t\tct_users_bad = msg.bad;\n\t\t\t\t},\n\t\t\t\terror: function (jqXHR, textStatus, errorThrown){\n\t\t\t\t\tjQuery('#ct_error_message').show();\n\t\t\t\t\tjQuery('#cleantalk_ajax_error').html(textStatus);\n\t\t\t\t\tjQuery('#cleantalk_js_func').html('Show users');\n\t\t\t\t\tsetTimeout(ct_show_users_info(), 3000);\n\t\t\t\t},\n\t\t\t\ttimeout: 15000\n\t\t\t});\n\t\t}\n\t}\n}\n// Function to toggle dependences\nfunction ct_toggle_depended(obj, secondary){\n\n secondary = secondary || null;\n\n\tvar depended = jQuery(obj.data('depended')),\n\t\tstate = obj.data('state');\n\n\tif(!state && !secondary){\n\t\tobj.data('state', true);\n\t\tdepended.removeProp('disabled');\n\t}else{\n\t\tobj.data('state', false);\n\t\tdepended.prop('disabled', true);\n\t\tdepended.removeProp('checked');\n\t\tif(depended.data('depended'))\n\t\t\tct_toggle_depended(depended, true);\n\t}\n}\n\n// Main function of checking\nfunction ct_start_check( continue_check ){\n\n\tcontinue_check = continue_check || null;\n\n\tif(jQuery('#ct_allow_date_range').is(':checked')){\n\n\t\tct_date_from = jQuery('#ct_date_range_from').val();\n\t\tct_date_till = jQuery('#ct_date_range_till').val();\n\n\t\tif(!(ct_date_from !== '' && ct_date_till !== '')){\n\t\t\talert(ctUsersCheck.ct_specify_date_range);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif(jQuery('#ct_accurate_check').is(':checked')){\n\t\tct_accurate_check = true;\n\t}\n\n\t//\n\tif (\n\t\tjQuery('#ct_accurate_check').is(':checked') &&\n\t\t! jQuery('#ct_allow_date_range').is(':checked')\n\t) {\n\t\talert(ctUsersCheck.ct_select_date_range);\n\t\treturn;\n\t}\n\n\tjQuery('.ct_to_hide').hide();\n\tjQuery('#ct_working_message').show();\n\tjQuery('#ct_preloader').show();\n\tjQuery('#ct_pause').show();\n\n\tct_working = true;\n\n\tif( continue_check ){\n\t\tct_show_users_info();\n\t\tct_send_users();\n\t} else {\n\t\tct_clear_users();\n\t}\n\n}\n\nfunction ct_delete_all_users( e ){\n\n\tvar data = {\n\t\t'action': 'ajax_delete_all_users',\n\t\t'security': ct_ajax_nonce,\n\t\t'no_cache': Math.random()\n\t};\n\n\tjQuery('.' + e.target.id).addClass('disabled');\n\tjQuery.ajax({\n\t\ttype: \"POST\",\n\t\turl: ajaxurl,\n\t\tdata: data,\n\t\tsuccess: function( msg ){\n\t\t\tif( msg > 0 ){\n\t\t\t\tjQuery('#cleantalk_users_left').html(msg);\n\t\t\t\tct_delete_all_users( e, data );\n\t\t\t}else{\n\t\t\t\tjQuery('.' + e.target.id).removeClass('disabled');\n\t\t\t\tlocation.href='users.php?page=ct_check_users';\n\t\t\t}\n\t\t},\n\t\terror: function(jqXHR, textStatus, errorThrown) {\n\t\t\tjQuery('#ct_error_message').show();\n\t\t\tjQuery('#cleantalk_ajax_error').html(textStatus);\n\t\t\tjQuery('#cleantalk_js_func').html('All users deleteion');\n\t\t\tsetTimeout(ct_delete_all_users( e ), 3000);\n\t\t},\n\t\ttimeout: 25000\n\t});\n}\n\njQuery(document).ready(function(){\n\n\t// Setting dependences\n\n\t// Prev check parameters\n\tif(ct_prev_accurate){\n\t\tjQuery(\"#ct_accurate_check\").prop('checked', true);\n\t}\n\tif(ct_prev_from){\n\t\tjQuery(\"#ct_allow_date_range\").prop('checked', true).data('state', true);\n\t\tjQuery(\"#ct_date_range_from\").removeProp('disabled').val(ct_prev_from);\n\t\tjQuery(\"#ct_date_range_till\").removeProp('disabled').val(ct_prev_till);\n\t}\n\n\t// Toggle dependences\n\tjQuery(\"#ct_allow_date_range\").on('change', function(){\n\t\tdocument.cookie = 'ct_users_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n\t\tdocument.cookie = 'ct_users_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n\t\tif( this.checked ) {\n\t\t\tdocument.cookie = 'ct_users_dates_allowed=1; path=/; samesite=lax';\n\t\t\tjQuery('.ct_date').prop('checked', true).attr('disabled',false);\n\t\t} else {\n\t\t\tdocument.cookie = 'ct_users_dates_allowed=0; path=/; samesite=lax';\n\t\t\tjQuery('.ct_date').prop('disabled', true).attr('disabled',true);\n\t\t}\n\t});\n\n\tjQuery.datepicker.setDefaults(jQuery.datepicker.regional['en']);\n\tvar dates = jQuery('#ct_date_range_from, #ct_date_range_till').datepicker(\n\t\t{\n\t\t\tdateFormat: 'M d yy',\n\t\t\tmaxDate:\"+0D\",\n\t\t\tchangeMonth:true,\n\t\t\tchangeYear:true,\n\t\t\tshowAnim: 'slideDown',\n\t\t\tonSelect: function(selectedDate){\n\t\t\tvar option = this.id == \"ct_date_range_from\" ? \"minDate\" : \"maxDate\",\n\t\t\t\tinstance = jQuery( this ).data( \"datepicker\" ),\n\t\t\t\tdate = jQuery.datepicker.parseDate(\n\t\t\t\t\tinstance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat,\n\t\t\t\t\tselectedDate, instance.settings);\n\t\t\t\tdates.not(this).datepicker(\"option\", option, date);\n\t\t\t\tdocument.cookie = 'ct_users_dates_from='+ jQuery('#ct_date_range_from').val() +'; path=/; samesite=lax';\n\t\t\t\tdocument.cookie = 'ct_users_dates_till='+ jQuery('#ct_date_range_till').val() +'; path=/; samesite=lax';\n\t\t\t}\n\t\t}\n\t);\n\n\t// Check users\n\tjQuery(\"#ct_check_spam_button\").click(function(){\n\t\tdocument.cookie = 'ct_paused_users_check=0; path=/; samesite=lax';\n\t\tct_pause = false;\n\n\t\t//\n\n\n\t\tct_start_check(false);\n\t});\n\tjQuery(\"#ct_proceed_check_button\").click(function(){\n\t\tct_pause = false;\n\t\tct_start_check(true);\n\t});\n\n\t// Pause the check\n\tjQuery('#ct_pause').on('click', function(){\n\t\tct_pause = true;\n\t\tvar ct_check = {\n\t\t\t'accurate': ct_accurate_check,\n\t\t\t'from' : ct_date_from,\n\t\t\t'till' : ct_date_till\n\t\t};\n\t\tdocument.cookie = 'ct_paused_users_check=' + JSON.stringify(ct_check) + '; path=/; samesite=lax';\n\t});\n\n\t//Approve button\n\tjQuery(\".cleantalk_delete_from_list_button\").click(function(){\n\t\tct_id = jQuery(this).attr(\"data-id\");\n\t\t// Approving\n\t\tvar data = {\n\t\t\t'action': 'ajax_ct_approve_user',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'id': ct_id,\n\t\t\t'no_cache': Math.random()\n\t\t};\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tjQuery(\"#comment-\"+ct_id).fadeOut('slow', function(){\n\t\t\t\t\tjQuery(\"#comment-\"+ct_id).remove();\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\t// Positive feedback\n\t\tvar data = {\n\t\t\t'action': 'ct_feedback_user',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'user_id': ct_id,\n\t\t\t'status': 'approve',\n\t\t\t'no_cache': Math.random()\n\t\t};\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tif(msg == 1){\n\t\t\t\t\t// Success\n\t\t\t\t}\n\t\t\t\tif(msg == 0){\n\t\t\t\t\t// Error occurred\n\t\t\t\t}\n\t\t\t\tif(msg == 'no_hash'){\n\t\t\t\t\t// No hash\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function(jqXHR, textStatus, errorThrown) {\n\n\t\t\t},\n\t\t\ttimeout: 5000\n\t\t});\n\n\t});\n\n\tfunction blinkElement(id) {\n\t\tjQuery(\"#\" + id).fadeTo(500, 0.25).fadeTo(500, 1);\n\t}\n\n\tfunction stopBlinkElement(id) {\n\t\tjQuery(\"#\" + id).fadeTo(1)\n\t}\n\n\t// Request to Download CSV file.\n\tjQuery(\".ct_get_csv_file\").click(function( e ){\n\t\tvar data = {\n\t\t\t'action': 'ajax_ct_get_csv_file',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'filename': ctUsersCheck.ct_csv_filename,\n\t\t\t'no_cache': Math.random()\n\t\t};\n\t\tjQuery('.' + e.target.id).addClass('disabled');\n\t\tblinkElement('ct_get_csv_file');\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tif( parseInt(msg) === 0 ) {\n\t\t\t\t\talert(ctUsersCheck.ct_bad_csv);\n\t\t\t\t} else {\n\t\t\t\t\tvar url = URL.createObjectURL(new Blob([msg]));\n\n\t\t\t\t\tvar dummy = document.createElement('a');\n\t\t\t\t\tdummy.href = url;\n\t\t\t\t\tdummy.download = ctUsersCheck.ct_csv_filename + '.csv';\n\n\t\t\t\t\tdocument.body.appendChild(dummy);\n\t\t\t\t\tdummy.click();\n\t\t\t\t}\n\t\t\t\tjQuery('.' + e.target.id).removeClass('disabled');\n\t\t\t\tstopBlinkElement('ct_get_csv_file');\n\t\t\t}\n\t\t});\n\t});\n\n\t// Delete inserted users\n\tjQuery(\".ct_insert_users\").click(function( e ){\n\t\tct_insert_users();\n\t});\n\n\t// Insert users\n\tjQuery(\".ct_insert_users__delete\").click(function( e ){\n\t\tct_insert_users( true );\n\t});\n\n\t// Delete all spam users\n\tjQuery(\".ct_delete_all_users\").click(function( e ){\n\n\t\tif ( ! confirm( ctUsersCheck.ct_confirm_deletion_all ) )\n\t\t\treturn false;\n\t\tblinkElement('ct_delete_all_users');\n\t\tct_delete_all_users( e );\n\n\t});\n\n\tfunction ct_insert_users(delete_accounts){\n\n\t\tdelete_accounts = delete_accounts || null;\n\n\t\tvar data = {\n\t\t\t'action': 'ajax_insert_users',\n\t\t\t'security': ct_ajax_nonce,\n\t\t\t'no_cache': Math.random()\n\t\t};\n\n\t\tif(delete_accounts)\n\t\t\tdata['delete'] = true;\n\n\t\tlet waitingPopup = document.createElement('div');\n\t\twaitingPopup.setAttribute('class', 'apbct-popup');\n\t\twaitingPopup.setAttribute('id', 'apbct_popup');\n\t\twaitingPopup.setAttribute('style', 'font-size: 20px');\n\t\twaitingPopup.innerText = 'Wait for users handling!..'\n\t\tdocument.body.append(waitingPopup);\n\t\tdocument.body.classList.add('apbct-popup-fade');\n\n\t\tjQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: ajaxurl,\n\t\t\tdata: data,\n\t\t\tsuccess: function(msg){\n\t\t\t\tif(delete_accounts)\n\t\t\t\t\talert('Deleted ' + msg + ' users');\n\t\t\t\telse\n\t\t\t\t\talert('Inserted ' + msg + ' users');\n\t\t\t\tjQuery('#apbct_popup')[0].remove()\n\t\t\t\tdocument.body.classList.remove('apbct-popup-fade');\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t});\n\t}\n\n\n\t/**\n\t * Checked ct_accurate_check\n\t */\n\tjQuery('#ct_accurate_check').change(function () {\n\t\tif(this.checked) {\n\t\t\tjQuery('#ct_allow_date_range').prop('checked', true);\n\t\t\tjQuery('.ct_date').prop('checked', true).attr('disabled',false);\n\t\t}\n\t});\n});\n\n/**\n * Get cookie by name\n * @param name\n * @returns {string|undefined}\n */\nfunction getCookie(name) {\n\tlet matches = document.cookie.match(new RegExp(\n\t\t\"(?:^|; )\" + name.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g, '\\\\$1') + \"=([^;]*)\"\n\t));\n\treturn matches ? decodeURIComponent(matches[1]) : undefined;\n}\n\n// Binds the bulk action events to the submit buttons.\n// This code has been copied from wordpress core js file wp-admin/js/media.js:184\njQuery( '#doaction' ).on( 'click', function( event ) {\n\t/*\n * Handle the bulk action based on its value.\n */\n\tjQuery( 'select[name=\"action\"]' ).each( function() {\n\t\tvar optionValue = jQuery( this ).val();\n\t\tif ( 'delete' === optionValue ) {\n\t\t\tif ( ! showNotice.warn() ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n});\n"],"file":"cleantalk-users-checkspam.min.js"} \ No newline at end of file diff --git a/js/cleantalk-users-editscreen.min.js b/js/cleantalk-users-editscreen.min.js index a2e807c2f..bdb95991e 100644 --- a/js/cleantalk-users-editscreen.min.js +++ b/js/cleantalk-users-editscreen.min.js @@ -1,2 +1,57 @@ -function ct_is_email(e){return e.search(/.*@.*\..*/)}function ct_is_ip(e){return e.search(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)}jQuery(document).ready(function(){parseInt(ctUsersScreen.ct_show_check_links)&&(jQuery(".column-email a").each(function(){var e=jQuery(this).html();-1!==ct_is_email(e)&&jQuery(this).after(' ')}),jQuery(".username.column-username").each(function(){var e=jQuery(this).siblings(".apbct_status").children("span"),t=e.attr("id"),e=e.text(),e=jQuery("",{text:e}),c=jQuery("",{class:"apbct-icon-ok"}),r=jQuery("",{class:"apbct-icon-cancel",css:{color:"red"}});"apbct_not_checked"===t&&jQuery(this).children(".row-actions").before(c).before(e),"apbct_checked_not_spam"===t&&(c.attr("style","color:green;"),jQuery(this).children(".row-actions").before(c).before(e)),"apbct_checked_spam"===t&&jQuery(this).children(".row-actions").before(r).before(e)}))}); +function ct_is_email(str){ + return str.search(/.*@.*\..*/); +} +function ct_is_ip(str){ + return str.search(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/); +} + +jQuery(document).ready(function(){ + + + if(parseInt(ctUsersScreen.ct_show_check_links)) { + + /* Shows link to blacklists near every email and IP address */ + jQuery('.column-email a').each(function(){ + var ct_curr_str = jQuery(this).html(); + if( ct_is_email(ct_curr_str) !== -1 ){ + jQuery(this).after(' '); + } + }); + + /* Show checked ico near avatar */ + jQuery('.username.column-username').each(function(){ + + var apbct_checking_el = jQuery(this).siblings('.apbct_status').children('span'); + var apbct_checking_status = apbct_checking_el.attr('id'); + var apbct_checking_status_text = apbct_checking_el.text(); + + var apbct_add_text_element = jQuery('', { + text : apbct_checking_status_text + }); + var apbct_add_ico_ok = jQuery('', { + class : 'apbct-icon-ok' + }); + var apbct_add_ico_cancel = jQuery('', { + class : 'apbct-icon-cancel', + css : { + color : 'red' + } + }); + + if( apbct_checking_status ==='apbct_not_checked' ) { + jQuery(this).children('.row-actions').before(apbct_add_ico_ok).before(apbct_add_text_element); + } + if( apbct_checking_status ==='apbct_checked_not_spam' ) { + apbct_add_ico_ok.attr('style', 'color:green;'); + jQuery(this).children('.row-actions').before(apbct_add_ico_ok).before(apbct_add_text_element); + } + if( apbct_checking_status ==='apbct_checked_spam' ) { + jQuery(this).children('.row-actions').before(apbct_add_ico_cancel).before(apbct_add_text_element); + } + + }); + + } + +}); //# sourceMappingURL=cleantalk-users-editscreen.min.js.map diff --git a/js/cleantalk-users-editscreen.min.js.map b/js/cleantalk-users-editscreen.min.js.map index 500e6e1f8..944296ac2 100644 --- a/js/cleantalk-users-editscreen.min.js.map +++ b/js/cleantalk-users-editscreen.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cleantalk-users-editscreen.min.js","sources":["cleantalk-users-editscreen.js"],"sourcesContent":["function ct_is_email(str){\n\treturn str.search(/.*@.*\\..*/);\n}\nfunction ct_is_ip(str){\n\treturn str.search(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/);\n}\n\njQuery(document).ready(function(){\n\n\n\tif(parseInt(ctUsersScreen.ct_show_check_links)) {\n\n\t\t/* Shows link to blacklists near every email and IP address */\n\t\tjQuery('.column-email a').each(function(){\n\t\t\tvar ct_curr_str = jQuery(this).html();\n\t\t\tif( ct_is_email(ct_curr_str) !== -1 ){\n\t\t\t\tjQuery(this).after(' ');\n\t\t\t}\n\t\t});\n\n\t\t/* Show checked ico near avatar */\n\t\tjQuery('.username.column-username').each(function(){\n\n\t\t\tvar apbct_checking_el = jQuery(this).siblings('.apbct_status').children('span');\n\t\t\tvar apbct_checking_status = apbct_checking_el.attr('id');\n\t\t\tvar apbct_checking_status_text = apbct_checking_el.text();\n\n\t\t\tvar apbct_add_text_element = jQuery('', {\n\t\t\t\ttext : apbct_checking_status_text\n\t\t\t});\n\t\t\tvar apbct_add_ico_ok = jQuery('', {\n\t\t\t\tclass : 'apbct-icon-ok'\n\t\t\t});\n\t\t\tvar apbct_add_ico_cancel = jQuery('', {\n\t\t\t\tclass : 'apbct-icon-cancel',\n\t\t\t\tcss : {\n\t\t\t\t\tcolor : 'red'\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( apbct_checking_status ==='apbct_not_checked' ) {\n\t\t\t\tjQuery(this).children('.row-actions').before(apbct_add_ico_ok).before(apbct_add_text_element);\n\t\t\t}\n\t\t\tif( apbct_checking_status ==='apbct_checked_not_spam' ) {\n\t\t\t\tapbct_add_ico_ok.attr('style', 'color:green;');\n\t\t\t\tjQuery(this).children('.row-actions').before(apbct_add_ico_ok).before(apbct_add_text_element);\n\t\t\t}\n\t\t\tif( apbct_checking_status ==='apbct_checked_spam' ) {\n\t\t\t\tjQuery(this).children('.row-actions').before(apbct_add_ico_cancel).before(apbct_add_text_element);\n\t\t\t}\n\n\t\t});\n\n\t}\n\n});"],"names":["ct_is_email","str","search","ct_is_ip","jQuery","document","ready","parseInt","ctUsersScreen","ct_show_check_links","each","ct_curr_str","this","html","after","ct_img_src_new_tab","apbct_checking_el","siblings","children","apbct_checking_status","attr","apbct_checking_status_text","text","apbct_add_text_element","apbct_add_ico_ok","class","apbct_add_ico_cancel","css","color","before"],"mappings":"AAAA,SAASA,YAAYC,GACpB,OAAOA,EAAIC,OAAO,WAAW,CAC9B,CACA,SAASC,SAASF,GACjB,OAAOA,EAAIC,OAAO,sCAAsC,CACzD,CAEAE,OAAOC,QAAQ,EAAEC,MAAM,WAGnBC,SAASC,cAAcC,mBAAmB,IAG5CL,OAAO,iBAAiB,EAAEM,KAAK,WAC9B,IAAIC,EAAcP,OAAOQ,IAAI,EAAEC,KAAK,EACH,CAAC,IAA9Bb,YAAYW,CAAW,GAC1BP,OAAOQ,IAAI,EAAEE,MAAM,mDAAmDH,EAAY,6DAA6DA,EAAY,uCAAuCH,cAAcO,mBAAmB,QAAQ,CAE7O,CAAC,EAGDX,OAAO,2BAA2B,EAAEM,KAAK,WAExC,IAAIM,EAAoBZ,OAAOQ,IAAI,EAAEK,SAAS,eAAe,EAAEC,SAAS,MAAM,EAC1EC,EAAwBH,EAAkBI,KAAK,IAAI,EACnDC,EAA6BL,EAAkBM,KAAK,EAEpDC,EAAyBnB,OAAO,SAAU,CAC7CkB,KAAOD,CACR,CAAC,EACGG,EAAmBpB,OAAO,MAAO,CACpCqB,MAAS,eACV,CAAC,EACGC,EAAuBtB,OAAO,MAAO,CACxCqB,MAAS,oBACTE,IAAM,CACLC,MAAQ,KACT,CACD,CAAC,EAE4B,sBAAzBT,GACHf,OAAOQ,IAAI,EAAEM,SAAS,cAAc,EAAEW,OAAOL,CAAgB,EAAEK,OAAON,CAAsB,EAEhE,2BAAzBJ,IACHK,EAAiBJ,KAAK,QAAS,cAAc,EAC7ChB,OAAOQ,IAAI,EAAEM,SAAS,cAAc,EAAEW,OAAOL,CAAgB,EAAEK,OAAON,CAAsB,GAEhE,uBAAzBJ,GACHf,OAAOQ,IAAI,EAAEM,SAAS,cAAc,EAAEW,OAAOH,CAAoB,EAAEG,OAAON,CAAsB,CAGlG,CAAC,EAIH,CAAC"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["cleantalk-users-editscreen.js"],"sourcesContent":["function ct_is_email(str){\n\treturn str.search(/.*@.*\\..*/);\n}\nfunction ct_is_ip(str){\n\treturn str.search(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/);\n}\n\njQuery(document).ready(function(){\n\n\n\tif(parseInt(ctUsersScreen.ct_show_check_links)) {\n\n\t\t/* Shows link to blacklists near every email and IP address */\n\t\tjQuery('.column-email a').each(function(){\n\t\t\tvar ct_curr_str = jQuery(this).html();\n\t\t\tif( ct_is_email(ct_curr_str) !== -1 ){\n\t\t\t\tjQuery(this).after(' ');\n\t\t\t}\n\t\t});\n\n\t\t/* Show checked ico near avatar */\n\t\tjQuery('.username.column-username').each(function(){\n\n\t\t\tvar apbct_checking_el = jQuery(this).siblings('.apbct_status').children('span');\n\t\t\tvar apbct_checking_status = apbct_checking_el.attr('id');\n\t\t\tvar apbct_checking_status_text = apbct_checking_el.text();\n\n\t\t\tvar apbct_add_text_element = jQuery('', {\n\t\t\t\ttext : apbct_checking_status_text\n\t\t\t});\n\t\t\tvar apbct_add_ico_ok = jQuery('', {\n\t\t\t\tclass : 'apbct-icon-ok'\n\t\t\t});\n\t\t\tvar apbct_add_ico_cancel = jQuery('', {\n\t\t\t\tclass : 'apbct-icon-cancel',\n\t\t\t\tcss : {\n\t\t\t\t\tcolor : 'red'\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( apbct_checking_status ==='apbct_not_checked' ) {\n\t\t\t\tjQuery(this).children('.row-actions').before(apbct_add_ico_ok).before(apbct_add_text_element);\n\t\t\t}\n\t\t\tif( apbct_checking_status ==='apbct_checked_not_spam' ) {\n\t\t\t\tapbct_add_ico_ok.attr('style', 'color:green;');\n\t\t\t\tjQuery(this).children('.row-actions').before(apbct_add_ico_ok).before(apbct_add_text_element);\n\t\t\t}\n\t\t\tif( apbct_checking_status ==='apbct_checked_spam' ) {\n\t\t\t\tjQuery(this).children('.row-actions').before(apbct_add_ico_cancel).before(apbct_add_text_element);\n\t\t\t}\n\n\t\t});\n\n\t}\n\n});"],"file":"cleantalk-users-editscreen.min.js"} \ No newline at end of file diff --git a/js/src/apbct-public--8--browser-check.js b/js/src/apbct-public--8--browser-check.js index 5133a5ca1..d2f1ffa04 100644 --- a/js/src/apbct-public--8--browser-check.js +++ b/js/src/apbct-public--8--browser-check.js @@ -1,179 +1,281 @@ -const loaderContainer = document.createElement('div'); +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; -document.addEventListener('DOMContentLoaded', function() { - loaderContainer.className = 'ct-browser-check-container'; - let startTime = null; - let timeoutToShowResult = 3000; - - document.addEventListener('ctBotDetectorStart', function() { - loaderContainer.style.display = 'block'; - startTime = new Date(); - }); - - document.addEventListener('ctBotDetectorEnd', function() { - console.log('ctBotDetectorEnd'); - }); - - document.addEventListener('ctBotDetectorResult', function() { - if (startTime && new Date() - startTime < timeoutToShowResult) { - setTimeout(() => { - showResult(); - }, timeoutToShowResult - (new Date() - startTime)); - return; + constructor() { + this.addStyles(); + this.addEventListener(); + } + + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } + + this.showLoader(); + }); + } + + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); } - setTimeout(() => { - showResult(); - }, timeoutToShowResult); - }); + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } /** - * Show result + * Create and add styles */ - function showResult() { - let results = ['bot', 'human']; - let result = results[Math.floor(Math.random() * results.length)]; - - document.querySelector('.ct-browser-check-loader').remove(); - document.querySelector('.ct-browser-check-description').remove(); - document.querySelector('.ct-browser-check-container').style.height = '50px'; - - // prepare data - let title = 'botDetector'; - let svg = ''; - let arrowAction = ''; - switch (result) { - case 'bot': - console.log('bot'); - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; - } - document.querySelector('.ct-browser-check-title').textContent = title; - const dev = document.createElement('div'); - dev.className = 'ct-browser-check-human'; - dev.innerHTML = ` - ${svg} - > + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } `; - loaderContainer.appendChild(dev); + + document.head.appendChild(style); } +} +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; - document.addEventListener('ctBotDetectorError', function() { - console.log('ctBotDetectorError'); - }); +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } - console.log('DOMContentLoaded'); +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); - // Create and add styles - const style = document.createElement('style'); - style.textContent = ` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `; - document.head.appendChild(style); - - // Create loader container - loaderContainer.style.cssText = ` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `; - - // add div with title - const title = document.createElement('div'); - title.className = 'ct-browser-check-title'; - title.style.cssText = ` - border-bottom: 1px solid #bbbbbb; - `; - title.textContent = 'botDetector'; - loaderContainer.appendChild(title); - - // Create loader element - const loader = document.createElement('div'); - loader.className = 'ct-browser-check-loader'; - - // Add loader to container and container to body - loaderContainer.appendChild(loader); - document.body.appendChild(loaderContainer); - - // add div with description - const description = document.createElement('div'); - description.className = 'ct-browser-check-description'; - description.style.cssText = ` - border-top: 1px solid #bbbbbb; - `; - description.textContent = 'Browser check'; - loaderContainer.appendChild(description); -}); +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); -/** - * Hide browser check - */ -function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars - document.querySelector('.ct-browser-check-title').textContent = 'TRP'; - loaderContainer.style.right = '-70px'; - loaderContainer.style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.width = '40px'; - document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; -} +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } + +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } diff --git a/js/src/apbct-public-bundle.js b/js/src/apbct-public-bundle.js index e43401c20..cb180cc3e 100644 --- a/js/src/apbct-public-bundle.js +++ b/js/src/apbct-public-bundle.js @@ -4252,185 +4252,287 @@ function closeAllPopupTRP() { } } -const loaderContainer = document.createElement('div'); +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; -document.addEventListener('DOMContentLoaded', function() { - loaderContainer.className = 'ct-browser-check-container'; - let startTime = null; - let timeoutToShowResult = 3000; + constructor() { + this.addStyles(); + this.addEventListener(); + } - document.addEventListener('ctBotDetectorStart', function() { - loaderContainer.style.display = 'block'; - startTime = new Date(); - }); + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } - document.addEventListener('ctBotDetectorEnd', function() { - console.log('ctBotDetectorEnd'); - }); + this.showLoader(); + }); + } - document.addEventListener('ctBotDetectorResult', function() { - if (startTime && new Date() - startTime < timeoutToShowResult) { - setTimeout(() => { - showResult(); - }, timeoutToShowResult - (new Date() - startTime)); - return; - } - setTimeout(() => { - showResult(); - }, timeoutToShowResult); - }); + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } /** - * Show result + * Create and add styles */ - function showResult() { - let results = ['bot', 'human']; - let result = results[Math.floor(Math.random() * results.length)]; - - document.querySelector('.ct-browser-check-loader').remove(); - document.querySelector('.ct-browser-check-description').remove(); - document.querySelector('.ct-browser-check-container').style.height = '50px'; - - // prepare data - let title = 'botDetector'; - let svg = ''; - let arrowAction = ''; - switch (result) { - case 'bot': - console.log('bot'); - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; - } - document.querySelector('.ct-browser-check-title').textContent = title; - const dev = document.createElement('div'); - dev.className = 'ct-browser-check-human'; - dev.innerHTML = ` - ${svg} - > + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } `; - loaderContainer.appendChild(dev); + + document.head.appendChild(style); } +} +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } - document.addEventListener('ctBotDetectorError', function() { - console.log('ctBotDetectorError'); - }); +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); - console.log('DOMContentLoaded'); +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); - // Create and add styles - const style = document.createElement('style'); - style.textContent = ` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `; - document.head.appendChild(style); - - // Create loader container - loaderContainer.style.cssText = ` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `; - - // add div with title - const title = document.createElement('div'); - title.className = 'ct-browser-check-title'; - title.style.cssText = ` - border-bottom: 1px solid #bbbbbb; - `; - title.textContent = 'botDetector'; - loaderContainer.appendChild(title); - - // Create loader element - const loader = document.createElement('div'); - loader.className = 'ct-browser-check-loader'; - - // Add loader to container and container to body - loaderContainer.appendChild(loader); - document.body.appendChild(loaderContainer); - - // add div with description - const description = document.createElement('div'); - description.className = 'ct-browser-check-description'; - description.style.cssText = ` - border-top: 1px solid #bbbbbb; - `; - description.textContent = 'Browser check'; - loaderContainer.appendChild(description); -}); +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } -/** - * Hide browser check - */ -function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars - document.querySelector('.ct-browser-check-title').textContent = 'TRP'; - loaderContainer.style.right = '-70px'; - loaderContainer.style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.width = '40px'; - document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; -} +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } /** * @return {HTMLElement} event diff --git a/js/src/apbct-public-bundle_ext-protection.js b/js/src/apbct-public-bundle_ext-protection.js index 0910152c5..8325d5e85 100644 --- a/js/src/apbct-public-bundle_ext-protection.js +++ b/js/src/apbct-public-bundle_ext-protection.js @@ -4252,185 +4252,287 @@ function closeAllPopupTRP() { } } -const loaderContainer = document.createElement('div'); +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; -document.addEventListener('DOMContentLoaded', function() { - loaderContainer.className = 'ct-browser-check-container'; - let startTime = null; - let timeoutToShowResult = 3000; + constructor() { + this.addStyles(); + this.addEventListener(); + } - document.addEventListener('ctBotDetectorStart', function() { - loaderContainer.style.display = 'block'; - startTime = new Date(); - }); + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } - document.addEventListener('ctBotDetectorEnd', function() { - console.log('ctBotDetectorEnd'); - }); + this.showLoader(); + }); + } - document.addEventListener('ctBotDetectorResult', function() { - if (startTime && new Date() - startTime < timeoutToShowResult) { - setTimeout(() => { - showResult(); - }, timeoutToShowResult - (new Date() - startTime)); - return; - } - setTimeout(() => { - showResult(); - }, timeoutToShowResult); - }); + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } /** - * Show result + * Create and add styles */ - function showResult() { - let results = ['bot', 'human']; - let result = results[Math.floor(Math.random() * results.length)]; - - document.querySelector('.ct-browser-check-loader').remove(); - document.querySelector('.ct-browser-check-description').remove(); - document.querySelector('.ct-browser-check-container').style.height = '50px'; - - // prepare data - let title = 'botDetector'; - let svg = ''; - let arrowAction = ''; - switch (result) { - case 'bot': - console.log('bot'); - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; - } - document.querySelector('.ct-browser-check-title').textContent = title; - const dev = document.createElement('div'); - dev.className = 'ct-browser-check-human'; - dev.innerHTML = ` - ${svg} - > + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } `; - loaderContainer.appendChild(dev); + + document.head.appendChild(style); } +} +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } - document.addEventListener('ctBotDetectorError', function() { - console.log('ctBotDetectorError'); - }); +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); - console.log('DOMContentLoaded'); +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); - // Create and add styles - const style = document.createElement('style'); - style.textContent = ` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `; - document.head.appendChild(style); - - // Create loader container - loaderContainer.style.cssText = ` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `; - - // add div with title - const title = document.createElement('div'); - title.className = 'ct-browser-check-title'; - title.style.cssText = ` - border-bottom: 1px solid #bbbbbb; - `; - title.textContent = 'botDetector'; - loaderContainer.appendChild(title); - - // Create loader element - const loader = document.createElement('div'); - loader.className = 'ct-browser-check-loader'; - - // Add loader to container and container to body - loaderContainer.appendChild(loader); - document.body.appendChild(loaderContainer); - - // add div with description - const description = document.createElement('div'); - description.className = 'ct-browser-check-description'; - description.style.cssText = ` - border-top: 1px solid #bbbbbb; - `; - description.textContent = 'Browser check'; - loaderContainer.appendChild(description); -}); +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } -/** - * Hide browser check - */ -function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars - document.querySelector('.ct-browser-check-title').textContent = 'TRP'; - loaderContainer.style.right = '-70px'; - loaderContainer.style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.width = '40px'; - document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; -} +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } /** * Handle external forms diff --git a/js/src/apbct-public-bundle_full-protection.js b/js/src/apbct-public-bundle_full-protection.js index 421be1ee8..ced910092 100644 --- a/js/src/apbct-public-bundle_full-protection.js +++ b/js/src/apbct-public-bundle_full-protection.js @@ -5851,182 +5851,284 @@ function ctCheckInternalIsExcludedForm(action) { }); } -const loaderContainer = document.createElement('div'); +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; -document.addEventListener('DOMContentLoaded', function() { - loaderContainer.className = 'ct-browser-check-container'; - let startTime = null; - let timeoutToShowResult = 3000; + constructor() { + this.addStyles(); + this.addEventListener(); + } - document.addEventListener('ctBotDetectorStart', function() { - loaderContainer.style.display = 'block'; - startTime = new Date(); - }); + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } - document.addEventListener('ctBotDetectorEnd', function() { - console.log('ctBotDetectorEnd'); - }); + this.showLoader(); + }); + } - document.addEventListener('ctBotDetectorResult', function() { - if (startTime && new Date() - startTime < timeoutToShowResult) { - setTimeout(() => { - showResult(); - }, timeoutToShowResult - (new Date() - startTime)); - return; - } - setTimeout(() => { - showResult(); - }, timeoutToShowResult); - }); + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } /** - * Show result + * Create and add styles */ - function showResult() { - let results = ['bot', 'human']; - let result = results[Math.floor(Math.random() * results.length)]; - - document.querySelector('.ct-browser-check-loader').remove(); - document.querySelector('.ct-browser-check-description').remove(); - document.querySelector('.ct-browser-check-container').style.height = '50px'; - - // prepare data - let title = 'botDetector'; - let svg = ''; - let arrowAction = ''; - switch (result) { - case 'bot': - console.log('bot'); - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; - } - document.querySelector('.ct-browser-check-title').textContent = title; - const dev = document.createElement('div'); - dev.className = 'ct-browser-check-human'; - dev.innerHTML = ` - ${svg} - > + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } `; - loaderContainer.appendChild(dev); + + document.head.appendChild(style); } +} +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } - document.addEventListener('ctBotDetectorError', function() { - console.log('ctBotDetectorError'); - }); +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); - console.log('DOMContentLoaded'); +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); - // Create and add styles - const style = document.createElement('style'); - style.textContent = ` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `; - document.head.appendChild(style); - - // Create loader container - loaderContainer.style.cssText = ` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `; - - // add div with title - const title = document.createElement('div'); - title.className = 'ct-browser-check-title'; - title.style.cssText = ` - border-bottom: 1px solid #bbbbbb; - `; - title.textContent = 'botDetector'; - loaderContainer.appendChild(title); - - // Create loader element - const loader = document.createElement('div'); - loader.className = 'ct-browser-check-loader'; - - // Add loader to container and container to body - loaderContainer.appendChild(loader); - document.body.appendChild(loaderContainer); - - // add div with description - const description = document.createElement('div'); - description.className = 'ct-browser-check-description'; - description.style.cssText = ` - border-top: 1px solid #bbbbbb; - `; - description.textContent = 'Browser check'; - loaderContainer.appendChild(description); -}); +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } -/** - * Hide browser check - */ -function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars - document.querySelector('.ct-browser-check-title').textContent = 'TRP'; - loaderContainer.style.right = '-70px'; - loaderContainer.style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.width = '40px'; - document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; -} +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } diff --git a/js/src/apbct-public-bundle_int-protection.js b/js/src/apbct-public-bundle_int-protection.js index 36eccb182..481591c1e 100644 --- a/js/src/apbct-public-bundle_int-protection.js +++ b/js/src/apbct-public-bundle_int-protection.js @@ -4693,185 +4693,287 @@ function closeAllPopupTRP() { } } -const loaderContainer = document.createElement('div'); +class ctBrowserCheck { + titleCheck = 'botDetector in action!'; + titleHuman = "You're a real person!"; + title = ''; + logo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/148997/57d089a85d4d208d/web_hi_res_512.png'; + trpLogo = 'https://s3.eu-central-1.amazonaws.com/cleantalk-ctask-atts/accounts/1/153743/e7389e1e6ca21357/2.png'; + logoAlt = 'CleanTalk'; + privacyLink = 'https://cleantalk.org/privacy'; + termsLink = 'https://cleantalk.org/terms'; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgBad = ''; + // eslint-disable-next-line no-template-curly-in-string, max-len + svgGood = ''; + resultStore = 'ct-browser-check-result'; + container = null; + result = 'human'; + isLoader = true; -document.addEventListener('DOMContentLoaded', function() { - loaderContainer.className = 'ct-browser-check-container'; - let startTime = null; - let timeoutToShowResult = 3000; + constructor() { + this.addStyles(); + this.addEventListener(); + } - document.addEventListener('ctBotDetectorStart', function() { - loaderContainer.style.display = 'block'; - startTime = new Date(); - }); + addEventListener() { + document.addEventListener('ctBotDetectorStart', () => { + // if (localStorage.getItem(this.resultStore)) { + // this.showSavedResult(); + // return; + // } - document.addEventListener('ctBotDetectorEnd', function() { - console.log('ctBotDetectorEnd'); - }); + this.showLoader(); + }); + } - document.addEventListener('ctBotDetectorResult', function() { - if (startTime && new Date() - startTime < timeoutToShowResult) { - setTimeout(() => { - showResult(); - }, timeoutToShowResult - (new Date() - startTime)); - return; - } - setTimeout(() => { - showResult(); - }, timeoutToShowResult); - }); + showSavedResult() { + } + + showLoader() { + this.title = this.titleCheck; + this.render(); + this.showContainer(); + } + + render() { + if (document.querySelector('.ct-browser-check-container')) { + this.container = document.querySelector('.ct-browser-check-container'); + } else { + this.container = document.createElement('div'); + this.container.className = 'ct-browser-check-container'; + document.body.appendChild(this.container); + } + + this.container.innerHTML += `
`; + // this.container.innerHTML += `
${this.title}
`; + this.container.innerHTML += `
test
`; + this.container.innerHTML += this.companyInfoHtml(); + this.container.innerHTML += `
`; + } + + companyInfoHtml() { + return ` +
+
+ +
${this.logoAlt}
+
+
+ Privacy + · + Terms +
+
+ `; + } + + showContainer() { + this.container.style.display = 'block'; + } + + hideContainer() { + this.container.style.display = 'none'; + } /** - * Show result + * Create and add styles */ - function showResult() { - let results = ['bot', 'human']; - let result = results[Math.floor(Math.random() * results.length)]; - - document.querySelector('.ct-browser-check-loader').remove(); - document.querySelector('.ct-browser-check-description').remove(); - document.querySelector('.ct-browser-check-container').style.height = '50px'; - - // prepare data - let title = 'botDetector'; - let svg = ''; - let arrowAction = ''; - switch (result) { - case 'bot': - console.log('bot'); - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - break; - case 'human': - console.log('human'); - title = 'The Real Person'; - // eslint-disable-next-line no-template-curly-in-string, max-len - svg = ''; - arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; - break; - } - document.querySelector('.ct-browser-check-title').textContent = title; - const dev = document.createElement('div'); - dev.className = 'ct-browser-check-human'; - dev.innerHTML = ` - ${svg} - > + addStyles() { + const style = document.createElement('style'); + + style.textContent = ` + .ct-browser-check-loader { + width: 20px; + margin: 5px auto; + aspect-ratio: 1; + border: 3px solid #F3F6F9; + border-radius: 50%; + position: relative; + transform: rotate(45deg); + } + .ct-browser-check-loader::before { + content: ""; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 3px solid #026E88; + animation: l18 2s infinite linear; + } + @keyframes l18 { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} + 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} + 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} + 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} + } + + .ct-browser-check-container { + display: none; + font-size: 12px; + font-weight: bold; + color: #777777; + text-align: center; + position: fixed; + top: 20%; + right: -5px; + width: 365px; + height: 70px; + z-index: 9999; + background-color: #fff; + border-radius: 5px 0 0 5px; + border: 1px solid #bbbbbb; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); + transition: right 0.3s ease-in-out; + } `; - loaderContainer.appendChild(dev); + + document.head.appendChild(style); } +} +document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); + const apbctBrowserCheck = new ctBrowserCheck(); + console.log(apbctBrowserCheck); + apbctBrowserCheck.render(); +}); +// document.addEventListener('DOMContentLoaded', function() { +// loaderContainer.className = 'ct-browser-check-container'; +// let startTime = null; +// let timeoutToShowResult = 3000; + +// document.addEventListener('ctBotDetectorStart', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// showSavedResult(); +// return; +// } - document.addEventListener('ctBotDetectorError', function() { - console.log('ctBotDetectorError'); - }); +// loaderContainer.style.display = 'block'; +// startTime = new Date(); +// }); - console.log('DOMContentLoaded'); +// document.addEventListener('ctBotDetectorEnd', function() { +// console.log('ctBotDetectorEnd'); +// }); - // Create and add styles - const style = document.createElement('style'); - style.textContent = ` - .ct-browser-check-loader { - width: 20px; - margin: 5px auto; - aspect-ratio: 1; - border: 3px solid #F3F6F9; - border-radius: 50%; - position: relative; - transform: rotate(45deg); - } - .ct-browser-check-loader::before { - content: ""; - position: absolute; - inset: -3px; - border-radius: 50%; - border: 3px solid #026E88; - animation: l18 2s infinite linear; - } - @keyframes l18 { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0 ,0 0 ,0 0 )} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0 ,100% 0 ,100% 0 )} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0 )} - } - .ct-browser-check-human { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - } - .ct-browser-check-human svg { - width: 20px; - height: 20px; - } - .ct-browser-check-human-arrow { - font-size: 20px; - font-weight: bold; - color: #777777; - padding-left: 15px; - margin-bottom: 2px; - } - `; - document.head.appendChild(style); - - // Create loader container - loaderContainer.style.cssText = ` - display: none; - font-size: 12px; - font-weight: bold; - color: #777777; - text-align: center; - position: fixed; - top: 20%; - right: -5px; - width: 110px; - height: 80px; - z-index: 9999; - background-color: #fff; - border-radius: 5px 0 0 5px; - border: 1px solid #bbbbbb; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); - transition: right 0.3s ease-in-out; - `; - - // add div with title - const title = document.createElement('div'); - title.className = 'ct-browser-check-title'; - title.style.cssText = ` - border-bottom: 1px solid #bbbbbb; - `; - title.textContent = 'botDetector'; - loaderContainer.appendChild(title); - - // Create loader element - const loader = document.createElement('div'); - loader.className = 'ct-browser-check-loader'; - - // Add loader to container and container to body - loaderContainer.appendChild(loader); - document.body.appendChild(loaderContainer); - - // add div with description - const description = document.createElement('div'); - description.className = 'ct-browser-check-description'; - description.style.cssText = ` - border-top: 1px solid #bbbbbb; - `; - description.textContent = 'Browser check'; - loaderContainer.appendChild(description); -}); +// document.addEventListener('ctBotDetectorResult', function() { +// if (localStorage.getItem('ct-browser-check-result')) { +// return; +// } -/** - * Hide browser check - */ -function ctBrowserCheckHide() { // eslint-disable-line no-unused-vars - document.querySelector('.ct-browser-check-title').textContent = 'TRP'; - loaderContainer.style.right = '-70px'; - loaderContainer.style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; - document.querySelector('.ct-browser-check-title').style.width = '40px'; - document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; -} +// if (startTime && new Date() - startTime < timeoutToShowResult) { +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult - (new Date() - startTime)); +// return; +// } + +// setTimeout(() => { +// showResult(); +// }, timeoutToShowResult); +// }); + +// function showSavedResult() { +// const result = localStorage.getItem('ct-browser-check-result'); +// if (result === 'human') { +// document.querySelector('.ct-browser-check-title').textContent = 'The Real Person'; +// } +// } + +// /** +// * Show result +// */ +// function showResult() { +// // let results = ['bot', 'human']; +// let results = ['human']; +// let result = results[Math.floor(Math.random() * results.length)]; +// // store result in local storage +// localStorage.setItem('ct-browser-check-result', result); + +// if (document.querySelector('.ct-browser-check-loader')) { +// document.querySelector('.ct-browser-check-loader').remove(); +// } +// if (document.querySelector('.ct-browser-check-description')) { +// document.querySelector('.ct-browser-check-description').remove(); +// } +// document.querySelector('.ct-browser-check-container').style.height = '50px'; + +// // prepare data +// let title = 'botDetector'; +// let svg = ''; +// let arrowAction = ''; +// switch (result) { +// case 'bot': +// console.log('bot'); +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// break; +// case 'human': +// console.log('human'); +// title = 'The Real Person'; +// // eslint-disable-next-line no-template-curly-in-string, max-len +// svg = ''; +// arrowAction = ' style="cursor: pointer;" onclick="ctBrowserCheckHide();" '; +// break; +// } +// document.querySelector('.ct-browser-check-title').textContent = title; +// const dev = document.createElement('div'); +// dev.className = 'ct-browser-check-human'; +// dev.innerHTML = ` +// ${svg} +// > +// `; +// loaderContainer.appendChild(dev); +// } + + +// document.addEventListener('ctBotDetectorError', function() { +// console.log('ctBotDetectorError'); +// }); + + +// // add div with title +// const title = document.createElement('div'); +// title.className = 'ct-browser-check-title'; +// title.style.cssText = ` +// border-bottom: 1px solid #bbbbbb; +// `; +// title.textContent = 'botDetector'; +// loaderContainer.appendChild(title); + +// // Create loader element +// const loader = document.createElement('div'); +// loader.className = 'ct-browser-check-loader'; + +// // Add loader to container and container to body +// loaderContainer.appendChild(loader); +// document.body.appendChild(loaderContainer); + +// // add div with description +// const description = document.createElement('div'); +// description.className = 'ct-browser-check-description'; +// description.style.cssText = ` +// border-top: 1px solid #bbbbbb; +// `; +// description.textContent = 'Browser check'; +// loaderContainer.appendChild(description); +// }); + +// /** +// * Hide browser check +// * eslint-disable-next-line no-unused-vars +// */ +// function ctBrowserCheckHide() { +// document.querySelector('.ct-browser-check-title').textContent = 'TRP'; +// loaderContainer.style.right = '-70px'; +// loaderContainer.style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.alignItems = 'left'; +// document.querySelector('.ct-browser-check-title').style.width = '40px'; +// document.querySelector('.ct-browser-check-human').style.marginLeft = '-30px'; +// } /** * Check form as internal.