window.dataLayer = window.dataLayer || []; function norm(v) { return (v == null ? "" : String(v)).trim().toLowerCase(); } async function sha256Hex(str) { const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(str)); return Array.from(new Uint8Array(buf)) .map(b => b.toString(16).padStart(2, "0")) .join(""); } const HS_FIELDS = { first: "0-1/firstname", last: "0-1/lastname", email: "0-1/email", help: "0-1/how_did_you_hear_about_us___derris_", hear: "0-1/how_did_you_hear_about_us_", budget: "0-1/estimated_budget___" }; function getVal(scopeEl, name) { const el = scopeEl.querySelector(`[name="${CSS.escape(name)}"]`); return el ? el.value : ""; } function readFormFromScope(scopeEl) { return { first_name: norm(getVal(scopeEl, HS_FIELDS.first)), last_name: norm(getVal(scopeEl, HS_FIELDS.last)), email: norm(getVal(scopeEl, HS_FIELDS.email)), help: norm(getVal(scopeEl, HS_FIELDS.help)), hear: norm(getVal(scopeEl, HS_FIELDS.hear)), budget: norm(getVal(scopeEl, HS_FIELDS.budget)) }; } function pushDataLayer(payload) { window.dataLayer.push({ event: "hubspot_form_submission", form_type: payload.form_type || "", first_name: payload.first_name || "", last_name: payload.last_name || "", email: payload.email || "", email_hash: payload.email_hash || "", help: payload.help || "", hear: payload.hear || "", budget: payload.budget || "", page_url: window.location.href }); } function bindWrappers() { const wrappers = document.querySelectorAll(".hsfc-FormWrapper"); wrappers.forEach((wrapper) => { if (wrapper.__hsDlBound) return; wrapper.__hsDlBound = true; wrapper.__hsPending = null; wrapper.__hsPushed = false; wrapper.addEventListener("submit", async function (e) { const formEl = e.target && e.target.closest ? e.target.closest("form") : null; if (!formEl) return; const payload = readFormFromScope(formEl); payload.email_hash = payload.email ? await sha256Hex(payload.email) : ""; payload.form_type = "Contact"; wrapper.__hsPending = payload; }, true); const obs = new MutationObserver(function () { if (wrapper.__hsPushed) return; if (wrapper.querySelector(".hsfc-PostSubmit")) { const pending = wrapper.__hsPending; if (pending && (pending.email || pending.first_name || pending.last_name)) { pushDataLayer(pending); } wrapper.__hsPushed = true; obs.disconnect(); } }); obs.observe(wrapper, { childList: true, subtree: true }); }); } document.addEventListener("DOMContentLoaded", function () { bindWrappers(); setTimeout(bindWrappers, 1500); setTimeout(bindWrappers, 4000); });