PageSourceSearch

https://cti-symposium.world/wp-content/uploads/hmg-tracking/hmg-tracking.js?ver=1790940071

js cti-symposium.world collected 2026-10-09 21:46:04 UTC 5,938 bytes, 170 lines download raw bytes

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.