function init({ region = "na1", portalId, formId, warper, css = null, validator = [] }) { var passList = {}; const validation = { '18_plus_validation': { message: "Age should need to greater than or equal to 18 years", event: "input", callback: ((object, validation, validator) => { date = object.value; var today = new Date(); var birthDate = new Date(Date.parse(date.replace(/(\d{2})\/(\d{2})\/(\d{4})/, '$2/$1/$3'))); var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth(); if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { age--; } if (age >= 21 && age <= 120) { passList[object.id] = true; addError(object, "") } else { passList[object.id] = false; addError(object, validator.message ?? validation.message) } }) }, '90_21_between_validation': { message: "Age should need be between 21 - 90", event: "input", callback: ((object, validation, validator) => { date = object.value; var today = new Date(); var birthDate = new Date(Date.parse(date.replace(/(\d{2})\/(\d{2})\/(\d{4})/, '$2/$1/$3'))); var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth(); if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { age--; } if (age >= 21 && age <= 90) { passList[object.id] = true; addError(object, "") } else { passList[object.id] = false; addError(object, validator.message ?? validation.message) } }) }, 'firstname_validation': { message: "Name should not contain special character", event: "input", callback: ((object, validation, validator) => { firstname = object.value; if (firstname.length <= 0) { passList[object.id] = true; addError(object, "") return; } const specialCharRegex = /[^A-Za-z ]/g; if (!specialCharRegex.test(firstname)) { passList[object.id] = true; addError(object, "") } else { passList[object.id] = false; addError(object, validator.message ?? validation.message) } }) }, 'no_plus_email_validation': { message: "Please enter valid email, (Email should not include + sign)", event: "input", callback: ((object, validation, validator) => { email = object.value; if (email.length <= 0) { passList[object.id] = true; addError(object, "") return; } const plusSignRegex = /\+/; if (!plusSignRegex.test(email)) { passList[object.id] = true; addError(object, "") } else { passList[object.id] = false; addError(object, validator.message ?? validation.message) } }) } } const customForm = document.getElementById(warper); if (portalId == null | undefined) { throw Error('hubspot portal id is required') } if (formId == null | undefined) { throw Error('form id is required') } if (warper == null | undefined) { throw Error('warper element id is required') } const isAllValidationsOk = (() => { var validationSuccess = true; for (const [key, value] of Object.entries(passList)) { if (!value) { showError(key); validationSuccess = false; } } return validationSuccess; }) const onFormReady = (() => { customForm.querySelector("[type='submit']").addEventListener("click", function (event) { if (!isAllValidationsOk()) { event.preventDefault() } }, false); validator.forEach(element => { element['object'] = document.getElementById(element.element_id + "-" + formId) passList[element.element_id + "-" + formId] = element.is_validation_pass ?? false, setupListeners(element) }); }) const onFormSubmitted = (() => { }) const onBeforeFormSubmit = (() => { }) function showError(elementId) { for (const [key, value] of Object.entries(validator)) { if (value['object'].id == elementId) { addError(value['object'], value.message ?? validation[value.type].message) } else { addError(value['object'], "") } } } function setupListeners(element) { const observer = new MutationObserver(() => { validation[element.type].callback(element.object, validation[element.type], element) }); observer.observe(element.object, { attributes: true, attributeFilter: ['value'] }); } function addError(ele, error) { var errorUl = ele.parentElement.parentElement.querySelector('.no-list.hs-error-msgs.inputs-list') if (errorUl == null) { errorUl = document.createElement("ul") errorUl.setAttribute('class', "no-list hs-error-msgs inputs-list") errorUl.setAttribute('role', "alert") } errorUl.innerHTML = ""; const errorLi = document.createElement("li") const errorLabel = document.createElement("label") errorLabel.setAttribute('class', "hs-error-msg hs-main-font-element") errorLabel.innerHTML = error; errorLi.append(errorLabel); errorUl.append(errorLi); ele.parentElement.parentElement.appendChild(errorUl); } hbspt.forms.create({ region: region, portalId: portalId, formId: formId, target: "#" + warper, onFormReady: onFormReady, onFormSubmitted: onFormSubmitted, onBeforeFormSubmit: onBeforeFormSubmit, css: css }); }