PageSourceSearch

https://gordonbrothersmarketplace.com/Scripts/Account/SignUp/SignUp.js

js gordonbrothersmarketplace.com collected 2026-10-09 22:13:05 UTC 8,930 bytes, 250 lines download raw bytes

1if (typeof fbq === 'function') {
2  fbq('track', 'Lead');
3}
4
5var signUpConfig = $('#signup-config');
6let touchedFields = {};
7
8const fields = [
9  { id: 'FirstName', placeholder: signUpConfig.attr('data-firstname-placeholder'), errorMessage: signUpConfig.attr('data-firstname-validation') },
10  { id: 'LastName', placeholder: signUpConfig.attr('data-lastname-placeholder'), errorMessage: signUpConfig.attr('data-lastname-validation') },
11  { id: 'MobileNumber', placeholder: signUpConfig.attr('data-mobile-placeholder'), errorMessage: signUpConfig.attr('data-mobile-validation') },
12  { id: 'Email', placeholder: signUpConfig.attr('data-email-placeholder'), errorMessage: signUpConfig.attr('data-email-validation') },
13  { id: 'Password', placeholder: signUpConfig.attr('data-password-placeholder'), errorMessage: signUpConfig.attr('data-password-validation') }
14];
15
16function validatePassword(password) {
17  const requirements = {
18    length: password.length >= 6 && password.length <= 15,
19    uppercase: /[A-Z]/.test(password),
20    lowercase: /[a-z]/.test(password),
21    number: /\d/.test(password)
22  };
23
24  $('#req-length').removeClass('valid invalid').addClass(requirements.length ? 'valid' : 'invalid');
25  $('#req-uppercase').removeClass('valid invalid').addClass(requirements.uppercase ? 'valid' : 'invalid');
26  $('#req-lowercase').removeClass('valid invalid').addClass(requirements.lowercase ? 'valid' : 'invalid');
27  $('#req-number').removeClass('valid invalid').addClass(requirements.number ? 'valid' : 'invalid');
28
29  return requirements.length && requirements.uppercase && requirements.lowercase && requirements.number;
30}
31
32function validateSignupForm(forceValidation = false) {
33  let agreeToTerms = $("#AgreeToTerms").is(":checked");
34  let password = $("#Password").val();
35  let confirmPassword = $("#ConfirmPassword").val();
36
37  let allFieldsValid = true;
38  fields.forEach(function (field) {
39    let value = $.trim($("#" + field.id).val());
40    let isValid = value.length > 0;
41
42    if (field.id === 'Password' && value.length > 0) {
43      isValid = validatePassword(value);
44    }
45
46    if (!isValid && (touchedFields[field.id] || forceValidation)) {
47      $("#" + field.id).attr("placeholder", field.errorMessage);
48      $("#" + field.id).addClass("input-validation-error");
49      allFieldsValid = false;
50    } else if (isValid || (!touchedFields[field.id] && !forceValidation)) {
51      $("#" + field.id).attr("placeholder", field.placeholder);
52      $("#" + field.id).removeClass("input-validation-error");
53    }
54  });
55
56  let confirmPasswordValid = confirmPassword.length > 0 && password === confirmPassword;
57  if (!confirmPasswordValid && (touchedFields['ConfirmPassword'] || forceValidation)) {
58    if (confirmPassword.length === 0) {
59      $("#ConfirmPassword").attr("placeholder", signUpConfig.attr('data-confirm-password-required'));
60    } else {
61      $("#ConfirmPassword").attr("placeholder", signUpConfig.attr('data-confirm-password-mismatch'));
62    }
63    $("#ConfirmPassword").addClass("input-validation-error");
64    allFieldsValid = false;
65  } else if (confirmPasswordValid || (!touchedFields['ConfirmPassword'] && !forceValidation)) {
66    $("#ConfirmPassword").attr("placeholder", signUpConfig.attr('data-confirm-password-placeholder'));
67    $("#ConfirmPassword").removeClass("input-validation-error");
68  }
69
70  let isValid = allFieldsValid && agreeToTerms && password === confirmPassword;
71  $("#btnRegister").prop("disabled", !isValid);
72}
73
74var SignUpMessage = {
75  SignUpConfirmation: signUpConfig.attr('data-sign-up-confirmation') || '',
76  SuccessMode: signUpConfig.attr('data-success-mode') || 'confirmation',
77  SuccessRedirectUrl: signUpConfig.attr('data-success-redirect-url') || ''
78};
79
80var signupNotification;
81
82var signUpModel = mvvmLite.observable({
83  response: {},
84  errorOccurred: false,
85  showBack: getParameterByName('returnUrl').length > 0,
86  backUrl: getParameterByName('returnUrl'),
87  errorMessage: "",
88  defaultErrorMessage: signUpConfig.attr('data-default-error-message') || '',
89  signInUrl: function (e) {
90    return signUpModel.showBack ? "/account/signin?returnUrl=" + signUpModel.backUrl : "/account/signin";
91  },
92  signUpUser: function (e) {
93    var $form = $('#signup_form');
94
95    if ($("#btnRegister").prop("disabled")) {
96      return false;
97    }
98
99    validateSignupForm(true);
100
101    if ($form.valid()) {
102      startBlock('signup_form');
103      signUpModel.set("errorMessage", "");
104      signUpModel.set("errorOccurred", false);
105      $.ajax({
106        url: $form.attr('action'),
107        type: 'POST',
108        data: $form.serialize(),
109        success: function (data) {
110          if (data.success) {
111            signUpModel.set("errorMessage", "");
112            window.trackMetaEvent('CompleteRegistration');
113
114            if (SignUpMessage.SuccessMode === 'redirect') {
115              window.location.href = SignUpMessage.SuccessRedirectUrl || signUpModel.backUrl || '/account/myaccount';
116              return;
117            }
118
119            var msg = SignUpMessage.SignUpConfirmation.replace('{0}', data.data);
120            signupNotification.show(msg, "success");
121            $('#signup_form :input').prop('disabled', true);
122            $('#btnRegister').prop('disabled', true);
123            endBlock('signup_form');
124          }
125          else {
126            signUpModel.set("errorOccurred", true);
127            signUpModel.set("errorMessage", resolveAjaxErrorMessage(data, signUpModel.defaultErrorMessage));
128
129            endBlock('signup_form');
130          }
131        },
132        error: function (e) {
133          signUpModel.set("errorOccurred", true);
134          signUpModel.set("errorMessage", resolveAjaxErrorMessage(e, signUpModel.defaultErrorMessage));
135          endBlock('signup_form');
136        }
137      });
138    }
139
140    return false;
141  }
142});
143
144mvvmLite.bind(document.getElementById("divSignUp"), signUpModel);
145
146$(document).ready(function () {
147  $("#FirstName, #LastName, #MobileNumber, #Email, #Password, #ConfirmPassword").on("input keyup blur", function () {
148    touchedFields[$(this).attr('id')] = true;
149    validateSignupForm();
150  });
151
152  $("#Password").on("focus input", function () {
153    let password = $(this).val();
154    if (password.length > 0 || $(this).is(':focus')) {
155      $("#passwordRequirements").addClass("show");
156      if (password.length > 0) {
157        validatePassword(password);
158      } else {
159        $('#req-length, #req-uppercase, #req-lowercase, #req-number')
160          .removeClass('valid')
161          .addClass('invalid');
162      }
163    }
164  });
165
166  $("#Password").on("blur", function () {
167    let password = $(this).val();
168    if (password.length === 0) {
169      $("#passwordRequirements").removeClass("show");
170    } else if (validatePassword(password)) {
171      setTimeout(function () {
172        $("#passwordRequirements").removeClass("show");
173      }, 2000);
174    }
175  });
176
177  $("#AgreeToTerms").on("change", function () {
178    validateSignupForm();
179  });
180
181  $("#AcceptSms").on("change", function () {
182    validateSignupForm();
183  });
184
185  validateSignupForm(false);
186
187  function updateErrorClasses() {
188    $('.sign-form .col-md-6, .sign-form .col-md-12').each(function () {
189      let $container = $(this);
190      let hasError = $container.find('.field-validation-error').length > 0 &&
191        $container.find('.field-validation-error').text().trim() !== '';
192
193      if (hasError) {
194        $container.addClass('has-error');
195      } else {
196        $container.removeClass('has-error');
197      }
198    });
199  }
200
201  updateErrorClasses();
202
203  var observer = new MutationObserver(function (mutations) {
204    mutations.forEach(function (mutation) {
205      if (mutation.type === 'childList' || mutation.type === 'characterData') {
206        updateErrorClasses();
207      }
208    });
209  });
210
211  observer.observe(document.getElementById('signup_form'), {
212    childList: true,
213    subtree: true,
214    characterData: true
215  });
216
217  signupNotification = GBComponents.mountNotification(document.getElementById("clipboardNotification"), {
218    autoHideAfter: 0,
219    dismissible: true,
220    position: {
221      top: 30,
222      right: 30
223    }
224  });
225
226  let loadBackground = function (element) {
227    let cssBgUrl = getComputedStyle(element).getPropertyValue('--bg-image').trim();
228
229    if (!cssBgUrl) return;
230
231    element.classList.remove('lazy');
232    element.classList.add('bg-loaded');
233  };
234
235  let intersectionObserver = new IntersectionObserver((entries, observer) => {
236    entries.forEach(entry => {
237      if (entry.isIntersecting) {
238        loadBackground(entry.target);
239        observer.unobserve(entry.target);
240      }
241    });
242  }, {
243    threshold: 0.1,
244    rootMargin: '50px'
245  });
246
247  document.querySelectorAll('.lazy').forEach(el => {
248    intersectionObserver.observe(el);
249  });
250});

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.