(function () { let isPreOwned; document.addEventListener("DOMContentLoaded", function () { let scriptTag = document.currentScript || [...document.querySelectorAll("script")].find(s => s.src.includes("embed.js")); if (!scriptTag) { console.error("SynergyConnect: Could not find the script tag."); return; } let scriptSrc = scriptTag.src; let baseUrl = new URL(scriptSrc).origin; // ✅ Extract embed token from URL params let urlParams = new URL(scriptSrc).searchParams; let embedToken = urlParams.get("token"); if (!embedToken) { console.error("SynergyConnect: No embed token provided."); return; } let customContainerSelector = scriptTag.getAttribute("data-container"); let customCss = scriptTag.getAttribute("data-css") || `${baseUrl}/css/embed.css?v=${new Date().getTime()}`; let formContainer = customContainerSelector ? document.querySelector(customContainerSelector) : document.querySelector("#synergy-form-container"); if (!formContainer) { formContainer = document.createElement("div"); formContainer.id = "synergy-form-container"; scriptTag.parentNode.insertBefore(formContainer, scriptTag); } let formUrl = `${baseUrl}/api/form/embed/${embedToken}`; let submitUrl = `${baseUrl}/api/form/submit/${embedToken}`; let recaptchaSiteKey = null; // Load CSS let linkTag = document.createElement("link"); linkTag.rel = "stylesheet"; linkTag.href = customCss; document.head.appendChild(linkTag); // Fetch Form & reCAPTCHA Site Key fetch(formUrl, { method: "GET", headers: { "Accept": "application/json" } }) .then(response => response.json()) .then(data => { if (!data.success) { console.error("SynergyConnect: Error fetching form.", data.error); SynergyForm.showErrorMessage(formContainer, data.error || "Access denied. This form cannot be loaded."); return; } let { html, form_type, is_preowned, secret, recaptcha_site_key } = data; isPreOwned = is_preowned; recaptchaSiteKey = recaptcha_site_key; // Insert HTML formContainer.innerHTML = html; // Check for form directly after insertion let formElement = formContainer.querySelector("form"); if (!formElement) { console.error("Form element not found after HTML insertion"); return; } console.log("SynergyConnect: Form detected successfully!"); formElement.setAttribute("data-secret", secret); // ✅ Extract Product Attributes for 'model_send_message' Form Type if (form_type === "model_send_message" || form_type === "model_appointment") { let productData = { product_name: formContainer.getAttribute("data-product-name") || "", product_description: formContainer.getAttribute("data-product-description") || "", product_url: formContainer.getAttribute("data-product-url") || "", product_sku: formContainer.getAttribute("data-product-sku") || "", product_image: formContainer.getAttribute("data-product-image") || "", product_message: formContainer.getAttribute("data-message") || "" }; // ✅ Add product attributes to form as hidden inputs Object.keys(productData).forEach(key => { if (productData[key]) { let input = document.createElement("input"); input.type = "hidden"; input.name = key; input.value = productData[key]; formElement.appendChild(input); } }); // ✅ Pre-fill Message Field if `data-message` is Provided if (productData.product_message) { let messageField = formElement.querySelector("[name='message']"); if (messageField) { messageField.value = productData.product_message; } } } // ✅ Load reCAPTCHA Script Dynamically if (recaptchaSiteKey) { let recaptchaScript = document.createElement("script"); recaptchaScript.src = `https://www.google.com/recaptcha/api.js?render=${recaptchaSiteKey}`; recaptchaScript.async = true; recaptchaScript.defer = true; recaptchaScript.onload = function () { SynergyForm.init(formElement, submitUrl, recaptchaSiteKey); }; document.head.appendChild(recaptchaScript); } else { console.warn("SynergyConnect: No reCAPTCHA key provided."); SynergyForm.init(formElement, submitUrl, null); } }) .catch(error => { console.error("SynergyConnect: Failed to load form:", error); SynergyForm.showErrorMessage(formContainer, "Failed to load the form. Please try again later."); }); window.SynergyForm = { init: function (formElement, submitUrl, siteKey) { let secureToken = formElement.getAttribute("data-secret"); let steps = formElement.querySelectorAll(".synergy-step"); if (steps.length > 0) { steps[0].classList.add("active"); } formElement.querySelectorAll(".synergy-next").forEach(button => { button.addEventListener("click", function () { let currentStep = this.closest(".synergy-step"); if (SynergyForm.validateStep(currentStep)) { SynergyForm.nextStep(formElement); } }); }); formElement.querySelectorAll(".synergy-prev").forEach(button => { button.addEventListener("click", function () { SynergyForm.prevStep(formElement); }); }); formElement.addEventListener("submit", function (event) { event.preventDefault(); SynergyForm.clearErrors(formElement); let activeStep = formElement.querySelector(".synergy-step.active"); if (!SynergyForm.validateStep(activeStep)) return; if (!siteKey) { console.error("SynergyConnect: reCAPTCHA site key is missing."); SynergyForm.showErrorMessage(formElement, "reCAPTCHA verification failed. Please try again."); return; } grecaptcha.ready(function () { grecaptcha.execute(siteKey, { action: 'submit' }).then(function (recaptchaToken) { let formData = new FormData(formElement); formData.append("secure_token", secureToken); formData.append("g-recaptcha-response", recaptchaToken); fetch(submitUrl, { method: "POST", body: formData, headers: { "Accept": "application/json" } }) .then(response => response.json()) .then(data => { if (data.success) { SynergyForm.showThankYou(formElement); // ✅ Trigger Tracking After Successful Submission if (typeof _satellite !== "undefined" && typeof _satellite.track === "function") { _satellite.track("contactForm"); console.log("Tracking event 'contactForm' triggered."); // ✅ Scroll to Thank You Section var extraScroll = (window.innerWidth < 991) ? 100 : 250; var thankYouElement = document.querySelector('.synergy-thank-you'); if (thankYouElement) { var topPos = thankYouElement.getBoundingClientRect().top + window.pageYOffset - extraScroll; window.scrollTo({ top: topPos, behavior: 'smooth' }); } //end of scrolling } else { console.warn("SynergyConnect: _satellite.track is not defined."); } } else { SynergyForm.showErrors(formElement, data.errors); } }) .catch(error => { console.error("SynergyConnect: Submission failed", error); alert("Error submitting form"); }); }); }); }); }, showErrorMessage: function (container, message) { container.innerHTML = `

${message}

`; }, nextStep: function (formElement) { let currentStep = formElement.querySelector(".synergy-step.active"); let nextStep = currentStep.nextElementSibling; if (nextStep && nextStep.classList.contains("synergy-step")) { currentStep.classList.remove("active"); nextStep.classList.add("active"); } }, prevStep: function (formElement) { let currentStep = formElement.querySelector(".synergy-step.active"); let prevStep = currentStep.previousElementSibling; if (prevStep && prevStep.classList.contains("synergy-step")) { currentStep.classList.remove("active"); prevStep.classList.add("active"); } }, validateStep: function (stepElement) { if (!stepElement) { console.error("SynergyConnect: No active step found."); return false; } let isValid = true; let requiredFields = { "message": "This is a required field.", "first_name": "Please enter your first name", "last_name": "Please enter your last name", "terms": "Please accept the terms and conditions" }; for (let fieldName in requiredFields) { let field = stepElement.querySelector(`[name="${fieldName}"]`); if (field) { let errorContainer = field.parentNode.querySelector(".synergy-error-message") || document.createElement("div"); errorContainer.className = "synergy-error-message"; field.parentNode.appendChild(errorContainer); let isEmpty = field.value.trim() === ""; if (field.type === "checkbox") { isEmpty = !field.checked; } if (isEmpty) { errorContainer.innerText = requiredFields[fieldName]; field.classList.add("synergy-input-error"); isValid = false; } else { errorContainer.innerText = ""; field.classList.remove("synergy-input-error"); } } } // Email/Phone validation (One must be required) let emailField = stepElement.querySelector("#email"); let phoneField = stepElement.querySelector("#phone"); if (stepElement.classList.contains("synergy-step") && emailField && phoneField) { let email = emailField.value.trim(); let phone = phoneField.value.trim(); if (!email && !phone) { SynergyForm.setFieldError(emailField, "Please include a valid email address and/or a phone number", true); SynergyForm.setFieldError(phoneField, "", false); isValid = false; } else { SynergyForm.setFieldError(emailField, "", false); SynergyForm.setFieldError(phoneField, "", false); } } return isValid; }, setFieldError: function (field, message, isError) { let errorContainer = field.parentNode.querySelector(".synergy-error-message"); if (!errorContainer) { errorContainer = document.createElement("div"); errorContainer.className = "synergy-error-message"; field.parentNode.appendChild(errorContainer); } if (isError) { errorContainer.innerText = message; field.classList.add("synergy-input-error"); } else { errorContainer.innerText = ""; field.classList.remove("synergy-input-error"); } }, clearErrors: function (formElement) { formElement.querySelectorAll(".synergy-error-message").forEach(error => (error.innerText = "")); formElement.querySelectorAll(".synergy-input-error").forEach(field => field.classList.remove("synergy-input-error")); }, showErrors: function (formElement, errors) { for (let key in errors) { let field = formElement.querySelector(`[name="${key}"]`); if (field) { SynergyForm.setFieldError(field, errors[key][0], true); } } }, showThankYou: function (formElement) { formElement.style.display = "none"; let thankYouElement = document.querySelector(".synergy-thank-you"); if (!thankYouElement) { console.error("SynergyConnect: Thank-you message element not found."); return; } thankYouElement.style.display = "block"; } }; }); })();