PageSourceSearch

https://www.boeing.es/etc.clientlibs/theboeingcompany/clientlibs/clientlib-analytics.min.js

js boeing.es collected 2026-10-02 10:52:15 UTC 11,273 bytes, 310 lines download raw bytes

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.