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.