1jQuery(document).ready(($)=>{'use strict';if(typeof my_plugin==='undefined'){if(window.console){console.error('Required my_plugin configuration object is missing')} 2return} 3const{ajax_url:ajaxUrl,nonces}=my_plugin;const verificationModalHtml=` 4 <div class="verification-modal" style="display: none;"> 5 <div class="verification-content"> 6 <button class="modal-close" id="verification-close">×</button> 7 <h3>Please Verify Your Email</h3> 8 <p>We've sent a verification code to your email. Please enter it below.</p> 9 <div class="verification-form"> 10 <input type="text" 11 id="verification-code" 12 class="newsletter-field" 13 placeholder="Enter 6-digit code" 14 maxlength="6" 15 pattern="[0-9]*" 16 inputmode="numeric"> 17 <button type="button" 18 id="verify-code" 19 class="newsletter-button verification-button"> 20 Verify 21 </button> 22 </div> 23 <p class="verification-error" style="display: none; color: #dc3232;"></p> 24 <a href="#" id="resend-code" class="resend-link">Resend verification code</a> 25 </div> 26 </div> 27`;$('body').append(verificationModalHtml);const validateEmail=(email)=>{const emailRegex=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return email&&email.length<=254&&emailRegex.test(email)};const createToast=(message,type='success')=>{const sanitizedMessage=DOMPurify.sanitize(message);const toast=$(` 28 <div class="newsletter-toast ${type}"> 29 <div class="toast-content"> 30 ${type === 'success' ? '<i class="fas fa-check-circle"></i>' : '<i class="fas fa-exclamation-circle"></i>'} 31 <span></span> 32 </div> 33 </div> 34 `).appendTo('body');toast.find('span').text(sanitizedMessage);setTimeout(()=>toast.addClass('show'),100);setTimeout(()=>{toast.removeClass('show');setTimeout(()=>toast.remove(),500)},3000)};const setButtonLoading=($button,isLoading,originalText)=>{if(isLoading){if(!$button.data('original-text')){$button.data('original-text',$button.html())} 35const loadingHtml='<span class="button-spinner"></span> Processing...';$button.prop('disabled',!0).addClass('loading').html(loadingHtml)}else{const buttonText=originalText||$button.data('original-text')||'Subscribe';$button.prop('disabled',!1).removeClass('loading').html(buttonText)}};const showThankYou=()=>{const $modal=$('.mnp-thank-you-modal').removeClass('hide').addClass('show no-border');const $newsletterBox=$('.mnp-newsletter-box');if(!$newsletterBox.data('permanent-thank-you')){$newsletterBox.addClass('hide')} 36setupModalCloseHandlers()};const hideThankYou=()=>{$('.mnp-thank-you-modal').removeClass('show').addClass('hide')};const setupModalCloseHandlers=()=>{$('#mnp-modal-close').on('click',(e)=>{e.preventDefault();e.stopPropagation();hideThankYou()});$('.mnp-thank-you-div, .mnp-thank-you-modal').on('click',(event)=>{if(event.target.classList.contains('mnp-thank-you-div')||event.target.classList.contains('mnp-thank-you-modal')){hideThankYou()}})};class FormHandler{constructor(){this.setupFormListener();this.setupModalCloseHandlers();this.setupVerificationHandler()} 37setupFormListener(){const $forms=$('.newsletter-form');if(!$forms.length)return;$forms.each((_,form)=>{const $form=$(form);const $submitButton=$form.find('input[type="submit"]');const $errorMessage=$form.closest('.mnp-newsletter-inner-box').find('.error-occurred');const originalText=$submitButton.val();$form.on('submit',(e)=>{e.preventDefault();this.handleFormSubmit($form,$submitButton,$errorMessage,originalText)})})} 38setupVerificationHandler(){$('#verify-code').on('click',()=>{const code=$('#verification-code').val().trim();const email=$('#manage_email').val().trim();if(!code){$('.verification-error').text('Please enter the verification code').show();return} 39if(!/^\d{6}$/.test(code)){$('.verification-error').text('Please enter a valid 6-digit code').show();return} 40this.submitVerificationCode(email,code)});$('#verification-close').on('click',()=>{this.hideVerificationModal();createToast('Verification cancelled. Try again when ready.','error')});$('#verification-code').on('keypress',(e)=>{if(e.which===13){$('#verify-code').click()}});$('#resend-code').on('click',(e)=>{e.preventDefault();const email=$('#manage_email').val().trim();if(!validateEmail(email)){createToast('Please enter a valid email address.','error');return} 41this.handleSubscriptionCheck(email);createToast('New verification code sent')})} 42async handleFormSubmit($form,$submitButton,$errorMessage,originalText){const $emailInput=$form.find('.email');const email=$emailInput.val().trim();const $newsletterBox=$form.closest('.mnp-newsletter-box');const isPermanentThankYou=$newsletterBox.data('permanent-thank-you');$errorMessage.hide();$emailInput.removeClass('error');if(!validateEmail(email)){$emailInput.addClass('error');createToast('Please enter a valid email address.','error');return} 43setButtonLoading($submitButton,!0);try{const response=await $.ajax({type:'POST',url:ajaxUrl,data:{action:'mnp_subscribe_user',email:email,newsletter_subscribe_nonce:nonces.subscribe}});if(response.success){createToast('Successfully subscribed!');if(isPermanentThankYou){const thankYouMessage=` 44 <div class="mnp-thank-you-content has-text-align-center no-border"> 45 <img src="${my_plugin.site_logo}" 46 class="align-center logo-thank-you" 47 alt="${my_plugin.site_name} logo" 48 loading="lazy"> 49 <h3>${my_plugin.thank_you_message}</h3> 50 </div>`;$newsletterBox.html(thankYouMessage).addClass('success')} 51$form[0].reset()}else{if(my_plugin.mnp_troubleshooting){console.error('Subscription failed:',response)} 52$errorMessage.show();createToast(response.data?.message||'Subscription failed.','error')}}catch(error){if(my_plugin.mnp_troubleshooting){console.error('Newsletter signup failed:',error)} 53$errorMessage.show();createToast('Failed to process subscription.','error')}finally{setButtonLoading($submitButton,!1,originalText)}} 54showVerificationModal(){$('.verification-modal').fadeIn();$('#verification-code').val('').focus();$('.verification-error').hide()} 55hideVerificationModal(){$('.verification-modal').fadeOut();$('#verification-code').val('');$('.verification-error').hide()} 56async submitVerificationCode(email,code){const $verifyButton=$('#verify-code');const originalText=$verifyButton.text();setButtonLoading($verifyButton,!0,'Verifying...');try{const response=await $.ajax({type:'POST',url:ajaxUrl,data:{action:'verify_newsletter_code',email:email,code:code,newsletter_verify_nonce:nonces.verifyEmail}});if(response.success){this.hideVerificationModal();if(response.data.subscriptions){this.updateSubscriptionToggles(response.data.subscriptions)} 57createToast('Email verified successfully')}else{$('.verification-error').text(response.data?.message||'Verification failed').show();if(response.data?.refreshVerification){$('#verification-code').val('');createToast('New verification code sent','error')}}}catch(error){if(my_plugin.mnp_troubleshooting){console.error('Verification failed:',error)} 58$('.verification-error').text('An error occurred during verification').show()}finally{setButtonLoading($verifyButton,!1,originalText)}} 59updateSubscriptionToggles(subscriptions){const $toggles=$('.newsletter-switch');$toggles.removeClass('active');if(Array.isArray(subscriptions)){$toggles.each(function(){const listId=parseInt($(this).data('list-id'),10);if(subscriptions.includes(listId)){$(this).addClass('active')}})}} 60handleSubscriptionCheck(email){const $checkBtn=$('#main-site-signup-check');const originalText=$checkBtn.text();setButtonLoading($checkBtn,!0);return $.ajax({type:'POST',url:ajaxUrl,data:{action:'check_subscriptions',email:email,newsletter_check_subscription_nonce:nonces.checkSubscription}}).done((response)=>{if(response.success){if(response.data.requires_verification){this.showVerificationModal();createToast('Verification code sent to your email')}else if(Array.isArray(response.data)&&response.data.length===0){createToast('Found 0 content site subscriptions','error')}else{this.updateSubscriptionToggles(response.data)}}
60else{createToast(response.data?.message||'Failed to check subscriptions','error')}}).fail((jqXHR,textStatus)=>{if(my_plugin.mnp_troubleshooting){console.error('Subscription check failed:',textStatus)} 61const message=jqXHR.status===429?'Too many verification attempts. Please wait a few minutes before trying again.':'Failed to fetch subscriptions';createToast(message,'error')}).always(()=>{setButtonLoading($checkBtn,!1,originalText)})} 62handleSubscriptionSave(email,toggledStates){const $saveBtn=$('#save-subscriptions');const originalText=$saveBtn.text();setButtonLoading($saveBtn,!0);$('.subscription-feedback').remove();return $.ajax({type:'POST',url:ajaxUrl,data:{action:'process_subscription_changes',email:email,toggledStates:toggledStates,newsletter_update_subscription_nonce:nonces.updateSubscription}}).done((response)=>{if(response.success){createToast('Successfully updated subscriptions!')}else if(response.data?.requires_verification){this.showVerificationModal();createToast('Please verify your email to make changes')}else{createToast(response.data?.message||'Failed to update subscriptions','error')}}).fail((jqXHR,textStatus)=>{if(my_plugin.mnp_troubleshooting){console.error('Subscription update failed:',textStatus)} 63const message=jqXHR.status===429?'Too many attempts. Please try again later.':'Failed to update subscriptions';createToast(message,'error')}).always(()=>{setButtonLoading($saveBtn,!1,originalText)})} 64setupModalCloseHandlers(){$('.verification-modal').on('click',(event)=>{if(event.target.classList.contains('verification-modal')){this.hideVerificationModal()}});$(document).on('keyup',(event)=>{if(event.key==='Escape'){this.hideVerificationModal()}})}} 65const initNewsletterManager=()=>{const $managerWrapper=$('.newsletter-management-page-wrapper');if(!$managerWrapper.length)return;const formHandler=new FormHandler();const $emailInput=$('#manage_email');const $toggles=$('.newsletter-switch');$toggles.on('click',function(){$(this).toggleClass('active').addClass('pulse').delay(200).queue(function(){$(this).removeClass('pulse').dequeue()})});$('#main-site-signup-check').on('click',(e)=>{e.preventDefault();const email=$emailInput.val().trim();if(!validateEmail(email)){createToast('Please enter a valid email address.','error');return} 66const nonce=my_plugin.nonces.checkSubscription;formHandler.handleSubscriptionCheck(email)});$('#save-subscriptions').on('click',(e)=>{e.preventDefault();const email=$emailInput.val().trim();if(!validateEmail(email)){createToast('Please enter a valid email address.','error');return} 67const toggledStates={};$toggles.each(function(){const listId=$(this).data('list-id');toggledStates[listId]=$(this).hasClass('active')?'on':'off'});formHandler.handleSubscriptionSave(email,toggledStates)})};initNewsletterManager()})
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.