1(function () { 2 window.customTracking = window.customTracking || {}; 3 window.customTracking.dataLayerProcessed = false; 4 5let trackingFlag; 6 7 // Utility: check if OneTrust active groups contains groupId (supports number, string, comma-separated string, or array) 8const oneTrustHasGroup = (groupId) => { 9 var keyCandidates = ['OnetrustActiveGroups', 'OneTrustActiveGroups', 'OptanonActiveGroups']; // common variants 10 for (var k = 0; k < keyCandidates.length; k++) { 11 var key = keyCandidates[k]; 12 if (window.hasOwnProperty(key)) { 13 var val = window[key]; 14 if (val == null) continue; 15 16 // If array 17 if (Array.isArray(val)) { 18 if (val.indexOf(groupId) !== -1 || val.indexOf(String(groupId)) !== -1) return true; 19 } 20 21 // If number 22 if (typeof val === 'number') { 23 if (val === groupId || String(val) === String(groupId)) return true; 24 } 25 26 // If string (comma separated or single) 27 if (typeof val === 'string') { 28 var parts = val.split(/\s*,\s*/); 29 for (var p = 0; p < parts.length; p++) { 30 if (parts[p] === String(groupId)) return true; 31 } 32 } 33 } 34 } 35 return false; 36 } 37 38 // Wait for OneTrustLoaded and that group 4 is active, then call callback 39 const runAfterOneTrustGroup = (groupId, callback) => { 40 // If group already present, run immediately 41 try { 42 if (oneTrustHasGroup(groupId)) { 43 trackingFlag = true; 44 callback(); 45 return; 46 } else { 47 trackingFlag = false; 48 } 49 } catch (e) { 50 // swallow 51 } 52 53 // Handler that checks the variable and, if satisfied, runs callback and cleans up 54 const checkAndRun = () => { 55 try { 56 if (oneTrustHasGroup(groupId)) { 57 trackingFlag = true; 58 // cleanup(); 59 callback(); 60 }else { 61 trackingFlag = false; 62 } 63 } catch (e) { 64 // ignore 65 } 66 } 67 68 // Clean up listeners 69 const cleanup = () => { 70 window.removeEventListener('OneTrustLoaded', checkAndRun); 71 window.removeEventListener('OnetrustActiveGroupsUpdated', checkAndRun); 72 window.removeEventListener('OneTrustGroupsUpdated', checkAndRun); 73 // If you added any additional listeners, remove them here 74 } 75 76 // removing event listeners before adding to prevent duplicates. Don't want to remove them permenantly 77 window.removeEventListener('OneTrustLoaded', checkAndRun); 78 window.removeEventListener('OnetrustActiveGroupsUpdated', checkAndRun); 79 window.removeEventListener('OneTrustGroupsUpdated', checkAndRun); 80 // Listen for common OneTrust events â OneTrust usually fires a OneTrustLoaded DOM event, 81 // but different implementations may use different event names. Add a few common ones. 82 window.addEventListener('OneTrustLoaded', checkAndRun); 83 window.addEventListener('OnetrustActiveGroupsUpdated', checkAndRun); 84 window.addEventListener('OneTrustGroupsUpdated', checkAndRun); 85 86 // As a fallback, poll a few times (short interval) for the variable if events are not dispatched. 87 var polls = 0; 88 var maxPolls = 50; // ~5 seconds if interval is 100ms 89 var pollInterval = 100; 90 var pollTimer = setInterval(function () { 91 polls++; 92 if (oneTrustHasGroup(groupId)) { 93 clearInterval(pollTimer); 94 // cleanup(); 95 callback(); 96 } else if (polls >= maxPolls) { 97 clearInterval(pollTimer); 98 // give up â no cleanup needed because listeners remain but will not be long lived 99 } 100 }, pollInterval); 101 } 102 103 window.customTracking.trackingFlagGetter = () =>{ 104 return trackingFlag; 105 } 106 window.customTracking.trackingFlagSetter = (val) =>{ 107 trackingFlag = val; 108 } 109const processAdobeDataLayer = () => { 110 if(window.customTracking.dataLayerProcessed) { return; } 111 112// Assume componentState is populated with the data layer state 113var componentState = window.adobeDataLayer.getState('component'); 114// Iterate over each component in the componentState 115for (var key in componentState) { 116 if (componentState.hasOwnProperty(key)) { 117 var component = componentState[key]; 118 // Check if the component has a shownItems property 119 if (component.shownItems) { 120 // Find component information 121 var item_search = component.shownItems[0]; 122 // Retrieve the actual item object from componentState 123 var retrieved_item = componentState[item_search]; 124 if (retrieved_item) { 125 // Create a new object with the desired properties 126 // regex to find component name 127 var regex_type_search = /(?:\/components\/)([a-z]+)\/.*/; 128 var regex_type_return = retrieved_item['@type'].match(regex_type_search)[1]; 129 var type_full = retrieved_item['@type']; 130 131 var regex_type_abbr_search = /(?:\/components\/)([a-z]+)\/.*/; 132 var type_abbr= type_full.match(regex_type_abbr_search)[1]; 133 // regex to find date as YYYY-MM-DD 134 var regex_date_search = /(\d{4}-\d{2}-\d{2})/; 135 var regex_date_return = (retrieved_item['repo:modifyDate']) ? retrieved_item['repo:modifyDate'].match(regex_date_search)[0] : 'n/a'; 136 137 // Push to the datalayer 138 dataLayer.push({ 139 event: 'component_view', 140 component_view: 1, 141 parentId: retrieved_item['parentId'], 142 itemId: item_search, 143 typeFull:type_full, 144 typeAbbr: type_abbr, 145 title: retrieved_item['dc:title'], 146 modified_full: (retrieved_item['repo:modifyDate']) ? retrieved_item['repo:modifyDate'] :'n/a', 147 modified_abbr: regex_date_return 148 }); 149 150 } else { 151 // console.log("Item not found in componentState for ID: ", item_search); 152 } 153 } 154 } 155} 156window.customTracking.dataLayerProcessed = true; 157} 158 159function getDataObjectHelper(event) { 160 if (event.hasOwnProperty("eventInfo") && event.eventInfo.hasOwnProperty("path")) { 161 var dataObject = window.adobeDataLayer.getState(event.eventInfo.path); 162 if (dataObject != null) { 163 return dataObject; 164 } 165 } 166 return; 167 } 168 169 170function processDataObject(event, dataObject){ 171 // regex to find component name 172 if(!trackingFlag) { return; } 173 var regex_type_search = /(?:\/components\/)([a-z]+)\/.*/; 174 if (dataObject['@type']) {
175 var regex_type_return = (dataObject['@type'].match(regex_type_search)) ? dataObject['@type'].match(regex_type_search)[1] : 'n/a'; 176 var type_full = dataObject['@type']; 177 } else { 178 var regex_type_return = 'n/a'; 179 var type_full = "n/a"; 180 181 182 } 183 // regex to find date as YYYY-MM-DD 184 var regex_date_search = /(\d{4}-\d{2}-\d{2})/; 185 if (dataObject['repo:modifyDate']) { 186 var regex_date_return = dataObject['repo:modifyDate'].match(regex_date_search)[0]; 187 var date_full = dataObject['repo:modifyDate']; 188 } else { 189 var regex_date_return = 'n/a'; 190 var date_full = 'n/a'; 191 192 } 193 let eventTitle = (event.slideTitle && event.slideTitle !== '') ? event.slideTitle : dataObject['dc:title']; 194 let buttonURL = (dataObject['xdm:linkURL']) ? (dataObject['xdm:linkURL']) : 'n/a'; 195 let componentEvent; 196 switch(event.event){ 197 case "cmp:show": 198 componentEvent = 'component_show'; 199 break; 200 case "cmp:click": 201 componentEvent = 'component_click'; 202 break; 203 case "cmp:initial": 204 componentEvent = 'component_view'; 205 break; 206 default: 207 componentEvent = 'component_click'; 208 209 } 210 //let componentEvent = (event.event === 'cmp:show') ? 'component_show' : 'component_click'; 211 dataLayer.push({ 212 event: componentEvent, 213 [`${componentEvent}`]: 1, 214 parentId: dataObject['parentId'], 215 itemId: event.eventInfo.path, 216 typeFull: type_full, 217 typeAbbr: regex_type_return, 218 title: eventTitle, 219 modified_full: date_full, 220 modified_abbr: regex_date_return, 221 linkURL: buttonURL 222 }) ; 223 224} 225 226function componentEventHandler(event) { 227 if (event.hasOwnProperty("eventInfo") && event.eventInfo.hasOwnProperty("path")) { 228 var dataObject = window.adobeDataLayer.getState(event.eventInfo.path); 229 if(dataObject != null) { 230 processDataObject(event, dataObject); 231 } 232 } 233} 234 235 function componentHandler(event) { 236 var dataObject = getDataObjectHelper(event); 237 if(!dataObject) { return; } 238 var dataType = dataObject["@type"]; 239 240 var regex_component_search = /components/; 241 var regex_component_search_error = /theboeingcompany\/abc/; 242 var regex_component_return = dataType.match(regex_component_search); 243 244 if (regex_component_return) { 245 processDataObject(event, dataObject); 246 } 247 } 248 249window.adobeDataLayer.push(function (dl) { 250 dl.addEventListener("cmp:show", componentHandler); 251}); 252window.adobeDataLayer.push(function (dl) { 253 dl.addEventListener("cmp:click", componentEventHandler); 254}); 255window.adobeDataLayer.push(function (dl) { 256 dl.addEventListener("cmp:initial", componentHandler); 257}); 258 259const initDataLayer = () => { 260 261 262 // --- Main initialization: wait for OneTrust group 4 active, then wire adobeDataLayer --- 263 runAfterOneTrustGroup(4, function () { 264 // At this point OneTrust group 4 is active (OnetrustActiveGroups contains 4) 265 266 if (window.adobeDataLayer) { 267 window.adobeDataLayer.push(function(dl) { 268 if (dl.getState() && Object.keys(dl.getState()).length > 0) { 269 processAdobeDataLayer(); 270 } else { 271 const changeHandler = (event) => { 272 if (Object.keys(dl.getState()).length > 0) { 273 dl.removeEventListener('adobeDataLayer:change', changeHandler); 274 processAdobeDataLayer(); 275 } 276 }; 277 dl.addEventListener('adobeDataLayer:change', changeHandler); 278 } 279 }); 280 } else { 281 const readyHandler = () => { 282 window.adobeDataLayer.push(function(dl) { 283 if (dl.getState() && Object.keys(dl.getState()).length > 0) { 284 processAdobeDataLayer(); 285 } else { 286 const changeHandler2 = (event) => { 287 if (Object.keys(dl.getState()).length > 0) { 288 dl.removeEventListener('adobeDataLayer:change', changeHandler2); 289 processAdobeDataLayer(); 290 } 291 }; 292 dl.addEventListener('adobeDataLayer:change', changeHandler2); 293 } 294 }); 295 }; 296 window.addEventListener('adobeDataLayer:ready', readyHandler); 297 } 298 }); 299 300 301} 302if (document.readyState !== "loading") { 303 initDataLayer(); 304 } else { 305 document.addEventListener("DOMContentLoaded", initDataLayer); 306 } 307 308 309 310}());
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.