1// Lives on window because the inline snippet rendered by HxGoogleTagManagerPageViewTracker during 2// static SSR is a plain <script> and cannot reach this module's scope. Both have to agree on whether 3// GTM is already running and which page-view was tracked last. 4const state = window.hxGoogleTagManager = window.hxGoogleTagManager || { initialized: false, config: null, lastPageViewUrl: null, initialPageViewHandled: false }; 5 6export function initialize(gtmId, pageViewEventName, pageViewUrlVariableName, enableInitialPageViewTracking) { 7 state.config = { 8 gtmId: gtmId, 9 pageViewEventName: pageViewEventName, 10 pageViewUrlVariableName: pageViewUrlVariableName, 11 enableInitialPageViewTracking: enableInitialPageViewTracking 12 }; 13 14 if (state.initialized) { 15 return; 16 } 17 state.initialized = true; 18 19 (function (w, d, s, l, i) { 20 w[l] = w[l] || []; 21 w[l].push({ 22 "gtm.start": new Date().getTime(), 23 event: "gtm.js", 24 }); 25 const f = d.getElementsByTagName("head")[0], 26 j = d.createElement(s), 27 dl = l !== "dataLayer" ? "&l=" + l : ""; 28 j.async = true; 29 j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; 30 f.appendChild(j); 31 dataLayer.push({ event: "pageview" }); 32 window.isGTM = true; 33 })(window, document, "script", "dataLayer", gtmId); 34} 35 36export function push(data) { 37 dataLayer.push(data); 38 console.debug("GTM:" + JSON.stringify(data)); 39} 40 41export function pushEvent(eventName, eventData) { 42 if (eventData === null) { 43 eventData = new Object(); 44 } 45 eventData['event'] = eventName; 46 push(eventData); 47} 48 49export function pushPageViewEvent(eventName, urlVariableName, url, eventData) { 50 if (eventData === null) { 51 eventData = new Object(); 52 } 53 eventData[urlVariableName] = url; 54 eventData['event'] = eventName; 55 state.lastPageViewUrl = url; 56 push(eventData); 57} 58 59// One navigation reaches automatic tracking more than once: enhancedload is raised for every enhanced 60// page update including streaming ones, and an interactive HxGoogleTagManagerPageViewTracker reacts to 61// the same navigation. Explicit IHxGoogleTagManager.PushPageViewAsync() calls do not come through here. 62export function pushPageViewEventOnce(eventName, urlVariableName, url, eventData, trackInitialPageView) { 63 const isInitialPageView = !state.initialPageViewHandled; 64 state.initialPageViewHandled = true; 65 66 if (url === state.lastPageViewUrl) { 67 return; 68 } 69 70 if (isInitialPageView && (trackInitialPageView === false)) { 71 // Suppressed but still remembered, otherwise the next enhancedload for the same URL would look 72 // like a navigation and push it after all. 73 state.lastPageViewUrl = url; 74 return; 75 } 76 77 pushPageViewEvent(eventName, urlVariableName, url, eventData); 78}
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.