1(function($) { 2 $(document).ready(function() { 3 $('body').on('click', '.mepr-signup-form .have-coupon-link', function(e) { 4 e.preventDefault(); 5 $(this).hide(); 6 $('div.mepr_coupon_'+$(this).data("prdid")).show(); 7 }); 8 9 $('body').on('keydown', '.mepr-signup-form .mepr-coupon-code', function(e) { 10 if(e.which === 13) { 11 e.preventDefault(); 12 $(this).trigger('blur'); 13 } 14 }); 15 16 // Store the default price string 17 $('.mepr_price_cell').each(function () { 18 $(this).data('default-price-string', $(this).text()); 19 }); 20 21 let updateCheckoutStateTimeout, 22 lastRequestData, 23 updatingCheckoutState = false, 24 updateCheckoutStateAgain = false, 25 updateCheckoutState = function ($form) { 26 clearTimeout(updateCheckoutStateTimeout); 27 28 updateCheckoutStateTimeout = setTimeout(function () { 29 debouncedUpdateCheckoutState($form); 30 }, 50); 31 }, 32 getRequestData = function ($form) { 33 let payment_methods = []; 34 35 $form.find('input[name="mepr_payment_method"]').each(function () { 36 payment_methods.push($(this).val()); 37 }); 38 39 const data = { 40 action: 'mepr_get_checkout_state', 41 mepr_product_id: $form.find('input[name="mepr_product_id"]').val(), 42 'mepr-address-one': $form.find('input[name="mepr-address-one"]').val(), 43 'mepr-address-two': $form.find('input[name="mepr-address-two"]').val(), 44 'mepr-address-city': $form.find('input[name="mepr-address-city"]').val(), 45 'mepr-address-state': $form.find('select[name="mepr-address-state"]').is(':visible') ? $form.find('select[name="mepr-address-state"]').val() : $form.find('input[name="mepr-address-state"]').val(), 46 'mepr-address-country': $form.find('select[name="mepr-address-country"]').val(), 47 'mepr-address-zip': $form.find('input[name="mepr-address-zip"]').val(), 48 mepr_vat_number: $form.find('input[name="mepr_vat_number"]').val(), 49 mepr_vat_customer_type: $form.find('input[name="mepr_vat_customer_type"]:checked').val(), 50 mepr_coupon_code: $form.find('input[name="mepr_coupon_code"]').val(), 51 mepr_coupon_nonce: MeprSignup.coupon_nonce, 52 mpca_corporate_account_id: $form.find('input[name="mpca_corporate_account_id"]').val(), 53 mpgft_gift_checkbox: $form.find('input[name="mpgft-signup-gift-checkbox"]').is(':checked'), 54 mepr_payment_methods: payment_methods 55 }; 56 57 if (!data.mpgft_gift_checkbox) { 58 let order_bumps = []; 59 60 $form.find('input[name="mepr_order_bumps[]"]:checked').each(function () { 61 order_bumps.push($(this).val()); 62 }); 63 64 data.mepr_order_bumps = order_bumps; 65 } 66 67 $form.trigger('meprCheckoutStateRequestData', [data]); 68 69 return data; 70 }; 71 72 const debouncedUpdateCheckoutState = function ($form) { 73 if (updatingCheckoutState) { 74 updateCheckoutStateAgain = true; 75 return; 76 } 77 78 const data = getRequestData($form); 79 80 if (JSON.stringify(data) === JSON.stringify(lastRequestData)) { 81 return; 82 } 83 84 updatingCheckoutState = true; 85 lastRequestData = data; 86 87 if (MeprSignup.spc_enabled === '1' && MeprSignup.spc_invoice === '1') { 88 $form.find('.mepr-invoice-loader').fadeIn(); 89 } 90 91 const onComplete = function () { 92 if (MeprSignup.spc_enabled === '1' && MeprSignup.spc_invoice === '1') { 93 $form.find('.mepr-invoice-loader').hide(); 94 } 95 96 updatingCheckoutState = false; 97 }; 98 99 $.ajax({ 100 type: 'POST', 101 url: MeprI18n.ajaxurl, 102 dataType: 'json', 103 data: getRequestData($form) 104 }) 105 .done(function (response) { 106 if (response && typeof response.success === 'boolean' && response.success) { 107 $form.trigger('meprPriceStringUpdated', [response.data]); 108 $form.find('div.mepr_price_cell').html(response.data.price_string); 109 110 if (response.data.payment_required) { 111 $form.find('.mepr-payment-methods-wrapper').show(); 112 $form.find('input[name="mepr_payment_methods_hidden"]').remove(); 113 } else { 114 $form.find('.mepr-payment-methods-wrapper').hide(); 115 $form.append('<input type="hidden" name="mepr_payment_methods_hidden" value="1">'); 116 117 // Clear validation errors on fields now hidden 118 $form.find('.mepr-payment-methods-wrapper .mepr-form-input').each(function () { 119 meprValidateInput(this); 120 }); 121 } 122 123 $form.trigger('meprAfterPriceStringUpdated', [response.data]); 124 125 if (MeprSignup.spc_enabled === '1' && MeprSignup.spc_invoice === '1') { 126 $form.find('.mepr-transaction-invoice-wrapper > div').replaceWith(response.data.invoice_html); 127 $form.find(".mepr-transaction-invoice-wrapper .mp_invoice").css({ opacity: 1 }); 128 } 129 130 $form.trigger('meprAfterCheckoutStateUpdated', [response.data]); 131 132 onComplete(); 133 134 if (updateCheckoutStateAgain) { 135 updateCheckoutStateAgain = false;
136 updateCheckoutState($form); 137 } 138 } else { 139 onComplete(); 140 } 141 }) 142 .fail(onComplete); 143 }; 144 145 $('.mepr-signup-form').on('meprUpdateCheckoutState', function () { 146 updateCheckoutState($(this)); 147 }); 148 149 $('.mepr-signup-form').each(function () { 150 var $form = $(this); 151 152 if($form.find('input[name="mpgft-signup-gift-checkbox"]').is(':checked')) { 153 updateCheckoutState($form); 154 } 155 }); 156 157 var meprValidateInput = function (obj, submitting) { 158 $(obj).removeClass('invalid'); 159 160 var form = $(obj).closest('.mepr-signup-form'); 161 162 if ($(obj).attr('required') !== undefined) { 163 var notBlank = mpValidateFieldNotBlank($(obj)); 164 mpToggleFieldValidation($(obj), notBlank); 165 } 166 167 // Validate actual email only if it's not empty otherwise let the required/un-required logic hold 168 if ($(obj).attr('type')==='email' && $(obj).val().length > 0) { 169 var validEmail = mpValidateEmail($(obj).val()); 170 mpToggleFieldValidation($(obj), validEmail); 171 } 172 173 // Validate the URL by using the browser validation functions 174 if ($(obj).attr('type')==='url' && $(obj).val().length > 0) { 175 var validURL = mpValidateUrl($(obj).val()); 176 mpToggleFieldValidation($(obj), validURL); 177 } 178 179 if ($(obj).hasClass('mepr-password-confirm')) { 180 var confirmMatch = $(obj).val() === form.find('.mepr-password').val(); 181 mpToggleFieldValidation($(obj), confirmMatch); 182 } 183 184 if($(obj).hasClass('mepr-coupon-code') && !submitting) { 185 var price_string = form.find('div.mepr_price_cell'); 186 187 if($(obj).val().match(/(\s|\S)/)) { 188 $(obj).prev('.mp-form-label').find('.mepr-coupon-loader').fadeIn(); 189 $(obj).data('validating', true); 190 191 var data = { 192 action: 'mepr_validate_coupon', 193 code: $(obj).val(), 194 prd_id: $(obj).data("prdid"), 195 user_email: form.find("input[name='user_email']").val(), 196 coupon_nonce: MeprSignup.coupon_nonce 197 }; 198 199 $.post(MeprI18n.ajaxurl, data, function(res) { 200 $(obj).prev('.mp-form-label').find('.mepr-coupon-loader').hide(); 201 res = res.trim(); 202 mpToggleFieldValidation($(obj), (res.toString() == 'true')); 203 204 if(res.toString() == 'true') { 205 if($(obj).data('submit-when-valid')) { 206 form.one('meprAfterPriceStringUpdated', function () { 207 form.find('.mepr-submit').trigger('click'); 208 }); 209 } 210 211 // Let's update price string and invoice 212 updateCheckoutState(form); 213 } 214 else { 215 form.find('.mepr-payment-methods-wrapper:hidden').show(); 216 form.find('input[name="mepr_payment_methods_hidden"]').remove(); 217 price_string.text(price_string.data('default-price-string')); 218 219 // Invalid Coupon - update SPC Invoice 220 updateCheckoutState(form); 221 } 222 }) 223 .always(function () { 224 $(obj).removeData('validating'); 225 $(obj).removeData('submit-when-valid'); 226 }); 227 } 228 else if($(obj).val().trim() === '') { 229 if (form.find('.mepr-payment-methods-wrapper').is(':hidden')) { 230 // Looks like we need to restore the payment methods 231 form.find('.mepr-payment-methods-wrapper').show(); 232 form.find('input[name="mepr_payment_methods_hidden"]').remove(); 233 } 234 235 price_string.text(price_string.data('default-price-string')); 236 // Enpty Coupon - update SPC Invoice 237 updateCheckoutState(form); 238 } 239 } 240 241 $(obj).trigger('mepr-validate-input'); 242 }; 243 244 $('body').on('focus', '.mepr-form .mepr-form-input', function (e) { 245 $(this).prev('.mp-form-label').find('.cc-error').hide(); 246 $(this).removeClass('invalid'); 247 }); 248 249 $('body').on('blur', '.mepr-form .mepr-form-input', function (e) { 250 //Don't validate date fields here, wait til the push the submit button 251 if(!$(this).hasClass('mepr-date-picker')) { 252 meprValidateInput(this); 253 } 254 }); 255 256 // Specific to validating with the datepicker ui text field 257 $('body').on('mepr-date-picker-closed', '.mepr-form .mepr-form-input.mepr-date-picker', function (e, date, inst) { 258 meprValidateInput(this); 259 }); 260 261 $('body').on('click', '.mepr-signup-form .mepr-submit', function (e) { 262 // We want to control if/when the form is submitted 263 e.preventDefault(); 264 265 var form = $(this).closest('.mepr-signup-form'); 266 var coupon = form.find('.mepr-coupon-code'); 267 268 if(coupon.data('validating')) { 269 coupon.data('submit-when-valid', true); 270 return; 271 } 272 273 $.each(form.find('.mepr-form-input:visible'), function(i,obj) { 274 meprValidateInput(obj, true); 275 }); 276
277 if (0 < form.find('.invalid:visible').length) { 278 form.find('.validation').addClass('failed'); 279 } 280 else { 281 var submittedTelInputs = document.querySelectorAll(".mepr-tel-input"); 282 for (var i = 0; i < submittedTelInputs.length; i++) { 283 var iti = window.intlTelInputGlobals.getInstance(submittedTelInputs[i]); 284 submittedTelInputs[i].value = iti.getNumber(); 285 } 286 form.find('.validation').addClass('passed'); 287 this.disabled = true; 288 form.find('.mepr-loading-gif').show(); 289 $(this).trigger('mepr-register-submit'); 290 form.submit(); 291 } 292 }); 293 294 $('body').on('click', '.mepr-signup-form div[class^=mepr-payment-method] input.mepr-form-radio', function () { 295 var form = $(this).closest('.mepr-signup-form'); 296 297 // Reset the transaction ID to prevent any issues after switching payment methods 298 form.find('input[name="mepr_transaction_id"]').val(''); 299 300 var pmid = '.mp-pm-desc-' + $(this).val(); 301 var pmid_exists = (form.find(pmid).length > 0); 302 303 form.find('.mepr-payment-method-desc-text').addClass('mepr-close'); 304 305 if(pmid_exists) { 306 form.find(pmid).removeClass('mepr-close'); 307 } 308 309 //If nothing has the mepr-close class, we still need to show this one's description 310 var mepr_close_exists = (form.find('.mepr-payment-method-desc-text.mepr-close').length > 0); 311 312 if(mepr_close_exists) { 313 form.find('.mepr-payment-method-desc-text.mepr-close').slideUp({ 314 duration: 200, 315 complete: function() { 316 // Clear validation errors on fields now hidden 317 form.find('.mepr-payment-methods-wrapper .mepr-form-input').each(function () { 318 $('.mepr-form-input.invalid').removeClass('.invalid'); 319 $('.cc-error').hide(); 320 $('.mepr-form-has-errors').hide(); 321 }); 322 323 if(pmid_exists) { 324 form.find(pmid).slideDown(200); 325 } 326 } 327 }); 328 } else { 329 // Clear validation errors on fields now hidden 330 form.find('.mepr-payment-methods-wrapper .mepr-form-input').each(function () { 331 $('.mepr-form-input.invalid').removeClass('.invalid'); 332 $('.cc-error').hide(); 333 $('.mepr-form-has-errors').hide(); 334 }); 335 336 if(pmid_exists) { 337 form.find(pmid).slideDown(200); 338 } 339 } 340 }); 341 342 // Update price string & invoice when certain inputs change value 343 $("body").on("change mepr-geolocated", 344 ".mepr-form .mepr-form-input, .mepr-form .mepr-form-radios-input, .mepr-form .mepr-select-field", 345 function () { 346 if($(this).attr('name') == 'mepr-address-zip' || 347 $(this).attr('name') == 'mepr-address-city' || 348 $(this).attr('name') == 'mepr-address-country' || 349 $(this).attr('name') == 'mepr-address-one' || 350 $(this).attr('name') == 'mepr-address-state' || 351 $(this).attr('name') == 'mepr_vat_customer_type' || 352 $(this).attr('name') == 'mepr_vat_number' || 353 $(this).attr('name') == 'mpgft-signup-gift-checkbox' 354 ) { 355 updateCheckoutState($(this).closest(".mepr-signup-form")); 356 } 357 } 358 ); 359 360 $(".mepr-replace-file").each(function(){ 361 $(this).closest('div').find('.mepr-file-uploader').hide(); 362 }); 363 $('body').on('click', '.mepr-replace-file', function (e) { 364 $(this).closest('div').find('.mepr-file-uploader').toggle(); 365 }); 366 367 // Set the visibility of payment methods based on order bumps 368 var handleOrderBumpToggle = function () { 369 var $input = $(this), 370 $order_bump = $input.closest('.mepr-order-bump'), 371 $order_bumps = $order_bump.closest('.mepr-order-bumps'), 372 $form = $order_bumps.closest('.mepr-signup-form'), 373 has_order_bump = false, 374 has_sub = false, 375 $to_hide = $(), 376 $to_show = $(), 377 $compatible_pm, 378 $incompatible_pm; 379 380 $order_bumps.find('input[name="mepr_order_bumps[]"]:checked').each(function () { 381 has_order_bump = true; 382 383 if($(this).closest('.mepr-order-bump').hasClass('mepr-sub')) { 384 has_sub = true; 385 } 386 }); 387 388 $form.find('div[class^=mepr-payment-method] input.mepr-form-radio, input[type="hidden"][name="mepr_payment_method"]').each(function () { 389 var $pm = $(this); 390 391 if(has_order_bump) { 392 if($pm.hasClass('mepr-can-order-bumps')) { 393 if(has_sub) { 394 if($pm.hasClass('mepr-can-multiple-subscriptions')) { 395 $to_show = $to_show.add($pm); 396 397 if(!$compatible_pm) { 398 $compatible_pm = $pm; 399 } 400 } else { 401 $to_hide = $to_hide.add($pm); 402 403 if($pm.prop('checked')) { 404 $incompatible_pm = $pm; 405 } 406 } 407 } else { 408 $to_show = $to_show.add($pm); 409 410 if(!$compatible_pm) { 411 $compatible_pm = $pm; 412 } 413 } 414 } else { 415 $to_hide = $to_hide.add($pm); 416 417 if($pm.prop('checked')) { 418 $incompatible_pm = $pm; 419 } 420 } 421 } else { 422 $to_show = $to_show.add($pm); 423 } 424 }); 425 426 if(!$to_show.length) { 427 alert(MeprSignup.no_compatible_pms); 428 return false;
429 } 430 431 if($incompatible_pm) { 432 if($compatible_pm) { 433 var compatible_pm_label = $compatible_pm.data('payment-method-type'), 434 prompt = MeprSignup.switch_pm_prompt.replace('%s', compatible_pm_label); 435 436 if($.magnificPopup) { 437 var $switch_button = $('<div class="mepr-btn">').text(MeprSignup.switch_pm.replace('%s', compatible_pm_label)).on('click', function () { 438 $compatible_pm.trigger('click'); 439 $input.trigger('click'); 440 $.magnificPopup.close(); 441 }); 442 443 var $cancel_button = $('<div class="mepr-btn mepr-btn-secondary">').text(MeprSignup.cancel).on('click', function () { 444 $.magnificPopup.close(); 445 }); 446 447 var $popup_content = $('<div class="mepr-switch-pm-popup">').append( 448 $('<img class="mepr-switch-pm-popup-icon">').attr('src', MeprSignup.warning_icon_url), 449 $('<p>').text(prompt), 450 $('<div class="mepr-switch-pm-popup-buttons">').append($switch_button, $cancel_button) 451 ); 452 453 $.magnificPopup.open({ 454 mainClass: 'mepr-switch-pm-mfp', 455 items: { 456 src: $popup_content, 457 type: 'inline' 458 } 459 }); 460 } else if(confirm(prompt)) { 461 $compatible_pm.trigger('click'); 462 $input.trigger('click'); 463 return; 464 } 465 } else { 466 alert(MeprSignup.no_compatible_pms); 467 } 468 469 return false; 470 } 471 472 $to_hide.closest('.mepr_payment_method, .mepr-payment-option-label').hide(); 473 $to_show.closest('.mepr_payment_method, .mepr-payment-option-label').show(); 474 475 $order_bump.toggleClass('mepr-order-bump-selected', this.checked); 476 }; 477 478 $('body').on('click', '.mepr-signup-form input[name="mepr_order_bumps[]"]', handleOrderBumpToggle); 479 480 // Hide subscription order bumps if no payment method supports multiple subscriptions 481 $('.mepr-signup-form').each(function () { 482 var $form = $(this), 483 $order_bumps = $form.find('.mepr-order-bumps'), 484 pm_supports_multiple_subs = false; 485 486 if(!$order_bumps.length) { 487 return; 488 } 489 490 $form.find('div[class^=mepr-payment-method] input.mepr-form-radio, input[type="hidden"][name="mepr_payment_method"]').each(function (index) { 491 var $pm = $(this); 492 493 if($pm.hasClass('mepr-can-multiple-subscriptions') && pm_supports_multiple_subs === false) { 494 pm_supports_multiple_subs = index; 495 } 496 }); 497 498 if(pm_supports_multiple_subs === false) { 499 $order_bumps.find('.mepr-order-bump.mepr-sub').hide(); 500 501 if(!$order_bumps.find('.mepr-order-bump:visible').length) { 502 $order_bumps.hide(); 503 } 504 } else if(pm_supports_multiple_subs > 0) { 505 var $new_first_pm = $form.find('div[class^=mepr-payment-method] input.mepr-form-radio').eq(pm_supports_multiple_subs); 506 507 $new_first_pm 508 .closest('.mepr_payment_method, .mepr-payment-option-label') 509 .insertBefore( 510 $form.find('div[class^=mepr-payment-method] input.mepr-form-radio') 511 .eq(0) 512 .closest('.mepr_payment_method, .mepr-payment-option-label') 513 ); 514 515 $new_first_pm.trigger('click'); 516 } 517 518 // If gift checkbox is checked, hide and disable order bumps 519 if($form.find('input[name="mpgft-signup-gift-checkbox"]').is(':checked')) { 520 $order_bumps.hide().find('input[name="mepr_order_bumps[]"]').prop('checked', false); 521 } 522 }); 523 524 $("body").on("change", 525 '.mepr-form input[name="mepr_order_bumps[]"]', 526 function (e) { 527 let form = $(this).closest(".mepr-signup-form"); 528 if( $('input[type="hidden"][name="mepr_process_signup_form"]').length ) { 529 if( $('input[type="hidden"][name="mepr_process_signup_form"]').val() == 'Y' ) { 530 return; 531 } 532 } 533 updateCheckoutState(form); 534 } 535 ); 536 537 $("body").on('change', '.mepr-signup-form input[name="mpgft-signup-gift-checkbox"]', function () { 538 let $is_gift = $(this), 539 $form = $is_gift.closest('.mepr-signup-form'); 540 541 if ($is_gift.is(':checked')) { 542 $form.find('.mepr-order-bumps').hide().find('input[name="mepr_order_bumps[]"]:checked').prop('checked', false).each(function () { 543 handleOrderBumpToggle.call(this); 544 }); 545 } else { 546 $form.find('.mepr-order-bumps').show(); 547 } 548 }); 549 }); 550})(jQuery);
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.