PageSourceSearch

https://architecturetoday.co.uk/wp-content/plugins/memberpress/js/signup.js?ver=1.12.2

js architecturetoday.co.uk collected 2026-10-01 11:33:30 UTC 22,261 bytes, 607 lines download raw bytes

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.