1let submitClick, addErrorToDataLayer, clickedButton; 2var addressObject; 3 4function onDocumentReady() { 5 // $('.leadgen').siblings('.container.responsivegrid').find('#cmp-session__redirect-container').hide(); 6 document.querySelectorAll('.leadgen').forEach(function (el) { 7 var parent = el.parentElement; 8 if (parent) { 9 // Finding siblings that match the criteria 10 Array.from(parent.children).forEach(function (sibling) { 11 if (sibling !== el && sibling.classList.contains('container') && sibling.classList.contains('responsivegrid')) { 12 var redirectContainer = sibling.querySelector('#cmp-session__redirect-container'); 13 if (redirectContainer) redirectContainer.style.display = 'none'; 14 } 15 }); 16 } 17 }); 18 19 window.isFormStart = false; 20 21 //hide all errorcode & successcode 22 function resetErrSuccssCode() { 23 var genesisElements = document.querySelectorAll('.leadgengenesis'); 24 genesisElements.forEach(function (parent) { 25 var codes = [ 26 "[data-successcode='200']", 27 "[data-errorcode='invalid-zip']", 28 "[data-errorcode='invalid-email']", 29 "[data-errorcode='invalid-address']", 30 "[data-errorcode='email-already-exist']", 31 "[data-errorcode='email-not-whitelisted']", 32 "[data-errorcode='signup-error']", 33 "[data-errorcode='service-availability-error']", 34 "[data-errorcode='other-error']", 35 "[data-errorcode='generic-error']" 36 ]; 37 codes.forEach(function (selector) { 38 var el = parent.querySelector(selector); 39 if (el) el.style.display = 'none'; 40 }); 41 }); 42 43 document.querySelectorAll('.errormsg').forEach(function (el) { 44 el.style.display = 'none'; 45 }); 46 } 47 48 //hide all leadgen for success/error forms 49 resetErrSuccssCode(); 50 51 addErrorToDataLayer = function (msg, siteId) { 52 var formNameVar = "email/zip form"; 53 if (siteId === "genesis") { 54 formNameVar = "Address Form"; 55 } 56 window.adobeDataLayer = window.adobeDataLayer || []; 57 window.adobeDataLayer.push({ 58 event: "form_error", 59 form: { 60 formDetails: { 61 formError: { 62 value: 1, 63 }, 64 formName: formNameVar, 65 formErrorName: msg, 66 }, 67 }, 68 }); 69 } 70 71 function showError(errorType) { 72 if (errorType === "xhr") { 73 addErrorToDataLayer("ApiProxyServlet call failed."); 74 } else if (errorType === "briteVerify") { 75 addErrorToDataLayer("invalid email id entered"); 76 } else if (errorType === "responsys") { 77 addErrorToDataLayer("responsys error"); 78 } else if (errorType === "omnisend ") { 79 addErrorToDataLayer("omnisend error"); 80 } else if (errorType === "invaild response") { 81 addErrorToDataLayer("invalid response from server"); 82 } 83 } 84 85 //go back button click 86 function goBackClick() { 87 //Hide Qualification check form by default 88 // $('#leadgenQualificationform').hide(); 89 document.querySelectorAll('.leadgenform').forEach(function (form) { 90 form.reset(); 91 form.style.display = 'block'; 92 var errorMsgs = form.querySelectorAll('.errormsg');
93 errorMsgs.forEach(function (msg) { msg.style.display = 'none'; }); 94 }); 95 96 var leadGenFormEl = document.getElementById('leadgenform'); 97 if (leadGenFormEl) leadGenFormEl.style.display = 'block'; 98 99 //Hide First Zip/Email form 100 var zipContainer = document.getElementById('dvZipContainer'); 101 var emailContainer = document.getElementById('dvEmailContainer'); 102 if (zipContainer) zipContainer.style.display = 'block'; 103 if (emailContainer) emailContainer.style.display = 'block'; 104 } 105 106 var rowNum = 0; 107 submitClick = function () { 108 //Analytics | Form Tracking 109 window.adobeDataLayer = window.adobeDataLayer || []; 110 111 // Use clickedButton as the context for the form 112 var $form = clickedButton; 113 var formNameVar = $form.getAttribute('name'); 114 115 window.adobeDataLayer.push({ 116 event: "form_complete", 117 form: { 118 formDetails: { 119 formComplete: { 120 value: 1, 121 }, 122 formName: formNameVar, 123 }, 124 }, 125 }); 126 127 //Lead Gen Form 128 var formIdIndex = rowNum++; 129 130 // Find endpoint data 131 var endpointEl = Array.from($form.parentElement.children).find(el => el.classList.contains('endpoint')); 132 var actionurl = endpointEl ? endpointEl.getAttribute('data-path') : ''; 133 var siteId = endpointEl ? endpointEl.getAttribute('data-site') : ''; 134 135 var emailInput = $form.querySelector(".txtEmail"); 136 var emailId = emailInput ? emailInput.value : ''; 137 emailId = emailId && emailId.length > 0 ? emailId : sessionStorage.getItem("email"); 138 139 var zipInput = $form.querySelector(".txtZipCode"); 140 var zipCode = zipInput ? zipInput.value : ''; 141 zipCode = zipCode && zipCode.length > 0 ? zipCode : sessionStorage.getItem("zip"); 142 143 var phoneInput = $form.querySelector(".phoneNumber"); 144 var phoneNumber = phoneInput ? phoneInput.value : ''; 145 146 var anchorBtn = $form.querySelector(".button > a"); 147 var href = anchorBtn ? anchorBtn.getAttribute("href") : undefined; 148 149 var isAddressValidationEnabled = $form.getAttribute("data-addressvalidation"); 150 151 var addressInput = $form.querySelector(".txtAddress"); 152 var address = addressInput ? addressInput.value : ''; 153 154 var magentoFormId = $form.getAttribute("data-form-id"); 155 156 var productForm = document.querySelector("form[id='product_addtocart_form']"); 157 var productInput = productForm ? productForm.querySelector("input[name='product']") : null; 158 var product = productInput ? productInput.value : ''; 159 160 var redirectPath = ""; 161 if (typeof href !== 'undefined' && href !== null) { 162 if (href.includes("https://www.boostmobile.com/shop/")) { 163 redirectPath = href.replace("https://www.boostmobile.com/shop/", ""); 164 } 165 else { 166 redirectPath = href; 167 } 168 } 169 $form.setAttribute("redirect", redirectPath); 170 171 var actionhref = $form.getAttribute("action"); 172 $form.setAttribute("id", "leadgenform_" + formIdIndex); 173 174 var consentCheckbox = $form.querySelector(".consentCheckbox"); 175 var consentCheckboxValue = consentCheckbox ? consentCheckbox.checked : false; 176 177 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'block'); 178 179 var requestData = { 180 product: product && product.length > 0 ? product : undefined, 181 site: siteId, 182 phone: phoneNumber, 183 consent: consentCheckboxValue 184 }; 185 186 if (emailId && emailId.length > 0 && emailId !== "null") { 187 requestData.email = emailId; 188 } 189 if (zipCode && zipCode.length > 0) { 190 requestData.zip = zipCode; 191 } 192 193 let partialAddress = ''; 194 let lastFiveCharAddress = ''; 195 if (address && address.length > 0) { 196 requestData.address = address; 197 partialAddress = address; 198 lastFiveCharAddress = partialAddress.slice(-5); 199 sessionStorage.setItem("fullAddress", partialAddress); 200 sessionStorage.setItem("zip", lastFiveCharAddress);
201 sessionStorage.setItem("address", addressObject.streetLine); 202 sessionStorage.setItem("address2", addressObject.secondary) 203 sessionStorage.setItem("city", addressObject.city) 204 sessionStorage.setItem("state", addressObject.state) 205 } 206 207 // Vanilla fetch instead of $.ajax 208 fetch(actionurl, { 209 method: 'POST', 210 headers: { 211 'Content-Type': 'application/x-www-form-urlencoded', 212 }, 213 body: new URLSearchParams(requestData) 214 }) 215 .then(response => response.json()) 216 .then(response => { 217 if (response && response.status) { 218 if (response.status == "success") { 219 //brite verify + responsys call successful 220 if (siteId === "boost") { 221 document.cookie = 'leadGenSuccess = true; path=/; secure' 222 if (response.sessionRedirect && typeof magentoFormId != 'undefined' && (magentoFormId === 'boost_leadgen_form' || magentoFormId === 'product_addtocart_form')) { 223 224 // Native logic for closest .leadgen siblings 225 var leadgenParent = $form.closest(".leadgen"); 226 if (leadgenParent) { 227 var siblings = Array.from(leadgenParent.parentElement.children); 228 var targetSib = siblings.find(s => s.classList.contains('container')); 229 var redirectCont = targetSib ? targetSib.querySelector('#cmp-session__redirect-container') : null; 230 231 if (redirectCont) { 232 redirectCont.style.display = 'block'; 233 var textSib = siblings.find(s => s.classList.contains('text')); 234 if (textSib) textSib.style.display = 'none'; 235 leadgenParent.style.display = 'none'; 236 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 237 } 238 } 239 } else if (typeof magentoFormId != 'undefined' && magentoFormId === 'product_addtocart_form') { 240 var magentoForm = document.querySelector("form[id=" + magentoFormId + "]"); 241 if (magentoForm) magentoForm.submit(); 242 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 243 if (redirectPath && redirectPath.length > 0) { 244 setTimeout(() => { 245 window.location.href = redirectPath; 246 }, 3000); 247 } 248 } else { 249 setTimeout(() => { 250 $form.submit(); 251 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 252 }, 500); 253 } 254 } else if (siteId === "genesis") { 255 if (zipCode && zipCode.length > 0) { 256 sessionStorage.setItem("zip", zipCode); 257 } 258 if (emailId && emailId.length > 0) { 259 sessionStorage.setItem("email", emailId); 260 } 261 262 // show success leadgen form 263 var successDiv = $form.parentElement.parentElement.querySelector('[data-successcode="200"]'); 264 if (successDiv) { 265 $form.parentElement.style.display = 'none'; 266 successDiv.style.display = 'block'; 267 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 268 } 269 else { 270 if (redirectPath && redirectPath.length > 0) { 271 window.location.href = redirectPath; 272 } 273 } 274 } 275 } else { 276 document.cookie = 'leadGenSuccess = false; path=/; secure' 277 if (siteId === "genesis") { 278 $form.reset(); 279 $form.style.display = 'none'; 280 addErrorToDataLayer(response.errorMsg); 281 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 282 } else { 283 var errEl = $form.querySelector(".errormsg"); 284 if (errEl) errEl.style.display = 'block'; 285 showError(response.api); 286 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 287 } 288 } 289 } else { 290 var errEl = $form.querySelector(".errormsg"); 291 if (errEl) errEl.style.display = 'block'; 292 showError("invaild response"); 293 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 294 } 295 }) 296 .catch(error => { 297 document.cookie = 'leadGenSuccess = false; path=/; secure'
298 var errStatusCodeObj = ["invalid-zip", "invalid-email", "invalid-address", "email-already-exist", "email-not-whitelisted", "signup-error", "service-availability-error", "other-error", "generic-error"]; 299 300 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 301 302 if (siteId === "genesis") { 303 sessionStorage.removeItem("fullAddress"); 304 sessionStorage.removeItem("address"); 305 sessionStorage.removeItem("address2"); 306 sessionStorage.removeItem("city"); 307 sessionStorage.removeItem("state"); 308 sessionStorage.removeItem("zip"); 309 sessionStorage.removeItem("email"); 310 311 var statusCodeIndex = ""; 312 // Assuming error object mimics jqXHR for compatibility 313 var errorCode = error.errorCode; 314 if (errorCode && errorCode.length > 0) { 315 statusCodeIndex = parseInt(errStatusCodeObj.indexOf((errorCode).toString())); 316 } else { 317 statusCodeIndex = parseInt(errStatusCodeObj.indexOf(('other-error').toString())); 318 } 319 320 $form.parentElement.style.display = 'none'; 321 var targetErrorEl = $form.parentElement.parentElement.querySelector(`[data-errorcode="${errStatusCodeObj[statusCodeIndex]}"]`); 322 if (targetErrorEl) targetErrorEl.style.display = 'block'; 323 $form.reset(); 324 addErrorToDataLayer(error.errorMsg || "Unknown Error"); 325 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 326 } else { 327 showError("xhr"); 328 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 329 } 330 }); 331 } 332 333 function verifyEmailPattern() { 334 var emailVal = document.querySelector(".txtEmail").value; 335 var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 336 return re.test(emailVal); 337 } 338 339 function verifyZipPattern() { 340 var zipcode = document.querySelector(".txtZipCode").value; 341 return !Number.isNaN(zipcode) && zipcode.length == 5; 342 } 343 344 function disableSubmitButton(val) { 345 var btn = document.getElementById("btnSubmit"); 346 if (val) { 347 if (btn && btn.parentElement) btn.parentElement.classList.add("cmp-button__disabled"); 348 } else { 349 if (btn && btn.parentElement) btn.parentElement.classList.remove("cmp-button__disabled"); 350 } 351 } 352 353 function ValidateZipCheck($form) { 354 var val = $form.querySelector(".txtZipCode") ? $form.querySelector(".txtZipCode").value : ''; 355 return (val && val.length == 5); 356 } 357 358 function ValidateEmailCheck($form) { 359 var val = $form.querySelector(".txtEmail") ? $form.querySelector(".txtEmail").value : ''; 360 var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 361 return re.test(val); 362 } 363 364 function ValidateAddressCheck($form) { 365 var addrEl = $form.querySelector(".txtAddress"); 366 if (addrEl && addrEl.value.length > 0) { 367 var isAddressValidationChecked = $form.getAttribute("data-addressvalidation"); 368 if (isAddressValidationChecked && isAddressValidationChecked.toLowerCase() === "true") { 369 return (window.zipcodes && window.zipcodes.length > 0); 370 } else { 371 return true; 372 } 373 } else { 374 return false; 375 } 376 } 377 378 function ValidatePhoneCheck($form) { 379 var phoneRegex = /^\d{10}$/; 380 var phoneEl = $form.querySelector(".phoneNumber"); 381 var phone = phoneEl ? phoneEl.value : ''; 382 return (phone && phoneRegex.test(phone)); 383 } 384 385 function ValidateEmail() { 386 var $form = this.closest("form"); 387 var checked = 0; 388 389 if ($form.querySelector(".txtEmail") && !ValidateEmailCheck($form)) checked = 1; 390 if ($form.querySelector(".txtZipCode") && !ValidateZipCheck($form)) checked = 1; 391 if ($form.querySelector(".txtAddress") && !ValidateAddressCheck($form)) checked = 1; 392 if ($form.querySelector(".phoneNumber") && !ValidatePhoneCheck($form)) checked = 1; 393 394 var inputContainer = $form.querySelector(".txtEmail") ? $form.querySelector(".txtEmail").closest(".input-container") : null; 395 if (inputContainer) { 396 inputContainer.classList.remove("typing", "default", "error"); 397 } 398 399 var btn = $form.querySelector(".button"); 400 var errEmail = $form.querySelector("#errorEmail"); 401 402 if (checked) { 403 if (btn) btn.classList.add("cmp-button__disabled"); 404 if (inputContainer) inputContainer.classList.add("typing"); 405 if (errEmail) errEmail.style.display = 'block'; 406 } else { 407 if (btn) btn.classList.remove("cmp-button__disabled"); 408 if (inputContainer) inputContainer.classList.add("typing"); 409 if (errEmail) errEmail.style.display = 'none'; 410 } 411 } 412 413 function ValidateZip() { 414 var $form = this.closest("form"); 415 var checked = 0; 416 417 if ($form.querySelector(".txtEmail") && !ValidateEmailCheck($form)) checked = 1; 418 if ($form.querySelector(".txtZipCode") && !ValidateZipCheck($form)) checked = 1; 419 if ($form.querySelector(".txtAddress") && !ValidateAddressCheck($form)) checked = 1; 420 if ($form.querySelector(".phoneNumber") && !ValidatePhoneCheck($form)) checked = 1; 421 422 var zipInput = $form.querySelector(".txtZipCode"); 423 var inputContainer = zipInput ? zipInput.closest(".input-container") : null; 424 if (inputContainer) { 425 inputContainer.classList.remove("typing", "default", "error"); 426 } 427 428 var btn = $form.querySelector(".button"); 429 var errZip = $form.querySelector("#errorZipcode"); 430 431 if (checked) { 432 if (btn) btn.classList.add("cmp-button__disabled"); 433 if (inputContainer) inputContainer.classList.add("typing"); 434 } else { 435 if (btn) btn.classList.remove("cmp-button__disabled"); 436 if (inputContainer) inputContainer.classList.add("typing"); 437 if (errZip) errZip.style.display = 'none'; 438 } 439 } 440 441 function ValidateZipAfterFocusOut() { 442 var $form = this.closest("form"); 443 if (!window.isFormStart) { 444 window.adobeDataLayer = window.adobeDataLayer || []; 445 var formNameVar = $form.getAttribute('name'); 446 window.adobeDataLayer.push({ 447 event: "form_start", 448 form: { 449 formDetails: { 450 formStart: { value: 1 }, 451 formName: formNameVar, 452 }, 453 }, 454 }); 455 window.isFormStart = true; 456 } 457 458 var zipInput = $form.querySelector(".txtZipCode"); 459 var zipcode = zipInput.value; 460 var container = zipInput.closest(".input-container"); 461 if (container) { 462 container.classList.remove("default", "typing", "error", "success"); 463 } 464 465 var errZip = $form.querySelector("#errorZipcode"); 466 if (!Number.isNaN(zipcode) && zipcode.length == 5) { 467 if (container) container.classList.add("success"); 468 if (errZip) errZip.style.display = 'none'; 469 } else { 470 if (container) container.classList.add("error"); 471 if (errZip) errZip.style.display = 'block'; 472 addErrorToDataLayer("Invalid Zip Code"); 473 } 474 } 475 476 function ValidatePhoneAfterFocusOut() { 477 var $form = this.closest("form"); 478 if (!window.isFormStart) { 479 window.adobeDataLayer = window.adobeDataLayer || []; 480 var formNameVar = $form.getAttribute('name'); 481 window.adobeDataLayer.push({ 482 event: "form_start", 483 form: { 484 formDetails: { 485 formStart: { value: 1 }, 486 formName: formNameVar, 487 }, 488 }, 489 }); 490 window.isFormStart = true; 491 } 492 493 var phoneInput = $form.querySelector(".phoneNumber"); 494 var container = phoneInput.closest(".input-container"); 495 if (container) { 496 container.classList.remove("default", "error", "typing"); 497 } 498 499 var phoneRegex = /^\d{10}$/; 500 if (phoneRegex.test(phoneInput.value)) { 501 if (container) container.classList.add("default"); 502 var errEmail = $form.querySelector("#errorEmail"); 503 if (errEmail) errEmail.style.display = 'none'; 504 } else { 505 var errorPhone = this.parentElement.parentElement.querySelector(".errorPhoneNumber"); 506 if (errorPhone) errorPhone.style.display = 'block'; 507 var btn = $form.querySelector(".button"); 508 if (btn) btn.classList.add("cmp-button__disabled"); 509 if (container) container.classList.add("error"); 510 addErrorToDataLayer("Invalid Email Address"); 511 } 512 } 513 514 function ValidateEmailAfterFocusOut() { 515 var $form = this.closest("form"); 516 if (!window.isFormStart) { 517 window.adobeDataLayer = window.adobeDataLayer || []; 518 var formNameVar = $form.getAttribute('name'); 519 window.adobeDataLayer.push({ 520 event: "form_start", 521 form: { 522 formDetails: { 523 formStart: { value: 1 }, 524 formName: formNameVar, 525 }, 526 }, 527 }); 528 window.isFormStart = true; 529 } 530 531 var emailInput = $form.querySelector(".txtEmail"); 532 var container = emailInput.closest(".input-container"); 533 if (container) { 534 container.classList.remove("default", "error", "typing", "success"); 535 } 536 537 var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 538 var errEmail = $form.querySelector("#errorEmail"); 539 if (re.test(emailInput.value)) { 540 if (container) container.classList.add("success"); 541 if (errEmail) errEmail.style.display = 'none'; 542 } else { 543 if (container) container.classList.add("error"); 544 if (errEmail) errEmail.style.display = 'block'; 545 addErrorToDataLayer("Invalid Email Address"); 546 } 547 } 548 549 function acceptOnlyNumbers(event) { 550 return event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 46 551 ? true 552 : !Number.isNaN(Number(event.key)); 553 } 554 555 function validatePhone() { 556 var $form = this.closest("form"); 557 var phoneInput = $form.querySelector(".phoneNumber"); 558 var container = phoneInput.closest(".input-container"); 559 if (container) { 560 container.classList.remove("default", "error", "typing"); 561 } 562 563 var checked = 0; 564 if ($form.querySelector(".txtEmail") && !ValidateEmailCheck($form)) checked = 1; 565 if ($form.querySelector(".txtZipCode") && !ValidateZipCheck($form)) checked = 1; 566 if ($form.querySelector(".txtAddress") && !ValidateAddressCheck($form)) checked = 1; 567 if ($form.querySelector(".phoneNumber") && !ValidatePhoneCheck($form)) checked = 1; 568 569 var btn = $form.querySelector(".button"); 570 var emailInput = $form.querySelector(".txtEmail"); 571 var emailContainer = emailInput ? emailInput.closest(".input-container") : null; 572 var errPhone = $form.querySelector("#errorPhoneNumber"); 573 574 if (checked) { 575 if (btn) btn.classList.add("cmp-button__disabled"); 576 if (emailContainer) emailContainer.classList.add("typing"); 577 if (errPhone) errPhone.style.display = 'block'; 578 } else { 579 if (btn) btn.classList.remove("cmp-button__disabled"); 580 if (emailContainer) emailContainer.classList.add("typing"); 581 if (errPhone) errPhone.style.display = 'none'; 582 } 583 } 584 585 function validateAddressSmartyStreets($form, selected) { 586 var list = $form.querySelector("#myInputautocomplete-list"); 587 if (list) { 588 list.style.display = 'block'; 589 list.innerHTML = ''; 590 } 591 var partialAddress = $form.querySelector(".txtAddress").value; 592 var apiKey = document.getElementById("leadgenform").getAttribute("data-auth-id"); 593 594 var checked = 0; 595 if ($form.querySelector(".txtEmail") && !ValidateEmailCheck($form)) checked = 1; 596 if ($form.querySelector(".txtZipCode") && !ValidateZipCheck($form)) checked = 1; 597 if ($form.querySelector(".txtAddress") && !ValidateAddressCheck($form)) checked = 1; 598 if ($form.querySelector(".phoneNumber") && !ValidatePhoneCheck($form)) checked = 1; 599 600 var addrInput = $form.querySelector(".txtAddress"); 601 var container = addrInput ? addrInput.closest(".input-container") : null; 602 var btn = $form.querySelector(".button"); 603 604 if (checked) { 605 if (btn) btn.classList.add("cmp-button__disabled"); 606 if (container) container.classList.add("typing"); 607 } else { 608 if (container) container.classList.add("typing"); 609 var addrIcon = addrInput ? addrInput.closest(".addressIcon") : null; 610 if (addrIcon) addrIcon.classList.add("error"); 611 var errAddr = document.getElementById("errorAddress"); 612 if (errAddr) { 613 errAddr.style.display = 'block'; 614 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 615 } 616 var formErrAddr = $form.querySelector("#errorAddress"); 617 if (formErrAddr) formErrAddr.style.display = 'none'; 618 } 619 620 if (partialAddress && partialAddress != '') { 621 var addrIcon = addrInput ? addrInput.closest(".addressIcon") : null; 622 if (addrIcon) addrIcon.classList.add("error"); 623 var errAddr = document.getElementById("errorAddress"); 624 if (errAddr) errAddr.style.display = 'block'; 625 626 var lookupUrl = "https://us-autocomplete-pro.api.smartystreets.com/lookup?"; 627 var params = new URLSearchParams({ 628 "auth-id": apiKey, 629 "search": partialAddress, 630 "selected": (selected ? selected : "") 631 }); 632 633 fetch(lookupUrl + params.toString()) 634 .then(res => res.json()) 635 .then(data => { 636 var autocompleteList = $form.querySelector("#myInputautocomplete-list"); 637 if (!autocompleteList) return; 638 autocompleteList.innerHTML = ''; 639 640 for (var i = 0; i < data.suggestions.length; i++) { 641 let suggestion = data.suggestions[i]; 642 let entriesText = suggestion.entries == 1 || suggestion.entries == 0 ? suggestion.secondary : suggestion.secondary + ' (' + suggestion.entries + " more entries)"; 643 644 let dvOption = document.createElement('div'); 645 dvOption.className = 'dvOption'; 646 647 let streetLineSpan = document.createElement('span'); 648 streetLineSpan.className = 'streetLine'; 649 streetLineSpan.textContent = suggestion.street_line + ' ' + entriesText; 650 streetLineSpan.setAttribute('street_line', suggestion.street_line); 651 streetLineSpan.setAttribute('secondary', suggestion.secondary); 652 streetLineSpan.setAttribute('entries', suggestion.entries); 653 streetLineSpan.setAttribute('city', suggestion.city); 654 streetLineSpan.setAttribute('state', suggestion.state); 655 streetLineSpan.setAttribute('zip', suggestion.zipcode); 656 657 let cityStateZipSpan = document.createElement('span'); 658 cityStateZipSpan.textContent = suggestion.city + ', ' + suggestion.state + ' ' + suggestion.zipcode; 659 660 dvOption.app
660endChild(streetLineSpan); 661 dvOption.appendChild(document.createElement('br')); 662 dvOption.appendChild(cityStateZipSpan); 663 664 autocompleteList.appendChild(dvOption); 665 } 666 }); 667 } else { 668 if (list) list.innerHTML = ''; 669 var errAddr = $form.querySelector("#errorAddress"); 670 if (errAddr) errAddr.style.display = 'block'; 671 if (btn) btn.classList.add("cmp-button__disabled"); 672 } 673 } 674 675 function bindAutoSuggestionData(event) { 676 var selected = ''; 677 var $form = this.closest("form"); 678 validateAddressSmartyStreets($form, selected); 679 } 680 681 function ValidateAddressAfterFocusOut() { 682 var partialAddress = document.getElementById("txtAddress") ? document.getElementById("txtAddress").value : ''; 683 var $form = this.closest("form"); 684 var addrInput = $form.querySelector(".txtAddress"); 685 var icon = addrInput ? addrInput.closest(".addressIcon") : null; 686 687 if (icon) { 688 icon.classList.remove("default", "typing", "error", "success"); 689 } 690 691 var isAddressValidationChecked = $form.getAttribute("data-addressvalidation"); 692 var errAddr = document.getElementById("errorAddress"); 693 var btn = $form.querySelector(".button"); 694 695 if (isAddressValidationChecked && isAddressValidationChecked.toLowerCase() === "true") { 696 if (partialAddress && partialAddress != '') { 697 if (icon) icon.classList.add("error"); 698 if (errAddr) errAddr.style.display = 'block'; 699 700 if (partialAddress.length > 0) { 701 var lastFiveCharAddress = partialAddress.slice(-5); 702 if (window.zipcodes && window.zipcodes.length > 0) { 703 if (window.zipcodes.indexOf(lastFiveCharAddress) != -1) { 704 if (icon) icon.classList.add("success"); 705 if (errAddr) errAddr.style.display = 'block'; 706 } 707 else { 708 if (errAddr) { 709 errAddr.style.display = 'block'; 710 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 711 } 712 if (btn) btn.classList.add("cmp-button__disabled"); 713 if (icon) icon.classList.add("error"); 714 } 715 } 716 } else { 717 if (errAddr) { 718 errAddr.style.display = 'block'; 719 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 720 } 721 if (btn) btn.classList.add("cmp-button__disabled"); 722 if (icon) icon.classList.add("error"); 723 } 724 } else { 725 if (icon) icon.classList.add("error"); 726 if (errAddr) { 727 errAddr.style.display = 'block'; 728 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 729 } 730 var genesisSiteId = $form.getAttribute("data-site"); 731 addErrorToDataLayer("Enter Valid Address", genesisSiteId); 732 if (btn) btn.classList.add("cmp-button__disabled"); 733 } 734 } 735 else { 736 if (partialAddress && partialAddress != '') { 737 if (partialAddress.length > 0) { 738 if (errAddr) errAddr.style.display = 'none'; 739 if (btn) btn.classList.remove("cmp-button__disabled"); 740 } 741 else { 742 if (errAddr) { 743 errAddr.style.display = 'block'; 744 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 745 } 746 if (btn) btn.classList.add("cmp-button__disabled"); 747 } 748 } 749 else { 750 if (errAddr) { 751 errAddr.style.display = 'block'; 752 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 753 } 754 if (btn) btn.classList.add("cmp-button__disabled"); 755 } 756 } 757 } 758 759 function bindValueInTextBox(event) { 760 var option = event.currentTarget; 761 var $form = option.closest("form"); 762 var span = option.querySelector('span'); 763 var zip = span.getAttribute('zip'); 764 var isAddressValidationChecked = $form.getAttribute("data-addressvalidation"); 765 var errAddr = document.getElementById("errorAddress"); 766 if (errAddr) errAddr.style.display = 'none'; 767 768 var btn = $form.querySelector(".button"); 769 var addrInput = $form.querySelector(".txtAddress"); 770 var icon = addrInput ? addrInput.closest(".addressIcon") : null; 771 772 if (isAddressValidationChecked && isAddressValidationChecked.toLowerCase() === "true") { 773 if (window.zipcodes && window.zipcodes.length > 0) { 774 if (window.zipcodes.indexOf(zip) != -1) { 775 if (btn) btn.classList.remove("cmp-button__disabled"); 776 if (icon) icon.classList.add("success"); 777 } 778 else { 779 if (errAddr) { 780 errAddr.style.display = 'block'; 781 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 782 } 783 if (btn) btn.classList.add("cmp-button__disabled"); 784 if (icon) icon.classList.add("error"); 785 } 786 } 787 } 788 var streetLine = span.getAttribute('street_line'); 789 var city = span.getAttribute('city'); 790 var state = span.getAttribute('state'); 791 var entries = span.getAttribute('entries'); 792 var secondary = span.getAttribute('secondary'); 793 addressObject = { 794 streetLine, city, state, secondary 795 } 796 if (entries.length > 0) { 797 let entry = parseInt(entries); 798 if (entry > 1) { 799 let newSearch = streetLine + ' ' + secondary; 800 addrInput.value = newSearch; 801 var list = $form.querySelector("#myInputautocomplete-list"); 802 if (list) list.style.display = 'none'; 803 let selected = streetLine + ' ' + secondary + ' ' + '(' + entries + ')' + ' ' + city + ' ' + state
803+ ' ' + zip; 804 validateAddressSmartyStreets($form, selected); 805 if (window.zipcodes && window.zipcodes.length > 0) { 806 if (window.zipcodes.indexOf(zip) != -1) { 807 if (btn) btn.classList.remove("cmp-button__disabled"); 808 if (icon) icon.classList.add("success"); 809 } 810 else { 811 if (errAddr) { 812 errAddr.style.display = 'block'; 813 errAddr.innerHTML = Granite.I18n.get("Enter Valid Address."); 814 } 815 if (btn) btn.classList.add("cmp-button__disabled"); 816 if (icon) icon.classList.add("error"); 817 } 818 } 819 } else { 820 let secondaryAddress; 821 if (secondary.length > 0) { 822 secondaryAddress = streetLine + ', ' + secondary + ', ' + city + ', ' + state + ', ' + zip 823 } else { 824 secondaryAddress = streetLine + ', ' + city + ', ' + state + ', ' + zip 825 } 826 addrInput.value = secondaryAddress; 827 var list = $form.querySelector("#myInputautocomplete-list"); 828 if (list) list.style.display = 'none'; 829 } 830 } 831 } 832 833 function fromSessionStorage(key) { 834 let value = sessionStorage.getItem(key); 835 if (!value) { 836 value = ''; 837 } 838 return value; 839 } 840 841 function getAddressExceptZipFromSessionStorage() { 842 const addressFields = ['address', 'address2', 'city', 'state']; 843 return addressFields.map(field => fromSessionStorage(field)).filter(field => field != '').join(', '); 844 } 845 846 function storeAdressToOmnisend(event) { 847 event.preventDefault(); 848 var $form = this.closest("form"); 849 var formIdIndex = rowNum++; 850 851 var endpointEl = Array.from($form.parentElement.children).find(el => el.classList.contains('endpoint')); 852 var actionurl = endpointEl ? endpointEl.getAttribute('data-path') : ''; 853 var siteId = endpointEl ? endpointEl.getAttribute('data-site') : ''; 854 855 var emailId = sessionStorage.getItem("email"); 856 var address = getAddressExceptZipFromSessionStorage(); 857 var zipCode = sessionStorage.getItem("zip"); 858 859 var anchorBtn = $form.querySelector(".button > a"); 860 var href = anchorBtn ? anchorBtn.getAttribute("href") : ''; 861 862 $form.setAttribute("id", "leadgenform_" + formIdIndex); 863 864 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'block'); 865 866 fetch(actionurl, { 867 method: "POST", 868 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 869 body: new URLSearchParams({ 870 email: emailId, 871 zip: zipCode, 872 address: address, 873 site: siteId, 874 }) 875 }) 876 .then(res => res.json()) 877 .then(response => { 878 if (response && response.status) { 879 if (response.status == "success") { 880 window.location.href = href; 881 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 882 } 883 } 884 }) 885 .catch(err => { 886 var errEl = $form.querySelector(".errormsg"); 887 if (errEl) errEl.style.display = 'block'; 888 showError("xhr"); 889 document.querySelectorAll('.loading-spinner').forEach(el => el.style.display = 'none'); 890 }); 891 } 892 893 function checkFormButtonDisabled() { 894 document.querySelectorAll(".leadgenform").forEach(function (form) { 895 var emailExists = form.querySelector(".txtEmail"); 896 var zipExists = form.querySelector(".txtZipCode"); 897 var phoneExists = form.querySelector(".phoneNumber"); 898 var addressExists = form.querySelector(".txtAddress"); 899 900 var btn = form.querySelector(".button"); 901 if (emailExists || zipExists || phoneExists || addressExists) { 902 if (btn) btn.classList.add("cmp-button__disabled"); 903 } else { 904 if (btn) btn.classList.remove("cmp-button__disabled"); 905 } 906 }) 907 } 908 909 checkFormButtonDisabled(); 910 911 // Event bindings 912 document.querySelectorAll(".txtEmail").forEach(el => { 913 ["keypress", "keydown", "keyup"].forEach(evt => el.addEventListener(evt, ValidateEmail)); 914 el.addEventListener("focusout", ValidateEmailAfterFocusOut); 915 }); 916 917 document.querySelectorAll(".txtZipCode").forEach(el => { 918 ["keypress", "keydown", "keyup"].forEach(evt => el.addEventListener(evt, ValidateZip)); 919 el.addEventListener("focusout", ValidateZipAfterFocusOut); 920 el.addEventListener("keydown", acceptOnlyNumbers); 921 }); 922 923 var qualBtn = document.querySelector("#leadgenQualificationform .button"); 924 if (qualBtn) qualBtn.addEventListener("click", goBackClick); 925 926 document.querySelectorAll(".phoneNumber").forEach(el => { 927 ["keypress", "keydown", "keyup"].forEach(evt => el.addEventListener(evt, validatePhone)); 928 el.addEventListener("focusout", ValidatePhoneAfterFocusOut); 929 }); 930 931 document.querySelectorAll(".txtAddress").forEach(el => { 932 el.addEventListener("keyup", bindAutoSuggestionData); 933 el.addEventListener("focusout", ValidateAddressAfterFocusOut); 934 }); 935 936 document.addEventListener("click", function(e) { 937 if (e.target.closest(".dvOption")) { 938 bindValueInTextBox(e); 939 } 940 }); 941 942 var genesisBtn2 = document.querySelector("#leadgengenesisform2 .address-form-button"); 943 if (genesisBtn2) genesisBtn2.addEventListener("click", storeAdressToOmnisend); 944 945 var rootEl = document.querySelector('.root'); 946 if (rootEl) { 947 rootEl.insertAdjacentHTML('afterend', "<div class='loading-spinner'><div class='loading-container animation-2'> <div class='shape shape1'></div> <div class='shape shape2'></div> <div class='shape shape3'></div> <div class='shape shape4'></div> </div></div>"); 948 } 949 950 /*** START: Leadgen form Bottom Margin Tablet/Mobile/Desktop ***/ 951 const handleMargins = function () { 952 const screenWidth = window.innerWidth; 953 function removeMargin() { 954 document.querySelectorAll('.leadgengenesis .formsgenesis, .leadgen .formsboost').forEach(function (el) { 955 const classes = [ 956 'cmp-leadgen__margin-bottom-0', 'cmp-leadgen__margin-bottom-2', 'cmp-leadgen__margin-bottom-4', 957 'cmp-leadgen__margin-bottom-8', 'cmp-leadgen__margin-bottom-16', 'cmp-leadgen__margin-bottom-32', 958 'cmp-leadgen__margin-bottom-64', 'cmp-leadgen__margin-bottom-128' 959 ];
960 classes.forEach(c => el.classList.remove(c)); 961 }); 962 } 963 removeMargin(); 964 if (screenWidth < 768) { 965 document.querySelectorAll('[data-leadgen-margin-mobile]').forEach(el => el.classList.add(el.getAttribute("data-leadgen-margin-mobile"))); 966 } else if (screenWidth >= 768 && screenWidth <= 1023) { 967 document.querySelectorAll('[data-leadgen-margin-tablet]').forEach(el => el.classList.add(el.getAttribute("data-leadgen-margin-tablet"))); 968 } else { 969 document.querySelectorAll('[data-leadgen-margin-desktop]').forEach(el => el.classList.add(el.getAttribute("data-leadgen-margin-desktop"))); 970 } 971 }; 972 window.addEventListener("load", handleMargins); 973 window.addEventListener("resize", handleMargins); 974 /*** END: Leadgen form Bottom Margin Tablet/Mobile/Desktop ***/ 975 976 //form button binding 977 document.querySelectorAll('.leadgenform').forEach(function(form) { 978 var cmpBtn = form.querySelector(".button .cmp-button"); 979 if (cmpBtn) { 980 cmpBtn.addEventListener("click", function (event) { 981 clickedButton = form; 982 event.preventDefault(); 983 submitClick(); 984 }); 985 } 986 }); 987} 988 989// Wrapper to handle document ready 990if (document.readyState !== "loading") { 991 onDocumentReady(); 992} else { 993 document.addEventListener("DOMContentLoaded", onDocumentReady); 994}
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.