1import { initializeEventTracking, sanitizeTitle, getMainDomainName } from 'hmg-tracking-lib'; 2 3const trackingEvents = { 4 pageLoad: { 5 dataObject: { 6 event: 'page.display', 7 }, 8 eventConfig: { 9 eventTarget: window, 10 eventType: 'load' 11 } 12 }, 13 clickOnFullEventPass: { 14 dataObject: { 15 event: 'click.action', 16 event_classification: 'apply', 17 event_label_group: 'full event pass', 18 event_label_detail: 'next' 19 }, 20 eventConfig: { 21 eventTarget: window, 22 eventType: 'message', 23 checkGuards: (element, event) => { 24 let data; 25 try { 26 data = JSON.parse(event.data); 27 } catch (e) { 28 console.error('Failed to parse message event data:', e); 29 return false; 30 } 31 if ( data.type === 'navigation' && data.frameName.includes('viovendi-booking-') ){ 32 const now = new Date(); 33 window.dooFramesLoaded = window.dooFramesLoaded || now; 34 if ( window.dooFramesLoaded.getTime() + 1000 < now.getTime() ){ 35 return true; 36 } 37 } 38 return false; 39 } 40 } 41 }, 42 clickOnFollowLinkedIn: { 43 dataObject: { 44 event: 'click.action', 45 event_classification: 'follow-us', 46 event_label_detail: 'linkedin' 47 }, 48 eventConfig: { 49 eventTarget: 'a[href="https://www.linkedin.com/showcase/cti&automotive-industry"], a[href="https://www.linkedin.com/showcase/37217047"]', 50 eventType: 'click' 51 } 52 }, 53 clickOnShareButtons: { 54 dataObject: { 55 event: 'click.action', 56 event_classification: 'share' 57 }, 58 eventConfig: { 59 eventTarget: '#ef-share a', 60 eventType: 'click', 61 addData: (element, event) => { 62 const linkTarget = element.getAttribute('href'); 63 let eventLabelDetail; 64 if ( linkTarget.startsWith('mailto:') ){ 65 eventLabelDetail = 'email'; 66 } else { 67 eventLabelDetail = getMainDomainName(linkTarget); 68 if ( eventLabelDetail == 'twitter' ){ 69 eventLabelDetail = 'x'; 70 } 71 } 72 return { 73 event_label_detail: eventLabelDetail 74 }; 75 } 76 } 77 }, 78 clickOnMagGoToDownloadLink: { 79 dataObject: { 80 event: 'click.action', 81 event_classification: 'download', 82 }, 83 eventConfig: { 84 eventTarget: 'a[href*="/cti-mag/"]', 85 eventType: 'click', 86 addData: (element, event) => { 87 let eventPlacement; 88 if ( element.closest('.dgd_stb_box') ){ 89 eventPlacement = 'popup'; 90 } else if ( element.closest('.su-lightbox') ){ 91 eventPlacement = 'modal'; 92 } else if ( element.closest('nav') ){ 93 eventPlacement = 'navigation'; 94 } else { 95 eventPlacement = 'content'; 96 } 97 return { 98 event_label_detail: sanitizeTitle(element.textContent, {toLower: false, hyphenate: false}), 99 event_placement: eventPlacement 100 }; 101 } 102 } 103 }, 104 clickOnMagShowFormButton: { 105 dataObject: { 106 event: 'click.action', 107 event_classification: 'download', 108 event_placement: 'modal' 109 }, 110 eventConfig: { 111 eventTarget: '[data-mfp-src="#cti-mag-form"] a', 112 eventType: 'click', 113 addData: (element, event) => ({ 114 event_label_detail: sanitizeTitle(element.textContent, {toLower: false, hyphenate: false}) 115 }) 116 } 117 }, 118 clickOnMagDownloadFormSubmit: { 119 dataObject: { 120 event: 'click.action', 121 event_classification: 'download', 122 event_placement: 'form' 123 }, 124 eventConfig: { 125 eventTarget: 'form[action*="/cti-mag/"]', 126 eventType: 'submit', 127 addData: (element, event) => ({ 128 event_label_detail: sanitizeTitle(element.querySelector('input[type="submit"]').value, {toLower: false, hyphenate: false}) 129 }) 130 } 131 }, 132 clickOnCountryLink: { 133 dataObject: { 134 event: 'click.action', 135 event_classification: 'link', 136 event_label_group: 'country' 137 }, 138 eventConfig: { 139 eventTarget: '#cti-countries a', 140 eventType: 'click', 141 addData: (element, event) => ({ 142 event_label_detail: element.href.endsWith('/de/') ? 'DE' : 'US' 143 }) 144 } 145 } 146}; 147 148// For each item of trackingEvents (except the ones where item.dataObject.event is equal to 'page.display'), 149// make sure the required properties are always set in the final object that is pushed to the dataLayer. 150// If the property doesn't exist, it will be set to an empty string value by addEventToDataLayer(). 151// requiredProperties may be an array or an object (for setting default values instead of empty strings). 152 153const requiredProperties = [ 154 'event_classification', 155 'event_label_group', 156 'event_label_detail', 157 'event_placement', 158 'goal_type', 159]; 160
161Object.keys(trackingEvents).forEach((key) => { 162 const { dataObject, eventConfig } = trackingEvents[key]; 163 if (dataObject.event !== 'page.display') { 164 eventConfig.requiredProps = requiredProperties; 165 } 166}); 167 168document.addEventListener('DOMContentLoaded', () => { 169 initializeEventTracking(trackingEvents); 170});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.