PageSourceSearch

https://www.boostmobile.com/etc.clientlibs/dopweb/clientlibs/clientlib-leadgenform-boost.min.js

js boostmobile.com collected 2026-10-01 10:24:30 UTC 44,716 bytes, 994 lines download raw bytes

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.