(function(){
'use strict';
jQuery(document).ready(function(){
if(typeof cev_ajax==='undefined'){
console.error('cev_ajax is not defined! Script may not be properly enqueued.');
return;
}
if(!cev_ajax.enableEmailVerification){
return;
}
var otpVerified=false;
var $registerForm=jQuery('.woocommerce-form-register');
function displayError(message){
var $form=jQuery(cev_ajax.cev_Validation_error_position_id||'.woocommerce-form-register');
$form.prepend('<div class="woocommerce-error" role="alert">' + message + '</div>');
}
function clearErrors(){
jQuery('.woocommerce-error').remove();
}
function ensureEmailVerificationField($form, value){
var $field=$form.find('input[name="email_verification"]');
if($field.length===0){
$form.append('<input type="hidden" name="email_verification" value="' + value + '">');
}else{
$field.val(value);
}}
function submitRegistrationForm($form){
otpVerified=true;
ensureEmailVerificationField($form, 'true');
var $registerButton=$form.find('button[name="register"]');
if(!$registerButton.length){
console.error('Register button not found in form');
return;
}
$registerButton.removeClass('email_verification_popup');
jQuery('#otp-popup').hide();
jQuery('.cev_loading_overlay').css('display', 'none');
jQuery(document).off('click.email_verification');
$form.off('submit.email_verification');
setTimeout(function(){
if(!$registerButton.length){
console.error('Register button not found');
return;
}
var emailVerificationValue=$form.find('input[name="email_verification"]').val();
if(emailVerificationValue!=='true'){
console.warn('Email verification field not set correctly, setting it now...');
ensureEmailVerificationField($form, 'true');
}
$registerButton.trigger('click');
}, 500);
}
if($registerForm.length){
ensureEmailVerificationField($registerForm, 'false');
$registerForm.find('button[name="register"]').addClass('email_verification_popup');
}
jQuery(document).on('click.email_verification', '.email_verification_popup', function(e){
if(otpVerified){
return;
}
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
clearErrors();
var $button=jQuery(this);
var $form=$button.closest('form');
var email=$form.find('#reg_email').val();
var password=$form.find('#reg_password').val();
jQuery('.cev_loading_overlay').css('display', 'block');
if(!email){
displayError(cev_ajax.cev_email_validation||'Email is required.');
jQuery('.cev_loading_overlay').css('display', 'none');
return;
}
if(cev_ajax.password_setup_link_enabled==='no'){
if(!password){
displayError(cev_ajax.cev_password_validation||'Password is required.');
jQuery('.cev_loading_overlay').css('display', 'none');
return;
}}
var captchaValid=true;
var captchaError='';
if($form.find('.g-recaptcha-response').length){
var recaptchaResponse=$form.find('.g-recaptcha-response').val();
if(!recaptchaResponse){
captchaValid=false;
captchaError='Please complete the CAPTCHA';
}}
if($form.find('[name="cf7-captcha"]').length){
if(!$form.find('[name="cf7-captcha"]').val()){
captchaValid=false;
captchaError='Please complete the CAPTCHA';
}}
if($form.find('[name="cptch_number"]').length){
if(!$form.find('[name="cptch_number"]').val()){
captchaValid=false;
captchaError='Please complete the CAPTCHA';
}}
if($form.find('[name="h-captcha-response"]').length){
var hcaptchaResponse=$form.find('[name="h-captcha-response"]').val();
if(!hcaptchaResponse){
captchaValid=false;
captchaError='Please complete the CAPTCHA';
}}
if(!captchaValid){
displayError(captchaError);
jQuery('.cev_loading_overlay').css('display', 'none');
return;
}
jQuery.ajax({
url: cev_ajax.ajax_url,
type: 'POST',
data: $registerForm.serialize() + '&action=check_email_exists&nonce=' + cev_ajax.nonce,
dataType: 'json',
success: function(response){
jQuery('.cev_loading_overlay').css('display', 'none');
if(response&&response.success===true){
if(response.data&&response.data.exists){
displayError(response.message||cev_ajax.cev_email_exists_validation||'An account with this email already exists.');
}else if(response.data&&response.data.not_valid){
displayError(response.message||cev_ajax.cev_valid_email_validation||'Please enter a valid email address.');
}else if(response.data&&response.data.already_verify){
submitRegistrationForm($form);
}else if(response.code==='email_sent' ||
(response.data&&response.data.success) ||
(response.data&&response.data.emailAddress)){
var emailAddress='';
if(response.data&&response.data.emailAddress){
emailAddress=response.data.emailAddress;
}else if(email&&typeof email==='string'&&email.length > 0){
emailAddress=email;
}
var $messageElement=jQuery('.cev-authorization__description');
if($messageElement.length){
var messageText=$messageElement.html();
if(emailAddress&&emailAddress.length > 0){
messageText=messageText.replace(/\{\{customer_email\}\}/g, '<strong>' + emailAddress + '</strong>');
messageText=messageText.replace(/\{customer_email\}/g, '<strong>' + emailAddress + '</strong>');
}else{
messageText=messageText.replace(/\{\{customer_email\}\}/g, '');
messageText=messageText.replace(/\{customer_email\}/g, '');
}
$messageElement.html(messageText);
}
jQuery('#otp-popup').show();
startResendTimer();
}else if(response.data&&response.data.validation===false){
displayError(response.message||'Validation failed.');
}else{
if(response.success&&response.data){
jQuery('#otp-popup').show();
startResendTimer();
}}
}else{
var errorMessage='An error occurred. Please try again.';
if(response&&response.error){
errorMessage=response.error.message||errorMessage;
}else if(response&&response.data&&response.data.message){
errorMessage=response.data.message;
}
displayError(errorMessage);
}},
error: function(xhr, status, error){
jQuery('.cev_loading_overlay').css('display', 'none');
var errorMessage='An error occurred. Please try again.';
try {
if(xhr.responseText){
var errorResponse=JSON.parse(xhr.responseText);
if(errorResponse&&errorResponse.error){
errorMessage=errorResponse.error.message||errorMessage;
}else if(errorResponse&&errorResponse.data&&errorResponse.data.message){
errorMessage=errorResponse.data.message;
}}
} catch (e){
console.error('Failed to parse error response:', e);
}
displayError(errorMessage);
console.error('AJAX error:', error);
}});
});
var $otpInputs=jQuery('.otp-input');
$otpInputs.on('input', function(){
var $input=jQuery(this);
var value=$input.val();
var index=$otpInputs.index(this);
if(value.length===1){
if(index < $otpInputs.length - 1){
$otpInputs.eq(index + 1).focus();
}else{
jQuery('#verify-otp-button').trigger('click');
}}
});
$otpInputs.on('paste', function(e){
e.preventDefault();
var pasteData=(e.originalEvent||e).clipboardData.getData('text');
var chars=pasteData.replace(/\D/g, '').split('');
$otpInputs.each(function(i){
jQuery(this).val(chars[i]||'');
});
if(chars.length >=$otpInputs.length){
jQuery('#verify-otp-button').trigger('click');
}else{
$otpInputs.eq(chars.length).focus();
}});
$otpInputs.on('keydown', function(e){
var $input=jQuery(this);
var index=$otpInputs.index(this);
if(e.keyCode===8&&$input.val().length===0){
if(index > 0){
$otpInputs.eq(index - 1).focus();
}}
});
$otpInputs.on('keypress', function(e){
var charCode=(e.which) ? e.which:e.keyCode;
if(charCode < 48||charCode > 57){
e.preventDefault();
}});
jQuery('#verify-otp-button').on('click', function(e){
e.preventDefault();
function getOtpValue(){
var otp='';
jQuery('.otp-input').each(function(){
otp +=jQuery(this).val();
});
return otp;
}
var $form=$registerForm.length ? $registerForm:jQuery('.email_verification_popup').closest('form');
var email=$form.find('#reg_email').val();
var otp=getOtpValue();
if(typeof cev_ajax==='undefined'){
console.error('cev_ajax is not defined! Check if script is properly enqueued.');
jQuery('.error_mesg').text('Configuration error. Please refresh the page and try again.').css('display', 'block');
return;
}
if(!email||!otp){
console.error('Missing email or OTP');
jQuery('.error_mesg').text('Please enter the OTP code.').css('display', 'block');
return;
}
clearErrors();
jQuery('.error_mesg').text('').css('display', 'none');
jQuery('.cev_loading_overlay').css('display', 'block');
jQuery.ajax({
url: cev_ajax.ajax_url,
type: 'POST',
data: {
action: 'verify_otp',
otp: otp,
email: email,
nonce: cev_ajax.nonce
},
dataType: 'json',
success: function(response){
jQuery('.cev_loading_overlay').css('display', 'none');
var isVerified=false;
if(response&&response.success===true){
if(response.code==='verified' ||
(response.data&&response.data.verified===true) ||
(response.data&&response.data.verified==='true')){
isVerified=true;
}}
if(isVerified){
jQuery('.error_mesg').css('display', 'none');
var successMessage=response.message
|| (typeof cev_ajax!=='undefined'&&cev_ajax.success_message)
|| 'Your email is verified successfully.';
var $successMsg=jQuery('<p class="success-message" role="status" aria-live="polite">' + successMessage + '</p>')
.insertBefore($form)
.css({
'color': 'green',
'margin-top': '10px',
'text-align': 'center'
});
setTimeout(function(){
$successMsg.remove();
submitRegistrationForm($form);
}, 500);
}else{
var errorMessage='OTP verification failed. Please try again.';
if(response&&response.error){
errorMessage=response.error.message||errorMessage;
}else if(response&&response.data&&response.data.message){
errorMessage=response.data.message;
}else if(response&&response.message){
errorMessage=response.message;
}
jQuery('.error_mesg').text(errorMessage).css('display', 'block');
}},
error: function(xhr, status, error){
console.error('OTP verification error:', error);
jQuery('.cev_loading_overlay').css('display', 'none');
var errorMessage='An error occurred while verifying OTP. Please try again.';
try {
if(xhr.responseText){
var errorResponse=JSON.parse(xhr.responseText);
if(errorResponse&&errorResponse.error){
errorMessage=errorResponse.error.message||errorMessage;
}else if(errorResponse&&errorResponse.data&&errorResponse.data.message){
errorMessage=errorResponse.data.message;
}}
} catch (e){
console.error('Failed to parse error response:', e);
}
jQuery('.error_mesg').text(errorMessage).css('display', 'block');
}});
});
var resendRequestInProgress=false;
jQuery(document).on('click', '.cev-authorization__footer.cev-rge-content, .cev-authorization__footer.cev-rge-content a, .send_again_link', function(e){
e.preventDefault();
if(!$registerForm.length){
return;
}
e.stopPropagation();
e.stopImmediatePropagation();
if(resendRequestInProgress){
return false;
}
var $form=$registerForm.length ? $registerForm:jQuery('.woocommerce-form-register__submit').closest('form');
var email=$form.find('#reg_email').val();
if(!email){
jQuery('.error_mesg').text('Email is required.').css('display', 'block');
return false;
}
resendRequestInProgress=true;
var $resendButton=jQuery('.cev-authorization__footer');
$resendButton.addClass('disabled').css('pointer-events', 'none').prop('disabled', true);
jQuery('.error_mesg').text('').css('display', 'none');
jQuery('.resend_sucsess').hide();
jQuery('.cev_loading_overlay').css('display', 'block');
jQuery.ajax({
url: cev_ajax.ajax_url,
type: 'POST',
data: {
action: 'resend_otp',
email: email,
nonce: cev_ajax.nonce
},
dataType: 'json',
success: function(response){
resendRequestInProgress=false;
$resendButton.removeClass('disabled').css('pointer-events', 'auto').prop('disabled', false);
jQuery('.cev_loading_overlay').css('display', 'none');
jQuery('.error_mesg').text('').css('display', 'none');
jQuery('.resend_sucsess').hide();
if(response&&response.success===true){
var successMessage=response.message
|| (cev_ajax.resend_success_message)
|| 'Verification email sent successfully';
jQuery('.resend_sucsess').text(successMessage).show();
setTimeout(function(){
jQuery('.resend_sucsess').hide();
}, 5000);
startResendTimer();
}else{
var errorMessage='Failed to resend OTP. Please try again.';
if(response&&response.error&&response.error.code==='limit_reached'){
errorMessage=response.error.message
|| (cev_ajax.resend_limit_message)
|| 'Too many attempts, please contact us for further assistance';
}else if(response&&response.error){
errorMessage=response.error.message||errorMessage;
}else if(response&&response.data&&response.data.limit_reached){
errorMessage=response.data.message
|| (cev_ajax.resend_limit_message)
|| 'Too many attempts, please contact us for further assistance';
}else if(response&&response.data&&response.data.message){
errorMessage=response.data.message;
}else if(response&&response.message){
errorMessage=response.message;
}
jQuery('.error_mesg').text(errorMessage).css('display', 'block');
}},
error: function(xhr, status, error){
resendRequestInProgress=false;
$resendButton.removeClass('disabled').css('pointer-events', 'auto').prop('disabled', false);
jQuery('.cev_loading_overlay').css('display', 'none');
var errorMessage='An error occurred. Please try again.';
var isLimitReached=false;
try {
if(xhr.responseText){
var errorResponse=JSON.parse(xhr.responseText);
if(errorResponse&&errorResponse.error){
if(errorResponse.error.code==='limit_reached'){
isLimitReached=true;
errorMessage=errorResponse.error.message
|| (cev_ajax.resend_limit_message)
|| 'Too many attempts, please contact us for further assistance';
}else{
errorMessage=errorResponse.error.message||errorMessage;
}}else if(errorResponse&&errorResponse.data){
if(errorResponse.data.limit_reached){
isLimitReached=true;
errorMessage=errorResponse.data.message
|| (cev_ajax.resend_limit_message)
|| 'Too many attempts, please contact us for further assistance';
}else if(errorResponse.data.message){
errorMessage=errorResponse.data.message;
}}
}} catch (e){
console.error('Failed to parse error response:', e);
}
jQuery('.error_mesg').text(errorMessage).css('display', 'block');
if(!isLimitReached){
console.error('AJAX error:', error);
}},
complete: function(){
resendRequestInProgress=false;
$resendButton.removeClass('disabled').css('pointer-events', 'auto').prop('disabled', false);
}});
});
jQuery(document).on('click', '.back_btn', function(e){
e.preventDefault();
var $popup=jQuery(this).closest('#otp-popup');
if($popup.length){
$popup.hide();
$popup.find('input[type="text"], input[type="email"], input[type="tel"], input[type="password"], textarea')
.val('');
$popup.find('.error_mesg, .success-message, .resend_sucsess')
.text('')
.hide();
$popup.find('.cev_resend_timer').text('').hide();
}
clearErrors();
});
});
function startResendTimer(){
if(typeof cev_ajax==='undefined'||!cev_ajax){
console.warn('cev_ajax object not defined for timer, retrying in 500ms');
setTimeout(startResendTimer, 500);
return;
}
var resendDelay=parseInt(cev_ajax.resend_delay, 10)||30;
var $resendButton=jQuery('.cev-authorization__footer');
var $timerDisplay=jQuery('.cev_resend_timer');
var countdownText=cev_ajax.count_down_text||'You can resend the code in';
var timeLeft=resendDelay;
$resendButton.addClass('disabled').css('pointer-events', 'none').hide();
$timerDisplay.show().text(countdownText + ' ' + timeLeft + 's');
var timer=setInterval(function(){
timeLeft--;
$timerDisplay.text(countdownText + ' ' + timeLeft + 's');
if(timeLeft <=0){
clearInterval(timer);
$resendButton.removeClass('disabled').css('pointer-events', 'auto').show();
$timerDisplay.hide();
}}, 1000);
}})(jQuery);