let popup_datalayer = (formID, eventType = 'open', buttonPosition = 'N/A') => { let dataLayerObject = { 'event': `popup_${eventType}`, 'formName': 'N/A', 'formType': 'N/A', 'buttonLocation': 'N/A' } //nfForms is an array which holds information about all forms present on //the page. This is initialized by Ninjaform after all forms are ready. if (formID && nfForms) { for (let nfForm of nfForms) { if (nfForm.id === formID) { formName = nfForm.settings.title; } } if (formName) { dataLayerObject['formName'] = formName; dataLayerObject['formType'] = 'ninja form'; dataLayerObject['buttonLocation'] = buttonPosition; } } window.dataLayer = window.dataLayer || []; window.dataLayer.push(dataLayerObject); } /** * Returns an unescaped version of DL props string. example - The heading block of wordpress escapes the double * Quotes. This causes the JSON string parser to fail on the unescaped quote value. This function checks if the * DL Props string contains escaped Quotes and converts those back to ' " '. * Note: This function unescapes only double quote("). * @param {string} DL_props_string - eg ' {"key1":"value1"} ' * @returns {string} - return unescaped string * */ const nlsn_unescape_quotes = (DL_props_string) => { if (!DL_props_string.includes('"')) { return DL_props_string; } return DOMPurify.sanitize(DL_props_string.replaceAll('"','"')); } ; /** * Generic onclick datalayer trigger function * This function can be used to add event listener to an html element * which has data-dl-event attribute. */ function add_datalayer_event_to_targets() { let data_layer_elements = document.querySelectorAll('[data-dl-event]'); data_layer_elements.forEach((data_layer_element) => { // Before adding event listner check if an event listener is // already added to the element. 'dl-event-present' attribute // keeps track of event listener if (data_layer_element.hasAttribute("dl-event-present")) { return; } data_layer_element.addEventListener('click', (e) => { let element = e.currentTarget;// avoid e.target because it tries to extract the attributes of clicked element let event_name = element.getAttribute('data-dl-event'); let event_props = element.getAttribute('data-dl-props'); if (event_name === "" || event_name === null || event_props === "" || event_props === null){ return; } event_props = JSON.parse(nlsn_unescape_quotes(event_props)); let data_layer_object = {}; data_layer_object['event'] = event_name; for (const prop in event_props) { data_layer_object[prop] = event_props[prop]; } window.dataLayer = window.dataLayer || []; window.dataLayer.push(data_layer_object); // This will stop the click event from propagating to parent element // use case: After the category tag (in insights card) datalayer event is triggered, the below line // will stop propagation of click event and will prevent triggering datalayer event set in parent element. e.stopPropagation(); }) // add an attribute to element after datalayer event listener is // attached to the element. This is done to mitigate duplicate event trigger issue. data_layer_element.setAttribute("dl-event-present", "true"); }) } jQuery(document).one('nfFormReady',function ($) { add_datalayer_event_to_targets(); //execute the function after at least one form is loaded as NF takes a while to load }); document.addEventListener("postsLoaded",add_datalayer_event_to_targets); // execute the function after postsLoaded( load more )event /** * Ninja Form submission datalayer scripts */ /** * Get the value of a field containing specific key(set inside Ninja form) * @param {Object} form_fields_by_key- Submitted field values * @param {String} field_key_str - key string to search for */ const get_nf_field_value = (form_fields_by_key, field_key_str) => { let field_keys = Object.keys(form_fields_by_key); let field_key = field_keys.find((key) => key.startsWith(field_key_str)); if (!field_key){ return 'N/A'; } let NF_field_value = form_fields_by_key[field_key].value; let return_val = null; //special cases // speak with sales,remember me checkbox if ((field_key_str === 'speak_with_sales' || field_key_str === 'remember_me' || field_key_str === 'newsletter') && Array.isArray(NF_field_value)) { return_val = (NF_field_value.length > 0) ? 'true' : 'false'; } // inquiry type else if (field_key_str === 'inquiry_type' && ( NF_field_value === '' || NF_field_value === false)) { return_val = 'N/A'; } else { return_val = form_fields_by_key[field_key].value; } if (return_val === '' || return_val === null) { return_val = 'N/A'; } return return_val; }; /** * Bind a data layer event to form submit button * datalayer_infos is an array of objects which holds all datalayer fields for each form. Each object expects form_name, event_name, datalayer_fields * each object in datalayer_fields has two properties field_name and key * field_name : property name in the datalayer * key : ninja form label of the input field from where value has to be extracted */ function bind_form_data_layer_event() { const datalayer_ninjaforms_json = [ { form_identifier_class: 'datalayer-report-download', event_name: 'report_download_form', datalayer_fields: [ { field_name: 'industry', key: 'industry' }, { field_name: 'company', key: 'company' }, { field_name: 'jobTitle', key: 'job_title' }, { field_name: 'speakWithSalesCheckbox',key: 'speak_with_sales' }, { field_name: 'inquiryType', key: 'inquiry_type' }, { field_name: 'newsCheckbox', key: 'newsletter' }, { field_name: 'location', key: 'location' }, { field_name: 'campaignTag', key: 'campaigns_taxonomy_term' }, { field_name: 'reportFileName', key: 'form_attachment_1_url' }, { field_name: 'reportName', key: 'form_attachment_1_title' }, { field_name: 'pardotId', key: 'hidden_pardot_id' }, { field_name: 'salesforceId', key: 'custom_val_N/A' }, { field_name: 'websiteLeadId', key: 'custom_lead_id' }, { field_name: 'rememberMe', key: 'remember_me' }, ], }, { form_identifier_class: 'datalayer-contact-us', event_name: 'contact_us_form', datalayer_fields: [ { field_name: 'industry', key: 'industry' }, { field_name: 'company', key: 'company' }, { field_name: 'location', key: 'location' }, { field_name: 'areaOfInterest', key: 'area_of_interest' }, { field_name: 'inquiryType', key: 'inquiry_type' }, { field_name: 'newsCheckbox', key: 'newsletter' }, { field_name: 'pardotId', key: 'hidden_pardot_id' }, { field_name: 'salesforceId', key: 'custom_val_N/A' }, { field_name: 'websiteLeadId', key: 'custom_lead_id' }, { field_name: 'campaignTag', key: 'campaigns_taxonomy_term' }, ], }, { form_identifier_class: 'data-layer-webinar', event_name: 'webinar_registration_form', datalayer_fields: [ { field_name: 'jobTitle', key: 'job_title' }, { field_name: 'industry', key: 'industry' }, { field_name: 'location', key: 'location' }, { field_name: 'company', key: 'company' }, { field_name: 'newsCheckbox', key: 'newsletter' }, { field_name: 'pardotId', key: 'hidden_pardot_id' }, { field_name: 'salesforceId', key: 'custom_val_N/A' }, { field_name: 'websiteLeadId', key: 'custom_lead_id' }, ], }, { form_identifier_class: 'datalayer-newsletter', event_name: 'email_subscription_form', datalayer_fields: [ { field_name: 'newsletterName', key: 'custom_val_Newsletter' }, { field_name: 'pardotId', key: 'hidden_pardot_id' }, { field_name: 'salesforceId', key: 'custom_val_N/A' }, { field_name: 'websiteLeadId', key: 'custom_lead_id' }, ], } ]; nfRadio.channel('forms').on('submit:response', (form) => { //This is a fallback variable which contains all datalayer ninjafrom fields //in case the variable/js object in content_area is invalid or inaccesible. let errlog = form['errors']; if (Object.keys(errlog).length === 0) { const datalayer_infos = (typeof datalayer_ninjaform === 'undefined') ? datalayer_ninjaforms_json : datalayer_ninjaform; datalayer_infos.forEach((datalayer_info) => { if (form.data.settings.wrapper_class.toLowerCase().includes(datalayer_info.form_identifier_class.toLowerCase())) { //initialize event key and event value for datalayer object let data_layer_object = { 'event': datalayer_info.event_name, }; if (datalayer_info.event_name === 'webinar_registration_form') { data_layer_object['webinarName'] = form['data']['settings']['title']; } else { data_layer_object['formName'] = form['data']['settings']['title'], data_layer_object['formId'] = form['data']['form_id']; data_layer_object['formtype'] = 'ninja form'; }; let field_info = datalayer_info.datalayer_fields; //store all datalayer fields in an array field_info.forEach((field) => { let datalayer_field_key = field.field_name; // datalayer property name let datalayer_field_value; if (field.key.startsWith('custom_val')) { datalayer_field_value = field.key.substr(11); // extract the string after custom_val } else { let nf_key = field.key; // label of the ninjaform field datalayer_field_value = get_nf_field_value(form.data.fields_by_key, nf_key); // datalayer property value } data_layer_object[datalayer_field_key] = datalayer_field_value; }); if ( data_layer_object['event'].toString() === "contact_us_form" && data_layer_object['areaOfInterest'].toString() === "sales" && data_layer_object['inquiryType'].toString() === "false" ) { data_layer_object['inquiryType'] = get_nf_field_value(form.data.fields_by_key, ['sales_inquiry']).toLowerCase(); } window.dataLayer = window.dataLayer || []; window.dataLayer.push(data_layer_object); //close the form embeded in a gated pop-up let form_conatiner_modal = document.getElementById(`nf-form-${form['data']['form_id']}-cont`).closest('div[x-data]'); if (form_conatiner_modal === null || !(form_conatiner_modal.getAttribute('id').startsWith('modal'))) { return }; //for forms used independently or outside a pop-up block document.dispatchEvent(new CustomEvent(`${form_conatiner_modal.getAttribute('id')}`+'-gating',{bubbles : true})); //form cookie let rememberMe = get_nf_field_value(form.data.fields_by_key, 'remember_me'); if ( rememberMe === 'true') { document.cookie=`nlsn-pop-up|${form['data']['form_id']}=${form_conatiner_modal.getAttribute('id')}; max-age=604800`;//set cookie for 7 days } } }) } else { let data_layer_object = {}; let pardotId = get_nf_field_value(form.data.fields_by_key, ['hidden_pardot_id']); let websiteLeadId = get_nf_field_value(form.data.fields_by_key, ['hidden_lead_id']); data_layer_object['event'] = 'form_submit_failure' ; data_layer_object['formName'] = form['data']['settings']['title']; for(key in errlog) { var errobj = errlog[key]; for(var errkey in errobj) { var errmsg = errobj[errkey]; data_layer_object['failureReason'] = errmsg; } } data_layer_object['pardotID'] = pardotId ?? 'N/A'; data_layer_object['salesforceId'] = 'N/A'; data_layer_object['websiteLeadId'] = websiteLeadId; window.dataLayer = window.dataLayer || []; window.dataLayer.push(data_layer_object); } }) } jQuery(document).one('nfFormReady', () => { bind_form_data_layer_event(); }) /* * Ninjaform field on chanage datalayer triggers */ let formInfos = {}; let formInfoAggregator = Marionette.Object.extend({ initialize: function () { // stores the form id and form name after form intialization let formsChannel = Backbone.Radio.channel('forms'); this.listenTo(formsChannel, 'init:model', this.storeFormData); }, storeFormData: function (model) { let formID = model.get('id'); let formTitle = model.get('title'); let form_fields = model['attributes']['fields']['models']; let formLeadID = ""; for (let form_field of form_fields) { let field_key = form_field['attributes']['key']; if (field_key.startsWith('hidden_lead_id')) { formLeadID = form_field.attributes.value; break; } }; formInfos[formID] = { title: formTitle, leadID: formLeadID }; } }); let formStartDatalayerController = Marionette.Object.extend({ initialize: function () { // push datalayer when a field's value changes let fieldsChannel = Backbone.Radio.channel('fields'); this.listenTo(fieldsChannel, 'change:modelValue', this.dataLayerPush); }, dataLayerPush: function (model) { let fieldValue = model.get("value"); let fieldLabel = model.get('label'); let formInfo = formInfos[model.get('formID')]; if (formInfo) { let formName = "title" in formInfo ? formInfo['title'] : "no_title"; let formLeadID = "leadID" in formInfo ? formInfo['leadID'] : "no_lead_id"; if ( formName !== undefined && fieldLabel !== "" && fieldValue !== '' && model['attributes']['type'] !== 'hidden' ) { let dataLayerObj = { 'event': 'form_field_start', }; // define event name dataLayerObj['formName'] = formName; dataLayerObj['formFieldName'] = fieldLabel; dataLayerObj['pardotID'] = pardotId ?? 'N/A'; // should already be initialized at this point. present in wp_head hook dataLayerObj['salesforceId'] = 'N/A'; // should already be initialized at this point. present in wp_head hook window.dataLayer = window.dataLayer || []; let dataLayerEvents = window.dataLayer; let eventPresent = false; // avoid trigger form_field_start event more than once on the same form for (let dataLayerEvent of dataLayerEvents) { if (('event' in dataLayerEvent === true)) { if ( (dataLayerEvent['event'] === 'form_field_start') && (formName !== "no_title") && (dataLayerEvent['formName'] === formName) ) { eventPresent = true; } } } if (!eventPresent) { window.dataLayer.push(dataLayerObj); } } } }, }); jQuery(function () { new formInfoAggregator(); // some NF fields (default) values are populated during pageload using jQuery. A delay/timeout ensures that // form_start datalayer event doesn't trigger during these default field value assignment. setTimeout(function () { new formStartDatalayerController(); }, 1500); }); ; !function(e){"object"==typeof exports&&"undefined"!=typeof module||"function"!=typeof define||!define.amd?e():define("inert",e)}((function(){"use strict";var e,t,n,i,o,r,s=function(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e};function a(e,t){for(var n=0;nf;)o(n,e=t[f++])&&(~c(s,e)||u(s,e));return s}},function(r,t,e){var n=e(11),o=e(59),a=e(62);e=function(r){return function(t,e,c){var i,u=n(t),f=a(u),s=o(c,f);if(r&&e!=e){for(;s"+r+""}var c,i=n(45),u=n(74),f=n(64),s=n(53),p=n(76),l=n(41),y=(n=n(52),"prototype"),h="script",v=n("IE_PROTO"),g=function(){try{c=new ActiveXObject("htmlfile")}catch(r){}var r;g="undefined"==typeof document||document.domain&&c?function(r){r.write(a("")),r.close();var t=r.parentWindow.Object;return r=null,t}(c):((r=l("iframe")).style.display="none",p.appendChild(r),r.src=String("javascript:"),(r=r.contentWindow.document).open(),r.write(a("document.F=Object")),r.close(),r.F);for(var t=f.length;t--;)delete g[y][f[t]];return g()};s[v]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(o[y]=i(t),n=new o,o[y]=null,n[v]=t):n=g(),e===r?n:u.f(n,e)}},function(r,t,e){var n=e(5),o=e(44),a=e(43),c=e(45),i=e(11),u=e(75);t.f=n&&!o?Object.defineProperties:function(r,t){c(r);for(var e,n=i(t),o=u(t),f=o.length,s=0;s=t||56320!=(64512&i(r,e))))return!1}return!0}})},function(r,t,e){var n=e(91),o=String;r.exports=function(r){if("Symbol"===n(r))throw new TypeError("Cannot convert a Symbol value to a string");return o(r)}},function(r,t,e){var n=e(2),o=e(7),a=e(13),c=e(15),i=e(102),u=(e=e(6),Array),f=a("".charAt),s=a("".charCodeAt),p=a([].join),l="".toWellFormed,y=l&&e((function(){return"1"!==o(l,1)}));n({target:"String",proto:!0,forced:y},{toWellFormed:function(){var r=i(c(this));if(y)return o(l,r);for(var t=r.length,e=u(t),n=0;n{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{actions:()=>S,addAction:()=>m,addFilter:()=>p,applyFilters:()=>k,createHooks:()=>h,currentAction:()=>w,currentFilter:()=>I,defaultHooks:()=>f,didAction:()=>O,didFilter:()=>j,doAction:()=>b,doingAction:()=>x,doingFilter:()=>T,filters:()=>z,hasAction:()=>v,hasFilter:()=>y,removeAction:()=>A,removeAllActions:()=>F,removeAllFilters:()=>g,removeFilter:()=>_});const n=function(t){return"string"!=typeof t||""===t?(console.error("The namespace must be a non-empty string."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.\-\/]*$/.test(t)||(console.error("The namespace can only contain numbers, letters, dashes, periods, underscores and slashes."),!1)};const r=function(t){return"string"!=typeof t||""===t?(console.error("The hook name must be a non-empty string."),!1):/^__/.test(t)?(console.error("The hook name cannot begin with `__`."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(t)||(console.error("The hook name can only contain numbers, letters, dashes, periods and underscores."),!1)};const o=function(t,e){return function(o,i,s,c=10){const l=t[e];if(!r(o))return;if(!n(i))return;if("function"!=typeof s)return void console.error("The hook callback must be a function.");if("number"!=typeof c)return void console.error("If specified, the hook priority must be a number.");const u={callback:s,priority:c,namespace:i};if(l[o]){const t=l[o].handlers;let e;for(e=t.length;e>0&&!(c>=t[e-1].priority);e--);e===t.length?t[e]=u:t.splice(e,0,u),l.__current.forEach((t=>{t.name===o&&t.currentIndex>=e&&t.currentIndex++}))}else l[o]={handlers:[u],runs:0};"hookAdded"!==o&&t.doAction("hookAdded",o,i,s,c)}};const i=function(t,e,o=!1){return function(i,s){const c=t[e];if(!r(i))return;if(!o&&!n(s))return;if(!c[i])return 0;let l=0;if(o)l=c[i].handlers.length,c[i]={runs:c[i].runs,handlers:[]};else{const t=c[i].handlers;for(let e=t.length-1;e>=0;e--)t[e].namespace===s&&(t.splice(e,1),l++,c.__current.forEach((t=>{t.name===i&&t.currentIndex>=e&&t.currentIndex--})))}return"hookRemoved"!==i&&t.doAction("hookRemoved",i,s),l}};const s=function(t,e){return function(n,r){const o=t[e];return void 0!==r?n in o&&o[n].handlers.some((t=>t.namespace===r)):n in o}};const c=function(t,e,n=!1){return function(r,...o){const i=t[e];i[r]||(i[r]={handlers:[],runs:0}),i[r].runs++;const s=i[r].handlers;if(!s||!s.length)return n?o[0]:void 0;const c={name:r,currentIndex:0};for(i.__current.push(c);c.currentIndex