/* JavaScript Cookie v2.2.1 | Copyright 2006, 2015 Klaus Hartl & Fagner Brack | MIT license | @preserve */ !function(t){var e,n,o;"function"==typeof define&&define.amd&&(define(t),e=!0),"object"==typeof exports&&(module.exports=t(),e=!0),e||(n=window.CookiesAFL,(o=window.CookiesAFL=t()).noConflict=function(){return window.CookiesAFL=n,o})}(function(){function a(){for(var t=0,e={};tp("last_touch_window"))&&(C(a,c),u.utm_ts=r,C(e,r),l("cookie_has_update",!0)))),p("clid").forEach(function(t,e){var n,o;""!==b(c,t)&&(n=s(u,t+"_ts",0),((o=L(t+"_url"))!==c||o===c&&r-n>p("last_touch_window"))&&(C(t+"_url",c),C(t+"_visit",u[t+"_ts"]=r),l("cookie_has_update",!0)))}),"force"!==p("cookie_renewal")||m("cookie_has_update")||(i=new Date(1e3*D.config.timestamp),t=new Date(1e3*u.updated_ts),(86400<=Math.abs(D.config.timestamp-u.updated_ts)||0 { const targetHref = event?.target?.href; const buttonText = event?.target?.innerText; const buttonId = event?.target?.id; const { email, gacid, gwid, FirstName, LastName, Dealership_Name, Phone, State, ZipCode, Job_Title, } = fetchStoredUserData(); if ( ! email ) { return; } const decryptedEmail = await decryptEmailFirstPartyCookie( email ); // Wait until we decrypt the email. const { utmSource, utmMedium, utmCampaign, utmTerm } = fetchUtmParams(); // Currently SubscriberKey and ContactKey as Email Only. const SubscriberKey = decryptedEmail; const ContactKey = decryptedEmail; // Today's Clicked Date. const today = new Date(); const formattedDate = formatDate( today ); const Data = { EmailAddress: decryptedEmail, FirstName, LastName, Dealership_Name, Phone, State, Job_Title, utm_source: utmSource ?? '', utm_medium: utmMedium ?? '', utm_campaign: utmCampaign ?? '', utm_term: utmTerm ?? '', gacid, gwid, Form_Name: buttonText, SubscriberKey, ContactKey, Submission_Date: formattedDate, Form_ID: `${buttonText} ${buttonId}`, URI: decodeURIComponent(currentUrl), }; // Add Zip Code check, because some forms have these fields and some do not have. // To check the ZipCode is in number format. if ( ZipCode && ! isNaN( ZipCode ) ) { Data.ZipCode = ZipCode; } if ( ! ajaxUrl || ! ajaxNonce ) { return; } // Fire Ajax. sendToDataExtension( Data ); }; /** * Send Ajax Request to Post Data to SFMC. */ const sendToDataExtension = ( body ) => { jQuery.ajax( { type: 'POST', url: ajaxUrl, data: { action: 'evergreen_cta_ajax_handler', nonce: ajaxNonce, body }, async: false, success: function ( res ) { if ( res && res.data && res.data.status ) { console.log( 'Evergreen Tracked!' ); } }, error: function ( res ) { if ( res && res.data ) { console.log( 'Evergreen Tracking Failed!', res.data.message ); } } } ); } /** * Fetch Stored User from Cookie. */ const fetchStoredUserData = () => { const Cookie = atdGetCookieData( 'coxmkt' ); if ( ! Cookie ) { return {}; } try { const getCookie = JSON.parse(Cookie); const gFormData = getCookie?.gFormData; const formData = {}; if ( 'undefined' !== typeof gFormData && gFormData ) { formData.FirstName = gFormData?.firstname; formData.LastName = gFormData?.lastname; formData.Dealership_Name = gFormData?.dealershipname || gFormData?.dealershipnames; formData.Phone = gFormData?.phone; formData.State = gFormData?.state; formData.ZipCode = gFormData?.zip || gFormData?.zipcode; formData.Job_Title = gFormData?.jobtitle; } return { email: getCookie?.emal, gacid: getCookie?.gacid?.dlrtrk, gwid: getCookie?.gwid, ...formData, }; } catch { return {}; } }; /** * Fetch the UTM Params from Cookie or From URl. */ const fetchUtmParams = () => { const UtmData = fetchUtmParamsFromUrl(); if ( 0 !== Object.keys( UtmData ).length ) { return UtmData; } const UtmCookieData = fetchUtmParamsFromCookie(); return UtmCookieData; } /** * Fetch UTM Params from URL. */ const fetchUtmParamsFromUrl = () => { const returnObject = {}; const urlParams = new URLSearchParams( window.location.search ); for ( const [ key, value ] of urlParams.entries() ) { switch ( key ) { case 'utm_campaign': returnObject['utmCampaign'] = value; break; case 'utm_source': returnObject['utmSource'] = value; break; case 'utm_medium': returnObject['utmMedium'] = value; break; case 'utm_term': returnObject['utmTerm'] = value; } } return returnObject; } /** * Fetch UTM Param From Cookie. */ const fetchUtmParamsFromCookie = () => { const getCookie = atdGetCookieData( 'GFOrganicDirectTrafficSouce' ); if ( ! getCookie ) { return {}; } try { const parsedData = JSON.parse( getCookie ); return { utmSource: parsedData?.utm_source, utmMedium: parsedData?.utm_medium, utmCampaign: parsedData?.utm_campaign, utmTerm: parsedData?.utm_term, }; } catch { return {}; } } /** * Function to fetch the cookie stored. * * @param string name Cookie Name to fetch. * * @return string|null */ const atdGetCookieData = ( name ) => { const nameEQ = name + '='; const ca = document.cookie.split(';'); for ( let i = 0; i < ca.length; i++ ) { let c = ca[ i ]; while ( ' ' === c.charAt( 0 ) ) { c = c.substring( 1, c.length ); } if ( 0 === c.indexOf( nameEQ ) ) { return c.substring( nameEQ.length, c.length ); } } return null; } /** * Format Date as `m/d/Y H:i:s` */ const formatDate = ( date ) => { const year = date.getFullYear(); const month = String( date.getMonth() + 1 ).padStart( 2, '0' ); const day = String( date.getDate() ).padStart( 2, '0' ); const hours = String( date.getHours() ).padStart( 2, '0' ); const minutes = String( date.getMinutes() ).padStart( 2, '0' ); const seconds = String( date.getSeconds() ).padStart( 2, '0' ); return `${month}/${day}/${year} ${hours}:${minutes}:${seconds}`; } /** * Email Decryption from first party cookie. * * @param {string} email Email to decrypted. * * @return {string} Decrypted Email. */ const decryptEmailFirstPartyCookie = async ( email ) => { const { ajaxurl, nonce } = window.SharedStorageOptions || {}; let decrypted = email; const callback = ( response ) => { if ( 'undefined' !== typeof response && false !== response ) { decrypted = response; } }; await jQuery.ajax( { url: ajaxurl, data: { 'action': 'decrypt_data', 'data': email, 'nonce': nonce }, type: 'POST', async: false, success: callback } ); return decrypted; } EvergreenLinks.forEach( ( element ) => { element.addEventListener( 'click', handleCTAEvent ); } ); jQuery( document ).on( 'elementor/popup/show', () => { setTimeout( () => { const newButtonLinks = document.querySelectorAll( '.evergreen-cta-event a, a.evergreen-cta-event' ); newButtonLinks.forEach( ( element ) => { element.addEventListener( 'click', handleCTAEvent ); } ); }, 200 ); } ); // phpcs:enable WordPressVIPMinimum.JS.Window; /** * Javascript File to add ajax request to send Vidyard events. */ // phpcs:disable WordPressVIPMinimum.JS.Window /** * Window Variables. */ const currentPageUrl = encodeURIComponent( window.location.href.substring( 0, 253 ) ); const { vidyardAjaxUrl, vidyardAjaxNonce } = window.vidyardEventAjaxObject || {}; /** * Fetch Email and other related form Details. */ const vidyardFetchStoredUserDataFromCookie = () => { const Cookie = atdVidyardGetCookieData( 'coxmkt' ); if ( ! Cookie ) { return {}; } try { const getCookie = JSON.parse( Cookie ); const gFormData = getCookie?.gFormData; const formData = {}; if ( 'undefined' !== typeof gFormData && gFormData ) { formData.firstName = gFormData?.firstname; formData.lastName = gFormData?.lastname; formData.company = gFormData?.dealershipname || gFormData?.dealershipnames; } return { email: getCookie?.emal, ...formData, }; } catch { return {}; } }; /** * Send to DE. * * @param {*} playerDetails Vidyard Player Details. */ const vidyardPrepareDataToSend = async( playerDetails, percentageWatched ) => { const { email, firstName, lastName, company } = vidyardFetchStoredUserDataFromCookie(); if ( ! email ) { return; } const decryptedEmail = await vidyardDecryptEmailFirstPartyCookie( email ); // Wait until we decrypt the email. const today = new Date(); const formattedDate = vidyardFormatDate( today ); // Currently SubscriberKey and ContactKey as Email Only. const ContactKey = decryptedEmail; const videoName = playerDetails?.metadata?.name; const watched = 'yes'; const watchedUntil = percentageWatched; const { utmSource, utmMedium, utmCampaign, utmTerm } = fetchUtmParamsForVidyardEvent(); const Data = { email: decryptedEmail, firstName, lastName, company, timeDate: formattedDate, videoName, watched, ContactKey, watchedUntil, URI: decodeURIComponent( currentPageUrl ), utm_source: utmSource ?? '', utm_medium: utmMedium ?? '', utm_campaign: utmCampaign ?? '', utm_term: utmTerm ?? '', }; vidyardSendDataToDataExtension( Data ); }; /** * Send Ajax Request to Post Data to SFMC. */ const vidyardSendDataToDataExtension = ( body ) => { jQuery.ajax( { type: 'POST', url: vidyardAjaxUrl, data: { action: 'vidyard_video_events_handle', nonce: vidyardAjaxNonce, body }, success: function ( res ) { if ( res && res.data && res.data.status ) { console.log( 'Vidyard Event Tracked.' ); } }, error: function ( res ) { if ( res && res.data ) { console.log( 'Vidyard Event Tracking Failed!', res.data.message ); } } } ); }; /** * Register Progress Events. * * @param {*} vidyardEmbed Vidyard Embed. */ const registerProgressEvents = ( vidyardEmbed ) => { vidyardEmbed.api.addReadyListener( function ( data, player ) { // Add multiple player events to track the data here. // Send event, when overall 60% video is viewed from 100% of video, regard to seek. // If 100sec video, and 60% criteria, then if user viewed 20sec then seek to 80sec // and complete the video, it would not count as total duration watched is 40sec only. vidyardEmbed.api.progressEvents( function ( result ) { vidyardPrepareDataToSend( result.player, result.event ); }, [ 60 ] ); // Add multiple percentage video. } ); }; /** * Function to fetch the cookie stored. * * @param string name Cookie Name to fetch. * * @return string|null */ const atdVidyardGetCookieData = ( name ) => { const nameEQ = name + '='; const ca = document.cookie.split(';'); for ( let i = 0; i < ca.length; i++ ) { let c = ca[ i ]; while ( ' ' === c.charAt( 0 ) ) { c = c.substring( 1, c.length ); } if ( 0 === c.indexOf( nameEQ ) ) { return c.substring( nameEQ.length, c.length ); } } return null; }; /** * Format Date as `m/d/Y H:i:s` */ const vidyardFormatDate = ( date ) => { const year = date.getFullYear(); const month = String( date.getMonth() + 1 ).padStart( 2, '0' ); const day = String( date.getDate() ).padStart( 2, '0' ); const hours = String( date.getHours() ).padStart( 2, '0' ); const minutes = String( date.getMinutes() ).padStart( 2, '0' ); const seconds = String( date.getSeconds() ).padStart( 2, '0' ); return `${ month }/${ day }/${ year } ${ hours }:${ minutes }:${ seconds }`; } /** * Email Decryption from first party cookie. * * @param {string} email Email to decrypted. * * @return {string} Decrypted Email. */ const vidyardDecryptEmailFirstPartyCookie = async ( email ) => { const { ajaxurl, nonce } = window.SharedStorageOptions || {}; let decrypted = email; const callback = ( response ) => { if ( 'undefined' !== typeof response && false !== response ) { decrypted = response; } }; await jQuery.ajax( { url: ajaxurl, data: { 'action': 'decrypt_data', 'data': email, 'nonce': nonce }, type: 'POST', async: false, success: callback } ); return decrypted; }; /** * Fetch the UTM Params from Cookie or From URl. */ const fetchUtmParamsForVidyardEvent = () => { const UtmData = fetchUtmParamsFromUrlVidyardEvent(); if ( 0 !== Object.keys( UtmData ).length ) { return UtmData; } const UtmCookieData = fetchUtmParamsFromCookieGravityForms(); return UtmCookieData; } /** * Fetch UTM Params from URL. */ const fetchUtmParamsFromUrlVidyardEvent = () => { const returnObject = {}; const urlParams = new URLSearchParams( window.location.search ); for ( const [ key, value ] of urlParams.entries() ) { switch ( key ) { case 'utm_campaign': returnObject['utmCampaign'] = value; break; case 'utm_source': returnObject['utmSource'] = value; break; case 'utm_medium': returnObject['utmMedium'] = value; break; case 'utm_term': returnObject['utmTerm'] = value; } } return returnObject; }; /** * Fetch UTM Param From Cookie. */ const fetchUtmParamsFromCookieGravityForms = () => { const getCookie = atdGetCookieData( 'GFOrganicDirectTrafficSouce' ); if ( ! getCookie ) { return {}; } try { const parsedData = JSON.parse( getCookie ); return { utmSource: parsedData?.utm_source, utmMedium: parsedData?.utm_medium, utmCampaign: parsedData?.utm_campaign, utmTerm: parsedData?.utm_term, }; } catch { return {}; } }; /** * Check VidyardEmbed API. */ window.vidyardEmbed ? registerProgressEvents( window.vidyardEmbed ) : ( window.onVidyardAPI = ( vidyardEmbed ) => registerProgressEvents( vidyardEmbed ) ); ;