1/** 2 * @file Contains a global variable object for use with Tealium. 3 */ 4var ctdTealium = { 5 init: function () { 6 this.campaign = this.getHashParam('ftag'); 7 this.viewGuid = this.createGuid(); 8 this.isMobile = this.isMobile(); 9 this.isAmp = this.isAmp(); 10 this.isVideoEmbedded = this.isVideoEmbedded(); 11 this.initSiteObject(); 12 13 return this; 14 }, 15 16 // This is to support legacy Brightcove video plugin code. 17 initSiteObject: function () { 18 window.site = window.site || {}; 19 window.site.ftag = window.site.ftag || this.campaign; 20 window.site.campaign = window.site.campaign || this.campaign; 21 window.site.vguid = window.site.vguid || this.viewGuid; 22 window.site.viewguid = window.site.viewguid || this.viewGuid; 23 }, 24 25 /** 26 * Determines if is a mobile device based on user agent. 27 * 28 * @return {boolean} 29 */ 30 isMobile: function () { 31 'use strict'; 32 var check = false; 33 (function (a) { 34 if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) { 35 check = true; 36 } 37 })(navigator.userAgent || navigator.vendor || window.opera); 38 return check; 39 }, 40 41 /** 42 * Attempt to determine if this is an AMP page. 43 * 44 * @return {boolean} 45 */ 46 isAmp: function () { 47 // First check for the query param then check for a hash param. 48 return this.hasQueryParam('%3Famp') || this.getQueryParam('amp') || (this.getHashParam('amp') === 'amp'); 49 }, 50 51 /** 52 * Attempt to determine if this is an embedded Video page 53 * 54 * @return {boolean} 55 */ 56 isVideoEmbedded: function () { 57 return window.location.href.includes('/video-embed/'); 58 }, 59 60 /** 61 * Creates a guid. 62 * 63 * This function should only be used by ctdTealium.init(). 64 * 65 * If a piece of code needs the Tealium viewGuid, get the viewGuid variable (e.g. ctdTealium.viewGuid). 66 * 67 * @returns {string} 68 */ 69 createGuid: function () { 70 'use strict'; 71 function _p8(s) { 72 var p = (Math.random().toString(16) + '000000000').substr(2, 8); 73 return s ? '-' + p.substr(0, 4) + '-' + p.substr(4, 4) : p; 74 } 75 76 return _p8() + _p8(true) + _p8(true) + _p8(); 77 }, 78 79 /** 80 * Check if a query parameter exists. 81 * 82 * @param {string} name 83 * 84 * @return {boolean} 85 */ 86 hasQueryParam: function (name) { 87 return (window.location.search.indexOf(name) !== -1); 88 }, 89 90 /** 91 * Get the value of a query parameter or all query parameters. 92 * 93 * False if does not exist. True if exists but has no value. 94 * 95 * @param {string=} name 96 * 97 * @return {boolean|string} 98 */ 99 getQueryParam: function (name) { 100 var params = {}; 101 if (!window.location.search) { 102 return false;
103 } 104 window.location.search.substring(1).split('&').forEach(function (value, index) { 105 let parts = value.split('='); 106 params[parts[0]] = parts.length === 1 ? true : decodeURIComponent(parts[1].replace(/\+/g, ' ')); 107 }); 108 if (!name) { 109 return params; 110 } 111 if (!this.hasQueryParam(name)) { 112 return false; 113 } 114 return params[name]; 115 }, 116 117 /** 118 * Get the value of a part of the URL hash. 119 * 120 * @param {string} variable 121 * 122 * @return {string|boolean} 123 */ 124 getHashParam: function (variable) { 125 'use strict'; 126 var hash = window.location.hash.substring(1); 127 if (!variable) { 128 return hash; 129 } 130 if (hash.indexOf(variable) === -1) { 131 return false; 132 } 133 var param = hash.substring(hash.indexOf(variable)); 134 if (param.indexOf('&') !== -1) { 135 param = param.split('&')[0]; 136 } 137 var value = true; 138 if (param.indexOf('=') !== -1) { 139 value = param.split('=')[1]; 140 } 141 return value; 142 }, 143 144 /** 145 * Extend/Merge two objects. 146 * 147 * @param {Object} target 148 * @param {Object} source 149 * 150 * @return {Object} 151 */ 152 extend: function (target, source) { 153 'use strict'; 154 target = target || {}; 155 for (var prop in source) { 156 if (typeof source[prop] === 'object') { 157 target[prop] = this.extend(target[prop], source[prop]); 158 } 159 else { 160 target[prop] = source[prop]; 161 } 162 } 163 return target; 164 }, 165 get merge() { 166 return this.extend; 167 } 168}; 169 170ctdTealium.init();
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.