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').stop().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 form.one('meprAfterPriceStringUpdated', function () { 206 $(obj).removeData('validating'); 207 208 if($(obj).data('submit-when-valid')) { 209 $(obj).removeData('submit-when-valid'); 210 form.find('.mepr-submit').trigger('click'); 211 } 212 }); 213 214 // Let's update price string and invoice 215 updateCheckoutState(form); 216 } 217 else { 218 form.find('.mepr-payment-methods-wrapper:hidden').show(); 219 form.find('input[name="mepr_payment_methods_hidden"]').remove(); 220 price_string.text(price_string.data('default-price-string')); 221 222 $(obj).removeData('validating'); 223 $(obj).removeData('submit-when-valid'); 224 225 // Invalid Coupon - update SPC Invoice 226 updateCheckoutState(form); 227 } 228 }) 229 .fail(function () { 230 $(obj).removeData('validating'); 231 $(obj).removeData('submit-when-valid'); 232 }); 233 } 234 else if($(obj).val().trim() === '') { 235 if (form.find('.mepr-payment-methods-wrapper').is(':hidden')) { 236 // Looks like we need to restore the payment methods 237 form.find('.mepr-payment-methods-wrapper').show(); 238 form.find('input[name="mepr_payment_methods_hidden"]').remove(); 239 } 240 241 price_string.text(price_string.data('default-price-string')); 242 // Enpty Coupon - update SPC Invoice 243 updateCheckoutState(form); 244 } 245 } 246 247 $(obj).trigger('mepr-validate-input'); 248 }; 249 250 $('body').on('focus', '.mepr-form .mepr-form-input', function (e) { 251 $(this).prev('.mp-form-label').find('.cc-error').hide(); 252 $(this).removeClass('invalid'); 253 }); 254 255 $('body').on('blur', '.mepr-form .mepr-form-input', function (e) { 256 //Don't validate date fields here, wait til the push the submit button 257 if(!$(this).hasClass('mepr-date-picker')) { 258 meprValidateInput(this); 259 } 260 }); 261 262 // Specific to validating with the datepicker ui text field 263 $('body').on('mepr-date-picker-closed', '.mepr-form .mepr-form-input.mepr-date-picker', function (e, date, inst) { 264 meprValidateInput(this); 265 }); 266 267 $('body').on('click', '.mepr-signup-form .mepr-submit', function (e) { 268 // We want to control if/when the form is submitted 269 e.preventDefault(); 270 271 var form = $(this).closest('.mepr-signup-form'); 272 var coupon = form.find('.mepr-coupon-code'); 273 274 if(coupon.data('validating')) { 275 coupon.data('submit-when-valid', true); 276 return; 277 } 278 279 $.each(form.find('.mepr-form-input:visible'), function(i,obj) { 280 meprValidateInput(obj, true); 281 }); 282
283 if (0 < form.find('.invalid:visible').length) { 284 form.find('.validation').addClass('failed'); 285 } 286 else { 287 var submittedTelInputs = document.querySelectorAll(".mepr-tel-input"); 288 for (var i = 0; i < submittedTelInputs.length; i++) { 289 var iti = window.intlTelInputGlobals.getInstance(submittedTelInputs[i]); 290 submittedTelInputs[i].value = iti.getNumber(); 291 } 292 form.find('.validation').addClass('passed'); 293 this.disabled = true; 294 form.find('.mepr-loading-gif').show(); 295 $(this).trigger('mepr-register-submit'); 296 form.submit(); 297 } 298 }); 299 300 $('body').on('click', '.mepr-signup-form div[class^=mepr-payment-method] input.mepr-form-radio', function () { 301 var form = $(this).closest('.mepr-signup-form'); 302 303 // Reset the transaction ID to prevent any issues after switching payment methods 304 form.find('input[name="mepr_transaction_id"]').val(''); 305 306 var pmid = '.mp-pm-desc-' + $(this).val(); 307 var pmid_exists = (form.find(pmid).length > 0); 308 309 form.find('.mepr-payment-method-desc-text').addClass('mepr-close'); 310 311 if(pmid_exists) { 312 form.find(pmid).removeClass('mepr-close'); 313 } 314 315 //If nothing has the mepr-close class, we still need to show this one's description 316 var mepr_close_exists = (form.find('.mepr-payment-method-desc-text.mepr-close').length > 0); 317 318 if(mepr_close_exists) { 319 form.find('.mepr-payment-method-desc-text.mepr-close').slideUp({ 320 duration: 200, 321 complete: function() { 322 // Clear validation errors on fields now hidden 323 form.find('.mepr-payment-methods-wrapper .mepr-form-input').each(function () { 324 $('.mepr-form-input.invalid').removeClass('.invalid'); 325 $('.cc-error').hide(); 326 $('.mepr-form-has-errors').hide(); 327 }); 328 329 if(pmid_exists) { 330 form.find(pmid).slideDown(200); 331 } 332 } 333 }); 334 } else { 335 // Clear validation errors on fields now hidden 336 form.find('.mepr-payment-methods-wrapper .mepr-form-input').each(function () { 337 $('.mepr-form-input.invalid').removeClass('.invalid'); 338 $('.cc-error').hide(); 339 $('.mepr-form-has-errors').hide(); 340 }); 341 342 if(pmid_exists) { 343 form.find(pmid).slideDown(200); 344 } 345 } 346 }); 347 348 // Update price string & invoice when certain inputs change value 349 $("body").on("change mepr-geolocated", 350 ".mepr-form .mepr-form-input, .mepr-form .mepr-form-radios-input, .mepr-form .mepr-select-field", 351 function () { 352 if($(this).attr('name') == 'mepr-address-zip' || 353 $(this).attr('name') == 'mepr-address-city' || 354 $(this).attr('name') == 'mepr-address-country' || 355 $(this).attr('name') == 'mepr-address-one' || 356 $(this).attr('name') == 'mepr-address-state' || 357 $(this).attr('name') == 'mepr_vat_customer_type' || 358 $(this).attr('name') == 'mepr_vat_number' || 359 $(this).attr('name') == 'mpgft-signup-gift-checkbox' 360 ) { 361 updateCheckoutState($(this).closest(".mepr-signup-form")); 362 } 363 } 364 ); 365 366 $(".mepr-replace-file").each(function(){ 367 $(this).closest('div').find('.mepr-file-uploader').hide(); 368 }); 369 $('body').on('click', '.mepr-replace-file', function (e) { 370 $(this).closest('div').find('.mepr-file-uploader').toggle(); 371 }); 372 373 // Set the visibility of payment methods based on order bumps 374 var handleOrderBumpToggle = function () { 375 var $input = $(this), 376 $order_bump = $input.closest('.mepr-order-bump'), 377 $order_bumps = $order_bump.closest('.mepr-order-bumps'), 378 $form = $order_bumps.closest('.mepr-signup-form'), 379 has_order_bump = false, 380 has_sub = false, 381 $to_hide = $(), 382 $to_show = $(), 383 $compatible_pm, 384 $incompatible_pm; 385 386 $order_bumps.find('input[name="mepr_order_bumps[]"]:checked').each(function () { 387 has_order_bump = true; 388 389 if($(this).closest('.mepr-order-bump').hasClass('mepr-sub')) { 390 has_sub = true; 391 } 392 }); 393 394 if ( $(this).hasClass('mepr_order_bumps_init') ) { 395 return; 396 } 397 398 var is_ob_required = $order_bump.hasClass('mepr-order-bump-required'); 399 400 if (is_ob_required) { 401 $(this).addClass('mepr_order_bumps_init'); 402 } 403 404 $form.find('.mepr-order-bumps-notice').removeClass('mepr_error').addClass('mepr-hidden'); 405 $form.removeClass('mepr-order-bumps-required-error'); 406 407 $form.find('div[class^=mepr-payment-method] input.mepr-form-radio, input[type="hidden"][name="mepr_payment_method"]').each(function () { 408 var $pm = $(this); 409 410 if(has_order_bump) { 411 if($pm.hasClass('mepr-can-order-bumps')) { 412 if(has_sub) { 413 if($pm.hasClass('mepr-can-multiple-subscriptions')) { 414 $to_show = $to_show.add($pm); 415 416 if(!$compatible_pm) { 417 $compatible_pm = $pm; 418 } 419 } else { 420 $to_hide = $to_hide.add($pm); 421 422 if($pm.prop('checked')) { 423 $incompatible_pm = $pm; 424 } 425 } 426 } else { 427 $to_show = $to_show.add($pm); 428 429 if(!$compatible_pm) { 430 $compatible_pm = $pm; 431 } 432 } 433 } else { 434 $to_hide = $to_hide.add($pm); 435 436 if($pm.prop('checked')) { 437 $incompatible_pm = $pm; 438 } 439 } 440 } else { 441 $to_show = $to_show.add($pm); 442 } 443 }); 444 445 if($incompatible_pm && is_ob_required) { 446 $to_hide = $to_hide.add($incompatible_pm); 447 $to_hide.closest('.mepr_payment_method, .mepr-payment-option-label').hide() 448 } 449 450 if(!$to_show.length) { 451 if( is_ob_required ) { 452 $form.find('.mepr-order-bumps-notice').text(MeprSignup.no_compatible_pms_ob_required).addClass('mepr_error').removeClass('mepr-hidden'); 453 $form.addClass('mepr-order-bumps-required-error'); 454 } else { 455 alert(MeprSignup.no_compatible_pms); 456 return false;
457 } 458 } 459 460 if($incompatible_pm) { 461 if($compatible_pm) { 462 var compatible_pm_label = $compatible_pm.data('payment-method-type'), 463 prompt = MeprSignup.switch_pm_prompt.replace('%s', compatible_pm_label); 464 465 if($.magnificPopup) { 466 var $switch_button = $('<div class="mepr-btn">').text(MeprSignup.switch_pm.replace('%s', compatible_pm_label)).on('click', function () { 467 $compatible_pm.trigger('click'); 468 $input.trigger('click'); 469 $.magnificPopup.close(); 470 }); 471 472 var $cancel_button = $('<div class="mepr-btn mepr-btn-secondary">').text(MeprSignup.cancel).on('click', function () { 473 $.magnificPopup.close(); 474 }); 475 476 var $popup_content = $('<div class="mepr-switch-pm-popup">').append( 477 $('<img class="mepr-switch-pm-popup-icon">').attr('src', MeprSignup.warning_icon_url), 478 $('<p>').text(prompt), 479 $('<div class="mepr-switch-pm-popup-buttons">').append($switch_button, $cancel_button) 480 ); 481 482 if( ! is_ob_required ) { 483 $.magnificPopup.open({ 484 mainClass: 'mepr-switch-pm-mfp', 485 items: { 486 src: $popup_content, 487 type: 'inline' 488 } 489 }); 490 } else { 491 $compatible_pm.trigger('click'); 492 $input.trigger('click'); 493 } 494 495 } else if(confirm(prompt)) { 496 $compatible_pm.trigger('click'); 497 $input.trigger('click'); 498 return; 499 } 500 } else { 501 if( is_ob_required ) { 502 $form.find('.mepr-order-bumps-notice').text(MeprSignup.no_compatible_pms_ob_required).addClass('mepr_error').removeClass('mepr-hidden'); 503 $form.addClass('mepr-order-bumps-required-error'); 504 } else { 505 alert(MeprSignup.no_compatible_pms); 506 } 507 } 508 509 return false; 510 } 511 512 $to_hide.closest('.mepr_payment_method, .mepr-payment-option-label').hide(); 513 $to_show.closest('.mepr_payment_method, .mepr-payment-option-label').show(); 514 515 $order_bump.toggleClass('mepr-order-bump-selected', this.checked); 516 }; 517 518 $('body').on('click', '.mepr-signup-form input[name="mepr_order_bumps[]"]', handleOrderBumpToggle); 519 520 if( $('.mepr-order-bump-required').length ) { 521 522 $('input[name="mepr_order_bumps[]"]:checked').each(function () { 523 handleOrderBumpToggle.call(this); 524 }); 525 526 if( $('.mepr-signup-form.mepr-order-bumps-required-error').length ) { 527 $('.mepr-signup-form').find('.mepr-submit').hide(); 528 $('.mepr-signup-form').find('.mepr-submit').attr('disabled','disabled'); 529 } else { 530 $('.mepr-signup-form').find('.mepr-submit').show(); 531 $('.mepr-signup-form').find('.mepr-submit').removeAttr('disabled'); 532 } 533 534 updateCheckoutState($('.mepr-signup-form')); 535 } 536 537 // Hide subscription order bumps if no payment method supports multiple subscriptions 538 $('.mepr-signup-form').each(function () { 539 var $form = $(this), 540 $order_bumps = $form.find('.mepr-order-bumps'), 541 pm_supports_multiple_subs = false; 542 543 if(!$order_bumps.length) { 544 return; 545 } 546 547 $form.find('div[class^=mepr-payment-method] input.mepr-form-radio, input[type="hidden"][name="mepr_payment_method"]').each(function (index) { 548 var $pm = $(this); 549 550 if($pm.hasClass('mepr-can-multiple-subscriptions') && pm_supports_multiple_subs === false) { 551 pm_supports_multiple_subs = index; 552 } 553 }); 554 555 if(pm_supports_multiple_subs === false) { 556 $order_bumps.find('.mepr-order-bump.mepr-sub').hide(); 557 558 if(!$order_bumps.find('.mepr-order-bump:visible').length) { 559 $order_bumps.hide(); 560 } 561 } else if(pm_supports_multiple_subs > 0) { 562 var $new_first_pm = $form.find('div[class^=mepr-payment-method] input.mepr-form-radio').eq(pm_supports_multiple_subs); 563 564 $new_first_pm 565 .closest('.mepr_payment_method, .mepr-payment-option-label') 566 .insertBefore( 567 $form.find('div[class^=mepr-payment-method] input.mepr-form-radio') 568 .eq(0) 569 .closest('.mepr_payment_method, .mepr-payment-option-label') 570 ); 571 572 $new_first_pm.trigger('click'); 573 } 574 575 // If gift checkbox is checked, hide and disable order bumps 576 if($form.find('input[name="mpgft-signup-gift-checkbox"]').is(':checked')) { 577 $order_bumps.hide().find('input[name="mepr_order_bumps[]"]').prop('checked', false); 578 } 579 }); 580 581 $("body").on("change", 582 '.mepr-form input[name="mepr_order_bumps[]"]', 583 function (e) { 584 let form = $(this).closest(".mepr-signup-form"); 585 if( $('input[type="hidden"][name="mepr_process_signup_form"]').length ) { 586 if( $('input[type="hidden"][name="mepr_process_signup_form"]').val() == 'Y' ) { 587 return; 588 } 589 } 590 updateCheckoutState(form); 591 } 592 ); 593 594 $("body").on('change', '.mepr-signup-form input[name="mpgft-signup-gift-checkbox"]', function () { 595 let $is_gift = $(this), 596 $form = $is_gift.closest('.mepr-signup-form'); 597 598 if ($is_gift.is(':checked')) { 599 $form.find('.mepr-order-bumps').hide().find('input[name="mepr_order_bumps[]"]:checked').prop('checked', false).each(function () { 600 handleOrderBumpToggle.call(this); 601 }); 602 } else { 603 $form.find('.mepr-order-bumps').show(); 604 } 605 }); 606 }); 607})(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.