;(function(document, $){
'use strict';
function executeCaptcha(onSuccess, onError){
if(! globalThis.EDDreCAPTCHA.sitekey){
return;
}
if(typeof globalThis.EDDCaptchaHandler==='undefined'||typeof globalThis.EDDCaptchaHandler.execute!=='function'){
console.error('CAPTCHA handler not loaded');
if(onError){
onError('Handler not loaded');
}
return;
}
globalThis.EDDCaptchaHandler.execute(onSuccess, onError);
}
function initializeCheckout(){
let tokenRefresh;
function clearTokenRefresh(){
if(tokenRefresh){
clearInterval(tokenRefresh);
tokenRefresh=null;
}}
$(document.body).on('edd_gateway_loaded', function(e, gateway){
clearTokenRefresh();
if(globalThis.EDDCaptchaHandler&&globalThis.EDDCaptchaHandler.needsRefresh){
tokenRefresh=setInterval(function (){
executeCaptcha(null, function(error){
const form=document.getElementById('edd_purchase_form');
if(form){
form.innerHTML='<div class="edd_errors edd-alert edd-alert-error">' + globalThis.EDDreCAPTCHA.checkoutFailure + '</div>';
}});
}, 1000 * 110);
}
executeCaptcha();
});
$(document.body).on('submit', '#edd_purchase_form', clearTokenRefresh);
$(document.body).on('edd_checkout_unloaded', clearTokenRefresh);
}
function initializeFormValidation(){
const captchaInput=document.querySelector('input#edd-blocks-recaptcha');
if(! captchaInput){
return;
}
globalThis.EDDreCAPTCHA.action=document.querySelector('input[name="edd_action"]').value;
globalThis.EDDreCAPTCHA.submit=document.querySelector('input[name="edd_submit"]').value;
const submitButton=document.querySelector('#' + globalThis.EDDreCAPTCHA.submit);
let isProcessing=false;
function removeExistingErrors(){
const existingErrors=document.querySelectorAll('.edd_errors.invalid_captcha_bad, .edd_errors.invalid_captcha');
existingErrors.forEach(function(error){
error.remove();
});
}
captchaInput.addEventListener('invalid', function(e){
e.preventDefault();
if(isProcessing){
return;
}
isProcessing=true;
removeExistingErrors();
executeCaptcha(
function(token){
$.ajax({
type: 'POST',
data: {
action: 'edd_captcha_validate',
token: token,
},
url: globalThis.EDDreCAPTCHA.ajaxurl,
success: function(response){
isProcessing=false;
if(response.success){
captchaInput.value=token;
submitButton.click();
}else{
captchaInput.value='';
removeExistingErrors();
var errorNode=document.createElement('div');
errorNode.classList.add('edd_errors', 'edd-alert', 'edd-alert-error', 'invalid_captcha', response.data.error);
errorNode.innerHTML='<p class="edd_error"><strong>' + globalThis.EDDreCAPTCHA.error + '</strong>: ' + response.data.message + '</p>';
submitButton.closest('form').after(errorNode);
}},
}).fail(function(response){
isProcessing=false;
captchaInput.value='';
console.error('CAPTCHA AJAX error:', response);
});
},
function(error){
isProcessing=false;
captchaInput.value='';
removeExistingErrors();
var errorNode=document.createElement('div');
errorNode.classList.add('edd_errors', 'edd-alert', 'edd-alert-error', 'invalid_captcha_bad');
errorNode.innerHTML='<p class="edd_error"><strong>' + globalThis.EDDreCAPTCHA.error + '</strong>: ' + globalThis.EDDreCAPTCHA.error_message + '</p>';
submitButton.closest('form').after(errorNode);
}
);
});
}
if(globalThis.EDDreCAPTCHA.context==='checkout'){
initializeCheckout();
}else{
$(document).ready(function (){
initializeFormValidation();
});
}})(document, jQuery);