MOST RECENT BLOGS
Grid View
List View
 


(function () { function findPropertyForm() { const forms = [ ...document.querySelectorAll('form.react-form-contents') ]; return forms.find(function (form) { const address = form.querySelector('fieldset.fields.address'); const phone = form.querySelector('input[name="fullPhone"]'); const email = form.querySelector('input[type="email"]'); const values = [ ...form.querySelectorAll('input[type="radio"]') ].map(function (radio) { return radio.value; }); return (!!address && !!phone && !!email && values.includes('Morning') && values.includes('Afternoon') && values.includes('Evening')); }); } function initCompetitiveBuilderForm() { const form = findPropertyForm(); if (!form) { return; } if (form.dataset.cbScopedOverlayReady === 'yes') { return; } const submit = form.querySelector('button[type="submit"], input[type="submit"]'); const firstName = form.querySelector('input[name="fname"]'); const lastName = form.querySelector('input[name="lname"]'); const phone = form.querySelector('input[name="fullPhone"]'); const email = form.querySelector('input[type="email"]'); const radios = [ ...form.querySelectorAll('input[type="radio"]') ]; const textarea = form.querySelector('textarea'); const addressGroup = form.querySelector('fieldset.fields.address'); if (!submit || !firstName || !lastName || !phone || !email || !addressGroup) { return; } const country = addressGroup.querySelector('select'); const addressInputs = [ ...addressGroup.querySelectorAll('input[type="text"]') ]; const street = addressInputs[0]; const address2 = addressInputs[1]; const city = addressInputs[2]; const state = addressInputs[3]; const zip = addressInputs[4]; if (!country || !street || !city || !state || !zip) { return; } const CBP_LEAD_WEBHOOK = 'https://script.google.com/macros/s/AKfycbwNzAJRH9ul7Q-XLRO1CJ8fF-Foyg394V2PI_tRNUHNCtWWFPNtw8JtxLyEGzOzZ1_TVA/exec'; let cbpLeadId = null; let cbpAddressFingerprint = ''; let cbpStartedSent = false; let cbpCompletedSent = false; let cbpStartPromise = Promise.resolve(); function cbpSendEvent(payload) { return fetch(CBP_LEAD_WEBHOOK, { method: 'POST', mode: 'no-cors', keepalive: true, headers: { 'Content-Type': 'text/plain;charset=utf-8' }, body: JSON.stringify(payload) }).catch(function (error) { console.warn('CBP lead tracking request failed:', error); }); } function cbpTrackStep1() { const values = { street: street.value.trim(), city: city.value.trim(), state: state.value.trim(), zip: zip.value.trim() }; const fingerprint = JSON.stringify(values).toLowerCase(); if (cbpAddressFingerprint !== fingerprint) { cbpLeadId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cbp-' + Date.now() + '-' + Math.random().toString(36).slice(2); cbpAddressFingerprint = fingerprint; cbpStartedSent = false; cbpCompletedSent = false; } if (cbpStartedSent) return; cbpStartedSent = true; cbpStartPromise = cbpSendEvent({ action: 'started', submissionId: cbpLeadId, street: values.street, city: values.city, state: values.state, zip: values.zip }); } function cbpTrackCompleted() { if (!cbpLeadId || !cbpStartedSent || cbpCompletedSent) return; cbpCompletedSent = true; const completedId = cbpLeadId; Promise.resolve(cbpStartPromise).then(function () { return cbpSendEvent({ action: 'completed', submissionId: completedId }); }); } const cbpNativeFormWrapper = form.closest('.form-wrapper') || form.parentElement; function cbpHasNativeSuccess() { if (!cbpNativeFormWrapper) return false; const confirmation = cbpNativeFormWrapper.querySelector('.form-submission-text, .form-submission-html, ' + '.form-submission-message, [data-form-success], .form-success'); if (!confirmation) return false; const style = window.getComputedStyle(confirmation); return style.display !== 'none' && style.visibility !== 'hidden' && confirmation.getClientRects().length > 0 && (confirmation.textContent || '').trim().length > 0; } let cbpCompletionWatch = null; let cbpCompletionTimeout = null; function cbpBeginCompletionWatch() { if (!cbpStartedSent || cbpCompletedSent || !cbpNativeFormWrapper) return; if (cbpCompletionWatch) cbpCompletionWatch.disconnect(); if (cbpCompletionTimeout) clearTimeout(cbpCompletionTimeout); function check() { if (!cbpHasNativeSuccess()) return; cbpTrackCompleted(); if (cbpCompletionWatch) { cbpCompletionWatch.disconnect(); cbpCompletionWatch = null; } if (cbpCompletionTimeout) { clearTimeout(cbpCompletionTimeout); cbpCompletionTimeout = null; } } cbpCompletionWatch = new MutationObserver(check); cbpCompletionWatch.observe(cbpNativeFormWrapper, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ['class', 'style'] }); cbpCompletionTimeout = setTimeout(function () { if (cbpCompletionWatch) cbpCompletionWatch.disconnect(); cbpCompletionWatch = null; cbpCompletionTimeout = null; }, 60000); check(); } function fieldWrapper(input) { if (!input) { return null; } return (input.closest('.field') || input.closest('.form-item') || input.closest('fieldset') || input.parentElement); } const countryWrap = fieldWrapper(country); const streetWrap = fieldWrapper(street); const address2Wrap = address2 ? fieldWrapper(address2) : null; const nameGroup = firstName.closest('fieldset'); const phoneGroup = phone.closest('fieldset'); const emailWrap = email.closest('.form-item'); const radioGroup = radios[0].closest('fieldset'); const textareaWrap = textarea ? textarea.closest('.form-item') : null; const submitWrap = submit.closest('.form-button-wrapper'); if (!nameGroup || !phoneGroup || !emailWrap || !radioGroup || !submitWrap) { return; } nameGroup.classList.add('cb-modal-name'); phoneGroup.classList.add('cb-modal-phone'); emailWrap.classList.add('cb-modal-email'); radioGroup.classList.add('cb-modal-radio'); function hide(el) { if (!el) return; el.style.setProperty('display', 'none', 'important'); } function showBlock(el) { if (!el) return; el.style.setProperty('display', 'block', 'important'); } function showFlex(el) { if (!el) return; el.style.setProperty('display', 'flex', 'important'); } function restoreDisplay(el) { if (!el) return; el.style.removeProperty('display'); } function setInvalid(input, invalid) { input.classList.toggle('cb-address-invalid', invalid); } street.required = true; city.required = true; state.required = true; zip.required = false; firstName.required = true; lastName.required = true; phone.required = true; email.required = true; phone.setAttribute('inputmode', 'tel'); phone.setAttribute('autocomplete', 'tel'); email.setAttribute('inputmode', 'email'); email.setAttribute('autocomplete', 'email'); const usa = [...country.options] .find(function (option) { return (option.value === 'US' || option.textContent .toLowerCase() .includes('united states')); }); if (usa) { country.value = usa.value; country.dispatchEvent(new Event('change', { bubbles: true })); } if (!state.value.trim()) { state.value = 'NJ'; state.dispatchEvent(new Event('input', { bubbles: true })); state.dispatchEvent(new Event('change', { bubbles: true })); } if (streetWrap) { const label = streetWrap.querySelector('label, .caption, .title'); if (label && label.textContent .toLowerCase() .includes('address line 1')) { label.textContent = 'Street Address'; } } const CB_GOOGLE_PLACES_API_KEY = 'AIzaSyDU-eV69AYKpwXMn_WDXE9-XgbcHRhHw_M'; function setNativeInputValue(input, value) { if (!input) return; const prototype = Object.getPrototypeOf(input); const descriptor = Object.getOwnPropertyDescriptor(prototype, 'value') || Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value'); if (descriptor && descriptor.set) { descriptor.set.call(input, value || ''); } else { input.value = value || ''; } input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); } function newGoogleSessionToken() { if (window.crypto && typeof window.crypto.randomUUID === 'function') { return window.crypto.randomUUID(); } return (Date.now().toString(36) + Math.random() .toString(36) .slice(2)).slice(0, 36); } function initGoogleAddressAutocomplete() { if (street.dataset.cbGoogleAutocompleteReady === 'yes') { return; } street.dataset.cbGoogleAutocompleteReady = 'yes'; if (!streetWrap) { return; } streetWrap.classList.add('cb-google-autocomplete-wrap'); form.querySelector('#cb-google-address-suggestions')?.remove(); const suggestionsBox = document.createElement('div'); suggestionsBox.id = 'cb-google-address-suggestions'; suggestionsBox.setAttribute('role', 'listbox'); streetWrap.appendChild(suggestionsBox); street.setAttribute('autocomplete', 'off'); let debounceTimer = null; let requestController = null; let latestRequest = 0; let sessionToken = null; let activeIndex = -1; let suggestions = []; let selectingSuggestion = false; function hideSuggestions() { suggestionsBox.classList.remove('cb-show'); suggestionsBox.replaceChildren(); suggestions = []; activeIndex = -1; } function updateActiveOption() { const options = [ ...suggestionsBox.querySelectorAll('.cb-google-address-option') ]; options.forEach(function (option, index) { option.classList.toggle('cb-active', index === activeIndex); }); } function componentByType(components, type) { return components.find(function (component) { return (Array.isArray(component.types) && component.types.includes(type)); }); } async function selectSuggestion(suggestion) { if (!suggestion || !suggestion.placeId) { return; } const selectedToken = sessionToken; selectingSuggestion = true; clearTimeout(debounceTimer); debounceTimer = null; if (requestController) { requestController.abort(); requestController = null; } latestRequest++; hideSuggestions(); try { let detailsUrl = 'https://places.googleapis.com/v1/places/' + encodeURIComponent(suggestion.placeId) + '?languageCode=en' + '®ionCode=us'; if (selectedToken) { detailsUrl += '&sessionToken=' + encodeURIComponent(selectedToken); } const response = await fetch(detailsUrl, { method: 'GET', headers: { 'X-Goog-Api-Key': CB_GOOGLE_PLACES_API_KEY, 'X-Goog-FieldMask': 'addressComponents' } }); if (!response.ok) { const errorText = await response.text(); throw new Error('Place Details failed (' + response.status + '): ' + errorText); } const place = await response.json(); const components = place.addressComponents || []; const streetNumber = componentByType(components, 'street_number'); const route = componentByType(components, 'route'); const premise = componentByType(components, 'premise'); const locality = componentByType(components, 'locality'); const postalTown = componentByType(components, 'postal_town'); const sublocality = componentByType(components, 'sublocality_level_1'); const county = componentByType(components, 'administrative_area_level_2'); const adminArea = componentByType(components, 'administrative_area_level_1'); const postalCode = componentByType(components, 'postal_code'); const postalSuffix = componentByType(components, 'postal_code_suffix'); const streetValue = [ streetNumber ? streetNumber.longText : '', route ? route.longText : '' ] .filter(Boolean) .join(' ') || (premise ? premise.longText : ''); const cityComponent = locality || postalTown || sublocality || county; const cityValue = cityComponent ? cityComponent.longText : ''; const stateValue = adminArea ? (adminArea.shortText || adminArea.longText || '') : ''; let zipValue = postalCode ? postalCode.longText : ''; if (zipValue && postalSuffix && postalSuffix.longText) { zipValue += '-' + postalSuffix.longText; } if (streetValue) { setNativeInputValue(street, streetValue); } if (cityValue) { setNativeInputValue(city, cityValue); } if (stateValue) { setNativeInputValue(state, stateValue); } if (zipValue) { setNativeInputValue(zip, zipValue); } [ street, city, state, zip ].forEach(function (input) { setInvalid(input, false); }); const step1Error = form.querySelector('#cb-real-step1-error'); if (step1Error) { step1Error.classList.remove('cb-show'); } sessionToken = null; console.log('Google address selected and native form fields filled ✓'); } catch (error) { console.error('Google address details error:', error); } finally { hideSuggestions(); selectingSuggestion = false; } } function renderSuggestions(rows) { suggestionsBox.replaceChildren(); suggestions = rows.slice(0, 5); activeIndex = -1; suggestions.forEach(function (suggestion, index) { const button = document.createElement('button'); button.type = 'button'; button.className = 'cb-google-address-option'; button.setAttribute('role', 'option'); const main = document.createElement('span'); main.className = 'cb-google-address-main'; main.textContent = suggestion.mainText || suggestion.fullText || ''; button.appendChild(main); if (suggestion.secondaryText) { const secondary = document.createElement('span'); secondary.className = 'cb-google-address-secondary'; secondary.textContent = suggestion.secondaryText; button.appendChild(secondary); } button.addEventListener('mousedown', function (event) { event.preventDefault(); }); button.addEventListener('click', function () { selectSuggestion(suggestions[index]); }); suggestionsBox.appendChild(button); }); if (suggestions.length) { const powered = document.createElement('div'); powered.className = 'cb-google-powered'; powered.textContent = 'Powered by Google'; suggestionsBox.appendChild(powered); suggestionsBox.classList.add('cb-show'); } else { hideSuggestions(); } } async function fetchSuggestions() { if (selectingSuggestion) { hideSuggestions(); return; } const query = street.value.trim(); if (query.length < 3) { hideSuggestions(); return; } if (!sessionToken) { sessionToken = newGoogleSessionToken(); } if (requestController) { requestController.abort(); } requestController = new AbortController(); const requestNumber = ++latestRequest; try { const response = await fetch('https://places.googleapis.com/v1/places:autocomplete', { method: 'POST', signal: requestController.signal, headers: { 'Content-Type': 'application/json', 'X-Goog-Api-Key': CB_GOOGLE_PLACES_API_KEY, 'X-Goog-FieldMask': 'suggestions.placePrediction.placeId,' + 'suggestions.placePrediction.text,' + 'suggestions.placePrediction.structuredFormat' }, body: JSON.stringify({ input: query, includedRegionCodes: [ 'us' ], languageCode: 'en', regionCode: 'us', sessionToken: sessionToken }) }); if (requestNumber !== latestRequest) { return; } if (!response.ok) { const errorText = await response.text(); throw new Error('Autocomplete failed (' + response.status + '): ' + errorText); } const data = await response.json(); const rows = (data.suggestions || []) .map(function (item) { const prediction = item.placePrediction; if (!prediction) { return null; } const structured = prediction.structuredFormat || {}; return { placeId: prediction.placeId, fullText: prediction.text && prediction.text.text ? prediction.text.text : '', mainText: structured.mainText && structured.mainText.text ? structured.mainText.text : (prediction.text && prediction.text.text ? prediction.text.text : ''), secondaryText: structured.secondaryText && structured.secondaryText.text ? structured.secondaryText.text : '' }; }) .filter(Boolean); renderSuggestions(rows); } catch (error) { if (error && error.name === 'AbortError') { return; } hideSuggestions(); console.error('Google address autocomplete error:', error); } } street.addEventListener('input', function () { clearTimeout(debounceTimer); if (selectingSuggestion) { debounceTimer = null; hideSuggestions(); return; } debounceTimer = setTimeout(fetchSuggestions, 250); }); street.addEventListener('keydown', function (event) { if (!suggestionsBox.classList.contains('cb-show')) { return; } if (event.key === 'ArrowDown') { event.preventDefault(); activeIndex = Math.min(activeIndex + 1, suggestions.length - 1); updateActiveOption(); } else if (event.key === 'ArrowUp') { event.preventDefault(); activeIndex = Math.max(activeIndex - 1, 0); updateActiveOption(); } else if (event.key === 'Enter' && activeIndex >= 0) { event.preventDefault(); selectSuggestion(suggestions[activeIndex]); } else if (event.key === 'Escape') { hideSuggestions(); } }); document.addEventListener('click', function (event) { if (!streetWrap.contains(event.target)) { hideSuggestions(); } }); console.log('Google Places address autocomplete initialized ✓'); } initGoogleAddressAutocomplete(); form.querySelector('#cb-real-heading')?.remove(); form.querySelector('#cb-real-next-wrap')?.remove(); form.querySelector('#cb-real-final-note')?.remove(); form.querySelector('#cb-step2-close')?.remove(); document.querySelector('#cb-step2-backdrop')?.remove(); const heading = document.createElement('div'); heading.id = 'cb-real-heading'; heading.innerHTML = `

SEE WHAT BUILDERS WILL PAY FOR YOUR PROPERTY

STEP 2 OF 2

ONE LAST STEP

WHAT'S YOUR PROPERTY ADDRESS?

`; const fieldList = form.querySelector('.field-list'); fieldList.insertBefore(heading, fieldList.firstChild); const nextWrap = document.createElement('div'); nextWrap.id = 'cb-real-next-wrap'; nextWrap.innerHTML = `
No pressure. No obligation.
Please enter your Street Address, City and State.
`; addressGroup .insertAdjacentElement('afterend', nextWrap); const nextButton = form.querySelector('#cb-real-next'); const nativeSubmitColor = window.getComputedStyle(submit).backgroundColor; if (nativeSubmitColor && nativeSubmitColor !== 'rgba(0, 0, 0, 0)') { nextButton.style.setProperty('background-color', nativeSubmitColor, 'important'); } const finalNote = document.createElement('div'); finalNote.id = 'cb-real-final-note'; finalNote.innerHTML = ` No pressure. No obligation. `; submitWrap.insertAdjacentElement('afterend', finalNote); const backdrop = document.createElement('div'); backdrop.id = 'cb-step2-backdrop'; backdrop.setAttribute('aria-hidden', 'true'); document.body.appendChild(backdrop); backdrop.addEventListener('click', function (e) { e.preventDefault(); }); const close = document.createElement('div'); close.id = 'cb-step2-close'; close.innerHTML = '×'; close.setAttribute('role', 'button'); close.setAttribute('tabindex', '0'); close.setAttribute('aria-label', 'Return to property address'); form.insertBefore(close, form.firstChild); if (submit.tagName === 'INPUT') { submit.value = 'SUBMIT'; } else { submit.textContent = 'SUBMIT'; } function applyModalSizing() { const vw = window.innerWidth; let cardWidth; let cardPadding; if (vw <= 600) { cardWidth = Math.max(300, vw - 18); cardPadding = '20px 16px 22px'; [phoneGroup, emailWrap] .forEach(function (el) { el.style.setProperty('width', '100%', 'important'); el.style.setProperty('max-width', '100%', 'important'); el.style.setProperty('flex', '0 0 100%', 'important'); }); nameGroup.style.setProperty('display', 'block', 'important'); submit.style.setProperty('width', Math.min(245, Math.max(210, vw - 100)) + 'px', 'important'); submit.style.setProperty('min-width', '0', 'important'); } else if (vw <= 900) { cardWidth = Math.min(640, vw - 30); cardPadding = '28px 30px 30px'; [phoneGroup, emailWrap] .forEach(function (el) { el.style.setProperty('width', 'calc(50% - 7px)', 'important'); el.style.setProperty('max-width', 'calc(50% - 7px)', 'important'); el.style.setProperty('flex', '0 0 calc(50% - 7px)', 'important'); }); nameGroup.style.setProperty('display', 'flex', 'important'); submit.style.setProperty('width', '290px', 'important'); submit.style.setProperty('min-width', '0', 'important'); } else { cardWidth = Math.min(780, vw - 48); cardPadding = '30px 42px 34px'; [phoneGroup, emailWrap] .forEach(function (el) { el.style.setProperty('width', 'calc(50% - 7px)', 'important'); el.style.setProperty('max-width', 'calc(50% - 7px)', 'important'); el.style.setProperty('flex', '0 0 calc(50% - 7px)', 'important'); }); nameGroup.style.setProperty('display', 'flex', 'important'); submit.style.setProperty('width', '320px', 'important'); submit.style.setProperty('min-width', '0', 'important'); } form.style.setProperty('width', cardWidth + 'px', 'important'); form.style.setProperty('max-width', cardWidth + 'px', 'important'); form.style.setProperty('padding', cardPadding, 'important'); form.style.setProperty('max-height', 'calc(100dvh - 20px)', 'important'); submitWrap.style.setProperty('display', 'block', 'important'); submitWrap.style.setProperty('width', '100%', 'important'); submitWrap.style.setProperty('max-width', '100%', 'important'); submitWrap.style.setProperty('margin', vw <= 600 ? '18px auto 0' : '23px auto 0', 'important'); submitWrap.style.setProperty('padding', '0', 'important'); submitWrap.style.setProperty('text-align', 'center', 'important'); submit.style.setProperty('display', 'inline-flex', 'important'); submit.style.setProperty('align-items', 'center', 'important'); submit.style.setProperty('justify-content', 'center', 'important'); submit.style.setProperty('height', vw <= 600 ? '42px' : '46px', 'important'); submit.style.setProperty('margin', '0 auto', 'important'); submit.style.setProperty('font-weight', '800', 'important'); submit.style.setProperty('font-size', vw <= 600 ? '11.5px' : '13px', 'important'); submit.style.setProperty('letter-spacing', '.75px', 'important'); finalNote.style.setProperty('display', 'flex', 'important'); finalNote.style.setProperty('margin', window.innerWidth <= 600 ? '9px auto 0' : '10px auto 0', 'important'); } function removeModalShell() { document.documentElement .classList.remove('cb-step2-modal-open'); document.body .classList.remove('cb-step2-modal-open'); form.classList.remove('cb-step2-modal'); backdrop.setAttribute('aria-hidden', 'true'); form.removeAttribute('role'); form.removeAttribute('aria-modal'); form.removeAttribute('tabindex'); form.style.removeProperty('width'); form.style.removeProperty('max-width'); form.style.removeProperty('max-height'); form.style.removeProperty('padding'); document.documentElement.style .removeProperty('overflow'); document.body.style .removeProperty('overflow'); } function showStep1() { removeModalShell(); restoreDisplay(addressGroup); hide(countryWrap); hide(address2Wrap); hide(nameGroup); hide(phoneGroup); hide(emailWrap); hide(radioGroup); hide(textareaWrap); hide(submitWrap); hide(finalNote); showBlock(nextWrap); const mainTitle = form.querySelector('#cb-real-main-title'); mainTitle.style.display = 'block'; form.querySelector('#cb-real-heading-title').textContent = "WHAT'S YOUR PROPERTY ADDRESS?"; const subtitle = form.querySelector('#cb-real-heading-subtitle'); subtitle.textContent = ''; subtitle.style.display = 'none'; } function showStep2() { hide(addressGroup); hide(nextWrap); if (window.innerWidth <= 600) { showBlock(nameGroup); } else { showFlex(nameGroup); } showBlock(phoneGroup); showBlock(emailWrap); showBlock(radioGroup); hide(textareaWrap); showBlock(submitWrap); showFlex(finalNote); form.classList.add('cb-step2-modal'); document.documentElement .classList.add('cb-step2-modal-open'); document.body .classList.add('cb-step2-modal-open'); backdrop.setAttribute('aria-hidden', 'false'); form.setAttribute('role', 'dialog'); form.setAttribute('aria-modal', 'true'); applyModalSizing(); form.setAttribute('tabindex', '-1'); requestAnimationFrame(function () { try { form.focus({ preventScroll: true }); } catch (e) { form.focus(); } }); } function validateStep1() { const required = [ street, city, state ]; let valid = true; let firstBad = null; [ street, city, state, zip ].forEach(function (input) { input.dispatchEvent(new Event('change', { bubbles: true })); input.dispatchEvent(new Event('blur', { bubbles: true })); }); required.forEach(function (input) { setInvalid(input, false); if (!input.value.trim() || !input.checkValidity()) { valid = false; setInvalid(input, true); if (!firstBad) { firstBad = input; } } }); setInvalid(zip, false); if (zip.value.trim() && !zip.checkValidity()) { valid = false; setInvalid(zip, true); if (!firstBad) { firstBad = zip; } } const error = form.querySelector('#cb-real-step1-error'); error.classList.toggle('cb-show', !valid); if (!valid && firstBad) { firstBad .reportValidity(); firstBad .focus(); } return valid; } let submissionStarted = false; let successWatcher = null; let successPoll = null; function submissionSucceeded() { if (!document.body.contains(form)) { return true; } const formStyle = window.getComputedStyle(form); if (formStyle.display === 'none' || formStyle.visibility === 'hidden') { return true; } const wrapper = form.closest('.form-wrapper') || form.parentElement; if (!wrapper) { return false; } const explicitSuccess = wrapper.querySelector('.form-submission-text,' + '.form-submission-html,' + '.form-submission-message,' + '[data-form-success],' + '.form-success'); if (explicitSuccess && window.getComputedStyle(explicitSuccess).display !== 'none') { return true; } const wrapperText = (wrapper.innerText || wrapper.textContent || '') .replace(/\s+/g, ' ') .trim() .toLowerCase(); if (wrapperText.includes('thank you')) { return true; } return false; } function finishSuccessfulSubmission() { if (!submissionStarted) { return; } if (!submissionSucceeded()) { return; } submissionStarted = false; removeModalShell(); backdrop.style.setProperty('opacity', '0', 'important'); backdrop.style.setProperty('visibility', 'hidden', 'important'); backdrop.style.setProperty('pointer-events', 'none', 'important'); if (successPoll) { clearInterval(successPoll); successPoll = null; } if (successWatcher) { successWatcher .disconnect(); successWatcher = null; } console.log('Form submitted — overlay cleared ✓'); } function beginSuccessWatch() { submissionStarted = true; const watchTarget = form.closest('.form-wrapper') || form.parentElement || document.body; successWatcher = new MutationObserver(function () { finishSuccessfulSubmission(); }); successWatcher.observe(watchTarget, { childList: true, subtree: true, attributes: true, attributeFilter: [ 'class', 'style' ] }); successPoll = setInterval(finishSuccessfulSubmission, 150); setTimeout(function () { if (successPoll) { clearInterval(successPoll); successPoll = null; } if (successWatcher) { successWatcher .disconnect(); successWatcher = null; } }, 30000); } nextButton.addEventListener('click', function () { if (!validateStep1()) { return; } cbpTrackStep1(); showStep2(); }); close.addEventListener('click', showStep1); close.addEventListener('keydown', function (event) { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); showStep1(); } }); document.addEventListener('keydown', function (event) { if (event.key === 'Escape' && form.classList.contains('cb-step2-modal')) { showStep1(); } }); window.addEventListener('resize', function () { if (form.classList.contains('cb-step2-modal')) { applyModalSizing(); } }); form.addEventListener('submit', function () { beginSuccessWatch(); cbpBeginCompletionWatch(); }); [ street, city, state, zip ].forEach(function (input) { input.addEventListener('input', function () { setInvalid(input, false); }); }); showStep1(); form.dataset.cbScopedOverlayReady = 'yes'; console.log('Competitive Builder final form initialized ✓', form); } let cbBootFramePending = false; function tryInitialize() { try { initCompetitiveBuilderForm(); } catch (error) { console.error('CBP form initialization error:', error); } } function startBoot() { if (!document.body) { document.addEventListener('DOMContentLoaded', startBoot, { once: true }); return; } tryInitialize(); [100, 300, 700, 1400, 3000, 6000].forEach(function (delay) { window.setTimeout(tryInitialize, delay); }); const bootObserver = new MutationObserver(function () { if (cbBootFramePending) return; cbBootFramePending = true; requestAnimationFrame(function () { cbBootFramePending = false; tryInitialize(); }); }); bootObserver.observe(document.body, { childList: true, subtree: true }); } if (document.body) { startBoot(); } else { document.addEventListener('DOMContentLoaded', startBoot, { once: true }); } })();