{"version":3,"sources":["recaptcha.js"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","_createForOfIteratorHelper","allowArrayLike","it","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","err","normalCompletion","didErr","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","toString","slice","name","from","test","arr","len","arr2","currentBtn","currentCaptchaBtn","currFormInputs","scheduleInput","isRecaptchaLoaded","currentText","lang","submit_text","forms","ccRecaptcha","document","querySelector","enableForm","allowSubmit","forEach","formInput","removeEventListener","disabled","watchRecaptchaFrame","MutationObserver","mutationsList","observer","_iterator","_step","mutation","grecaptcha","getResponse","attributeName","target","opacity","innerHTML","disconnect","recaptchaSubmit","token","reset","fetch","ajaxurl","method","credentials","headers","body","then","res","json","success","closest","querySelectorAll","addEventListener","classList","contains","click","catch","error","window","recaptchaLoaded","siteKey","dataset","sitekey","render","size","badge","callback","recaptchaFocus","existingTag","getElementById","head","getElementsByTagName","script","createElement","recaptchaUrl","undefined","wpml_lang","id","type","src","appendChild","form","setTimeout","requestFormPage","rfcBtns","rfcBtn","push","recaptchaBtn","hasAttribute","add","parentNode","insertBefore","preventDefault","stopPropagation","currentTarget","form_loading","execute","recaptchaChallenge","recaptchaParent","observe","attributeFilter","attributes","recaptchaInit"],"mappings":"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","file":"../recaptcha.js","sourcesContent":["(function() {\n\n let currentBtn = false;\n let currentCaptchaBtn = false;\n let currFormInputs = false;\n let scheduleInput = false;\n let isRecaptchaLoaded = false;\n let currentText = '' + lang.submit_text + '';\n\n const forms = [];\n const ccRecaptcha = document.querySelector('#cc-recaptcha');\n\n const enableForm = () => {\n\n let allowSubmit = true;\n\n if ( currFormInputs ) {\n\n // Clear out event listeners\n currFormInputs.forEach(formInput => {\n formInput.removeEventListener('change', enableForm);\n formInput.removeEventListener('keydown', enableForm);\n });\n }\n\n if ( scheduleInput && scheduleInput.querySelector('.selected') ) {\n\n // Clear out event listener for schedule section\n scheduleInput.removeEventListener('click', enableForm);\n }\n else if ( scheduleInput ) {\n allowSubmit = false;\n }\n\n if ( allowSubmit && currentCaptchaBtn.disabled ) {\n\n // Re-enable submit\n currentCaptchaBtn.disabled = false;\n }\n }\n\n // Re-enable submit button if user closes recaptcha challenge\n const frameClosed = (mutationsList, observer) => {\n\n for ( let mutation of mutationsList ) {\n\n // Listen for opacity change, only if not submitting challenge\n if ( ! grecaptcha.getResponse() &&\n mutation.attributeName === 'style' &&\n mutation.target[mutation.attributeName].opacity == 0 ) {\n\n currentCaptchaBtn.innerHTML = currentText;\n enableForm();\n\n // Stop watching\n observer.disconnect();\n break;\n }\n }\n }\n\n // Create new mutation observer for recaptcha challenge\n const watchRecaptchaFrame = new MutationObserver(frameClosed);\n\n const recaptchaSubmit = (token) => {\n\n // Reset so new submissions are validated\n grecaptcha.reset();\n\n // Stop watching recaptcha challenge\n watchRecaptchaFrame.disconnect();\n\n if ( ! token || ! currentBtn ) {\n return;\n }\n\n const fetchRequest = {\n method : 'POST',\n credentials: 'same-origin',\n headers : {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'\n },\n body : 'action=verify_recaptcha_secret&token=' + token,\n }\n\n fetch(ajaxurl, fetchRequest).then((res) => {\n\n res.json().then(json => {\n\n currentCaptchaBtn.innerHTML = currentText;\n\n if ( json.success ) {\n\n // Add event listeners for form input change\n currFormInputs = currentBtn.closest('form').querySelectorAll('input, select');\n\n currFormInputs.forEach( formInput => {\n formInput.addEventListener('change', enableForm);\n formInput.addEventListener('keydown', enableForm);\n });\n\n if ( document.querySelector('#lstDates') &&\n document.querySelector('#date').classList.contains('active') ) {\n\n // Setup unique event listener for scheduling items\n scheduleInput = document.querySelector('#lstDates');\n scheduleInput.addEventListener('click', enableForm);\n }\n\n // Enable normal button\n currentBtn.disabled = false;\n\n // Trigger form submit.\n // Use button click event to allow existing validation to function\n currentBtn.click();\n }\n });\n })\n .catch((error) => {\n console.log(error);\n });\n }\n\n window.recaptchaLoaded = () => {\n if ( ! ccRecaptcha ) {\n return;\n }\n\n const siteKey = ccRecaptcha.dataset.sitekey;\n\n if ( siteKey === '' ) {\n return;\n }\n\n // Render recaptcha on placeholder so badge is visible\n grecaptcha.render(ccRecaptcha, {\n 'sitekey': siteKey,\n 'size': 'invisible',\n 'badge': 'bottomleft',\n 'callback': recaptchaSubmit,\n });\n\n isRecaptchaLoaded = true;\n }\n\n const recaptchaFocus = () => {\n const existingTag = document.getElementById('ccRecaptchaRequest');\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n\n let recaptchaUrl = 'https://www.google.com/recaptcha/api.js?onload=recaptchaLoaded&render=explicit';\n if ( typeof wpml_lang !== undefined ) {\n recaptchaUrl += `&hl=${wpml_lang}`;\n }\n\n script.id = 'ccRecaptchaRequest';\n script.type = 'text/javascript';\n script.src = recaptchaUrl;\n\n if ( ! existingTag ) {\n head.appendChild(script);\n }\n\n // Remove event listener.\n forms.forEach(form => {\n form.removeEventListener('click', recaptchaFocus);\n });\n };\n\n // Assign function to window so Recaptcha onload call can find it\n const recaptchaInit = () => {\n\n const requestFormPage = document.querySelector('.request-form__page');\n\n // Disable Recaptcha for autosubmit\n if ( requestFormPage && requestFormPage.classList.contains('form--loading') ) {\n return;\n }\n\n // Get buttons for all forms that need Recaptcha protection\n const rfcBtns = document.querySelectorAll('.booking-form form button, .request-consult-form button, .free-consultation-form button, .request2step button, #frmStepTwo button, #frmBookingDate button, .cta-newsletter form.signup-form button');\n\n if ( ! rfcBtns ) {\n return;\n }\n\n rfcBtns.forEach(rfcBtn => {\n\n // Don't render for show more button\n if ( typeof rfcBtn.id != 'undefined' && rfcBtn.id === 'btnShowMore' ) {\n return;\n }\n\n // Don't render for modal close button\n if ( typeof rfcBtn.id != 'undefined' && rfcBtn.id === 'close-rfc-dropdown-btn' ) {\n return;\n }\n\n // Parent form\n const form = rfcBtn.closest('form');\n forms.push(form);\n\n // Create button to trigger recaptcha\n // without other click events firing\n const recaptchaBtn = document.createElement('button');\n recaptchaBtn.type = 'submit';\n\n if ( rfcBtn.hasAttribute('class') ) {\n recaptchaBtn.classList = rfcBtn.classList;\n }\n\n recaptchaBtn.classList.add('recaptcha-btn');\n recaptchaBtn.innerHTML = rfcBtn.innerHTML;\n\n // Hide real button and disable until recaptcha success\n rfcBtn.disabled = true;\n rfcBtn.classList.add('hidden');\n rfcBtn.parentNode.insertBefore(recaptchaBtn, rfcBtn);\n\n // Activate recaptcha\n form.addEventListener('click', recaptchaFocus);\n\n // Recaptcha click event\n recaptchaBtn.addEventListener('click', (e) => {\n\n e.preventDefault();\n e.stopPropagation();\n\n // Store button identities for use in callback\n currentCaptchaBtn = e.currentTarget;\n currentBtn = rfcBtn;\n currentText = rfcBtn.innerHTML;\n\n // Disable submit button to prevent repeated clicks\n currentCaptchaBtn.disabled = true;\n\n //wrap lang.form_loading in span tags for all forms except newsletter\n if (rfcBtn.closest('form.signup-form') === null) {\n currentCaptchaBtn.innerHTML = '' + lang.form_loading + '';\n } else {\n currentCaptchaBtn.innerHTML = lang.form_loading;\n }\n\n if ( ! isRecaptchaLoaded ) {\n currentCaptchaBtn.disabled = false;\n currentCaptchaBtn.innerHTML = '' + currentText + '';\n\n recaptchaFocus();\n\n return false;\n }\n\n // Trigger Recaptcha validation\n grecaptcha.execute();\n\n // Fix challenge positioning\n const recaptchaChallenge = document.querySelector('iframe[title*=\"recaptcha\"]');\n if ( recaptchaChallenge ) {\n const recaptchaParent = recaptchaChallenge.parentNode;\n recaptchaParent.classList.add('recaptcha-challenge');\n\n // Watch recaptcha challenge container for changes\n watchRecaptchaFrame.observe(recaptchaParent.parentNode, {\n attributeFilter: [ 'style' ],\n attributes: true,\n });\n } else {\n //recaptcha challenge not found\n // console.log('recaptcha challenge not found');\n }\n\n return false;\n });\n });\n }\n\n if ( ccRecaptcha ) {\n // Delay intialization to prevent other form\n // submit scripts from targeting custom buttons.\n setTimeout(() => {\n recaptchaInit();\n }, 500);\n }\n})();\n"]}