{"version":3,"file":"dataLayerHelper.min.js","sources":["../src/linkTracking.js","../src/helpers/helpers.js","../src/gravityForms.js","../src/postEventToParent.js","../src/index.js"],"sourcesContent":["/**\n * Helper Functions\n */\nfunction initLinkTracking() {\n const trackElements = document.querySelectorAll(`a:not(#wv-authnav a)`);\n trackElements.forEach(addTracking);\n\n function addTracking(ele) {\n let nodeName = ele.nodeName;\n if (nodeName === \"A\") {\n // Get Type, Style, Text\n let { eleType, eleDescription, eleTarget } = getElementInfo(ele);\n\n !ele.hasAttribute(\"data-link-type\") &&\n ele.setAttribute(\"data-link-type\", eleType);\n !ele.hasAttribute(\"data-link-target\") &&\n ele.setAttribute(\"data-link-target\", eleTarget);\n !ele.hasAttribute(\"data-link-info\") &&\n ele.setAttribute(\"data-link-info\", eleDescription);\n }\n }\n\n function getElementInfo(ele) {\n let eleType = getElType(ele); //default\n let eleTarget = getElTarget(ele);\n let eleDescription = getElDescription(ele);\n\n return { eleType, eleTarget, eleDescription };\n }\n\n function getElTarget(ele) {\n return ele?.href.includes(\"worldvision.org\") || ele?.href[0] == \"#\"\n ? \"internal_link\"\n : \"outbound_link\";\n }\n\n function getElDescription(ele) {\n // :'{click_text|image}:{destination_url}'\n let { hasIcon, hasImage, imgAlt } = getChildNodesInfo(ele);\n\n let eleInfo = ele.text.trim().length\n ? ele.text\n : hasImage\n ? imgAlt || \"image\"\n : hasIcon\n ? \"icon\"\n : \"\";\n\n let eleHref = ele?.href.includes(\"https\")\n ? ele?.href.slice(8)\n : ele?.href.includes(\"http\")\n ? ele?.href.slice(7)\n : \"#\";\n\n return `${eleInfo.replace(/\\s+/g, \" \").trim()}:${eleHref}`;\n }\n\n function getChildNodesInfo(ele) {\n const childNodes = ele.childNodes;\n let hasIcon = false;\n let hasImage = false;\n let imgAlt = \"\";\n\n childNodes.forEach((node) => {\n if (node.nodeName == \"I\") {\n hasIcon = true;\n }\n if (node.nodeName == \"IMG\") {\n hasImage = true;\n imgAlt = node.alt || \"\";\n }\n });\n\n return { hasImage, imgAlt, hasIcon };\n }\n\n function getElType(ele) {\n let eleType = \"text\";\n const eleClassValue = ele.getAttributeNode(\"class\")?.value || \"\";\n const eleDataSet = ele.dataset;\n\n let { hasIcon, hasImage } = getChildNodesInfo(ele);\n\n if (eleClassValue.includes(\"btn\")) {\n eleType = \"button\";\n } else if (\n eleClassValue.includes(\"fa-plus\") ||\n eleClassValue.includes(\"fa-minus\") ||\n eleClassValue.includes(\"vc_toggle_icon\")\n ) {\n eleType = \"collapsible\";\n } else if (\n eleDataSet.hasOwnProperty(\"vcTabs\") ||\n eleClassValue.includes(\"toggle\")\n ) {\n eleType = \"tab\";\n } else if (hasIcon) {\n eleType = \"icon\";\n } else if (hasImage) {\n eleType = \"image\";\n }\n\n return eleType;\n }\n}\n\nexport default initLinkTracking;","const triggerCustomEvent = (eventData, eventName) => {\n const event = new CustomEvent(eventName, {\n detail: eventData,\n });\n document.dispatchEvent(event);\n};\n\nconst setSessionVar = (varName, data) => {\n // Save data to sessionStorage\n sessionStorage.setItem(varName, JSON.stringify(data));\n};\n\nconst removeSessionVar = (varName) => {\n sessionStorage.removeItem(varName);\n};\n\nconst getSessionVar = (varName) => {\n try {\n const data = sessionStorage.getItem(varName);\n return JSON.parse(data) || {};\n } catch (err) {\n return {};\n }\n};\n\nasync function sha256(message) {\n\t// encode as UTF-8\n\tconst msgBuffer = new TextEncoder().encode(message);\n\n\t// hash the message\n\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", msgBuffer);\n\n\t// convert ArrayBuffer to Array\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer));\n\n\t// convert bytes to hex string \n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n\treturn hashHex;\n}\n\nasync function toEhashAsync(email) {\n\tif (!email || typeof email !== \"string\") {\n\t\treturn Promise.resolve(\"\");\n\t}\n\n\treturn sha256(email.toLowerCase());\n}\n\nexport { triggerCustomEvent, setSessionVar, removeSessionVar, getSessionVar, toEhashAsync };\n","import {\n triggerCustomEvent,\n setSessionVar,\n removeSessionVar,\n getSessionVar,\n} from \"./helpers/helpers\";\n\nconst handleGravityFormEvent = (data) => {\n const { event, form_id, form_title } = data;\n\n let dataLayerEventData = {\n event_label: `${form_id}:${form_title}`,\n form_id,\n form_name: form_title,\n form_title,\n };\n\n switch (event) {\n case \"form_view\":\n dataLayerEventData = {\n ...dataLayerEventData,\n form_action: \"form_view\",\n };\n triggerCustomEvent(dataLayerEventData, \"gf_view_event\");\n break;\n\n case \"form_start\":\n dataLayerEventData = {\n ...dataLayerEventData,\n form_action: \"form_start\",\n };\n triggerCustomEvent(dataLayerEventData, \"gf_start_event\");\n break;\n\n case \"form_submit_success\":\n dataLayerEventData = {\n ...dataLayerEventData,\n form_action: \"form_submit_success\",\n };\n triggerCustomEvent(dataLayerEventData, \"gf_submit_success_event\");\n break;\n\n case \"form_error\":\n const errorMessage = getGFErrorMessage();\n\n dataLayerEventData = {\n ...dataLayerEventData,\n form_action: \"form_error_view\",\n error_message: errorMessage,\n };\n triggerCustomEvent(dataLayerEventData, \"gf_error_event\");\n break;\n\n default:\n break;\n }\n};\n\nconst getGFData = (elm) => {\n const formId = elm ? elm.id.replace(\"gform_\", \"\") : null;\n const formTileElm = document.querySelector(\n `#gform_wrapper_${formId} .gform_title`\n );\n const formTitle = (formTileElm && formTileElm.innerText) || \"\";\n\n return {\n formId,\n formTitle,\n };\n};\n\nconst getGFErrorMessage = () => {\n const errorMessageElem = document.querySelector(\".gform_validation_errors\");\n const errorMessage = (errorMessageElem && errorMessageElem.innerText) || \"\";\n\n return errorMessage;\n};\n\nconst isAjaxGFform = (form) => {\n const targetAttr = form?.getAttribute(\"target\") || \"\";\n return /gform_ajax_frame/.test(targetAttr);\n};\n\nconst isNewsletterForm = (form) => {\n return [...form.elements].some(element => element?.value?.toLowerCase()?.includes(\"newsletter\"));\n};\n\nconst checkFailedSubmission = (params) => {\n if (!params || !params.form_id) {\n return false;\n }\n\n const selector = `#gform_${params.form_id}[novalidate]`;\n return !!document.querySelector(selector);\n};\n\nconst getEmailEhash = (form) => {\n const emailField = form.querySelector(\"[type=\\\"email\\\"]\");\n const emailValue = emailField.value;\n\n if (emailValue && window.toEhashAsync) {\n return window.toEhashAsync(emailValue);\n }\n\n return Promise.resolve(\"\");\n};\n\nconst gravityFormInViewEvent = () => {\n const form = document.querySelector(\".gform_wrapper form\");\n const storageKey = \"wvusGFData\";\n\n const confirmationSession = getSessionVar(storageKey);\n const hasConfirmationData =\n (confirmationSession && !!confirmationSession.event) || false;\n\n if (form) {\n const formElFirstInput = document.querySelector(\n \".gform_wrapper form input:not([type=hidden])\"\n );\n const errorContainer = document.querySelector(\".gform_validation_errors\");\n const { formId, formTitle } = getGFData(form);\n\n let observer = new IntersectionObserver(\n (entries, observer) => {\n let eventFired = false;\n\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0 && !eventFired) {\n eventFired = true;\n\n handleGravityFormEvent({\n event: \"form_view\",\n form_id: formId,\n form_title: formTitle,\n });\n observer.unobserve(form);\n }\n });\n },\n { threshold: 1 }\n );\n\n observer.observe(form);\n\n //First Click\n const handleFirstFieldClick = function (e) {\n handleGravityFormEvent({\n event: \"form_start\",\n form_id: formId,\n form_title: formTitle,\n });\n\n formElFirstInput.removeEventListener(\"click\", handleFirstFieldClick);\n };\n\n if (!errorContainer && !hasConfirmationData && formElFirstInput) {\n // Fires once and is then removed\n formElFirstInput.addEventListener(\"click\", handleFirstFieldClick);\n }\n\n window?.jQuery(document)?.on(\"gform_confirmation_loaded\", (e, formId) => {\n const dataLayerEventData = getSessionVar(storageKey);\n\n if (dataLayerEventData.form_id) {\n triggerCustomEvent(dataLayerEventData, \"gf_newsletter_event\");\n }\n\n removeSessionVar(storageKey);\n });\n\n window?.jQuery(document)?.on(\"gform_post_render\", (e, formId) => {\n setTimeout(() => {\n if (window.document.querySelectorAll(`#gform_${formId}[novalidate]`).length) {\n const { event, form_id, ...eventParams } = getSessionVar(storageKey);\n\n form_id && handleGravityFormEvent({\n event: \"form_error\",\n form_id: form_id,\n ...eventParams\n });\n\n removeSessionVar(storageKey);\n }\n }, 1000);\n });\n\n // Submit Handler\n form.addEventListener(\"submit\", (event) => {\n let trackingParams = {};\n\n if (isNewsletterForm(event.target)) {\n // Do Something with the Newsletter Form\n getEmailEhash(form).then((ehash) => {\n const formId = (/_(\\d+)$/.exec(event.target.id)||[])[1]||\"\";\n\n trackingParams = {\n event: \"newsletter_signup\",\n event_action: \"newsletter_signup_success\",\n event_category: \"newsletter_signup\",\n event_label: \"newsletter_signup_bar\",\n ehash: ehash,\n form_id: formId,\n form_title: formTitle,\n form_name: \"newsletter\",\n form_title: \"newsleter\",\n hi_form_submissions: \"1\",\n high_intent_interactions: \"1\"\n };\n\n setSessionVar(storageKey, trackingParams);\n });\n } else {\n trackingParams = {\n event: \"form_submit_click\",\n form_id: formId,\n form_title: formTitle\n };\n\n setSessionVar(storageKey, trackingParams);\n }\n\n \n });\n\n if (!isAjaxGFform(form) && hasConfirmationData) {\n if (!checkFailedSubmission(confirmationSession)) {\n // Confirmation\n const submitTimeoutID = setTimeout(function () {\n if (hasConfirmationData) {\n const { event, ...eventParams } = confirmationSession;\n handleGravityFormEvent({\n event: \"form_submit_success\",\n ...eventParams\n });\n removeSessionVar(storageKey);\n }\n clearTimeout(submitTimeoutID);\n }, 500);\n } else {\n // Error handler\n const timeoutID = setTimeout(function () {\n if (errorContainer) {\n handleGravityFormEvent({\n event: \"form_error\",\n form_id: formId,\n form_title: formTitle,\n });\n removeSessionVar(storageKey);\n }\n clearTimeout(timeoutID);\n }, 500);\n }\n }\n }\n};\n\nexport { gravityFormInViewEvent };\nexport default gravityFormInViewEvent;\n","import { toEhashAsync } from \"./helpers/helpers\";\n\nwindow.toEhashAsync = toEhashAsync;\n\n// Send Track To Parent\nconst triggerDataLayerEvent = (eventName, eventData = {}) => {\n const event = new CustomEvent(eventName, {\n detail: eventData,\n });\n document.dispatchEvent(event);\n};\n\nwindow.triggerDataLayerEvent = triggerDataLayerEvent;\n\nconst postEventToParent = (eventKey, eventData, messageKey = \"wvusDataLayerEvent\") => {\n const message = {\n messageKey,\n eventKey,\n eventData\n };\n\n if (window?.parent?.postMessage && window.parent !== window) {\n window.parent.postMessage(message, \"*\");\n } else {\n triggerDataLayerEvent(eventKey, eventData);\n }\n}\n\nwindow.postEventToParent = postEventToParent;\n\nconst listenPostEventToParent = (messageKey = \"wvusDataLayerEvent\") => {\n const eventToParentListener = (event) => {\n if (event?.data?.messageKey === messageKey && /worldvision.org$/.test(event.origin)) {\n const { eventKey, eventData } = event?.data || {};\n triggerDataLayerEvent(eventKey, eventData);\n }\n };\n\n window.addEventListener(\"message\", eventToParentListener);\n\n return {\n unsubscribe() {\n window.removeEventListener(\"message\", eventToParentListener);\n }\n }\n}\n\nwindow.listenPostEventToParent = listenPostEventToParent;\n\nexport { postEventToParent, listenPostEventToParent, triggerDataLayerEvent };","import initLinkTracking from \"./linkTracking\";\nimport { gravityFormInViewEvent } from \"./gravityForms\";\nimport { listenPostEventToParent } from \"./postEventToParent\";\n\nwindow.document.addEventListener(\"DOMContentLoaded\", function () {\n listenPostEventToParent();\n initLinkTracking();\n gravityFormInViewEvent();\n});\n\nwindow.document.addEventListener(\"appDataLoaded\", function () {\n initLinkTracking();\n});\n"],"names":["initLinkTracking","getChildNodesInfo","ele","childNodes","hasIcon","hasImage","imgAlt","forEach","node","nodeName","alt","document","querySelectorAll","eleType","eleDescription","eleTarget","eleClassValue","getAttributeNode","value","eleDataSet","dataset","includes","hasOwnProperty","getElType","href","getElTarget","eleInfo","text","trim","length","eleHref","slice","replace","getElDescription","getElementInfo","hasAttribute","setAttribute","triggerCustomEvent","eventData","eventName","event","CustomEvent","detail","dispatchEvent","setSessionVar","varName","data","sessionStorage","setItem","JSON","stringify","removeSessionVar","removeItem","getSessionVar","getItem","parse","err","handleGravityFormEvent","form_id","form_title","dataLayerEventData","event_label","form_name","form_action","errorMessage","getGFErrorMessage","error_message","errorMessageElem","querySelector","innerText","gravityFormInViewEvent","form","storageKey","confirmationSession","hasConfirmationData","formElFirstInput","errorContainer","formId","formTitle","elm","id","formTileElm","getGFData","IntersectionObserver","entries","observer","eventFired","entry","intersectionRatio","unobserve","threshold","observe","handleFirstFieldClick","e","removeEventListener","addEventListener","window","jQuery","on","setTimeout","eventParams","trackingParams","elements","some","element","toLowerCase","isNewsletterForm","target","emailValue","toEhashAsync","Promise","resolve","getEmailEhash","then","ehash","exec","event_action","event_category","hi_form_submissions","high_intent_interactions","targetAttr","getAttribute","test","isAjaxGFform","params","selector","checkFailedSubmission","timeoutID","clearTimeout","submitTimeoutID","async","email","message","msgBuffer","TextEncoder","encode","hashBuffer","crypto","subtle","digest","Array","from","Uint8Array","map","b","toString","padStart","join","sha256","triggerDataLayerEvent","postEventToParent","eventKey","messageKey","parent","postMessage","listenPostEventToParent","eventToParentListener","origin","unsubscribe"],"mappings":"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"}