1// var exampleTag = { 2// params: { 3// gclid: { 4// value: "gclid", 5// }, 6// utm: { 7// source: "google", 8// medium: "ppc", 9// campaign: "NB", 10// term: "optimize+my+pc", 11// content: "default", 12// }, 13// }, 14// expiryDate: new Date() 15// }; 16 17function getParam(p) { 18 var match = RegExp('[?&]' + p + '=([^&]*)').exec(window.location.search) 19 return match && decodeURIComponent(match[1].replace(/\+/g, ' ')) 20} 21 22function mergeObject(A, B) { 23 var res = {} 24 Object.keys(Object.assign(A, B)).map(function (key) { 25 res[key] = B[key] || A[key] 26 }) 27 return res 28} 29 30function truthy(obj) { 31 var res = {} 32 Object.keys(obj).map(function (key) { 33 if (obj[key]) { 34 res[key] = obj[key] 35 } 36 }) 37 return res 38} 39 40function toQueryString(obj) { 41 var params = Object.keys(obj).map(function (key) { 42 return encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]) 43 }) 44 45 return params.join('&') 46} 47 48function getTagFromLocalStorage() { 49 var tag = localStorage.getItem('tag') 50 51 if (!tag) { 52 return createBlankTag() 53 } 54 55 try { 56 return JSON.parse(tag) || createBlankTag() 57 } catch { 58 return createBlankTag() 59 } 60} 61 62function getExpirationDate(days) { 63 var expiryPeriod = days * 24 * 60 * 60 * 1000 // 90 day expiry in milliseconds 64 return new Date().getTime() + expiryPeriod 65} 66 67function setCookie(name, value) { 68 const expiration = new Date() 69 expiration.setTime(getExpirationDate(90)) 70 71 const expires = 'expires=' + expiration.toUTCString() 72 document.cookie = name + '=' + value + ';' + expires + ';Secure;path=/' 73} 74 75function createBlankTag() { 76 return { 77 params: {}, 78 expiryDate: getExpirationDate(90), 79 } 80} 81 82function getTagParams(tag) { 83 var params = {} 84 85 if (tag.params.gclid) { 86 params = Object.assign(params, { gclid: tag.params.gclid.value }) 87 } 88 89 if (tag.params.msclkid) { 90 params = Object.assign(params, { msclkid: tag.params.msclkid.value }) 91 } 92 93 if (tag.params.utm) { 94 params = Object.assign(params, tag.params.utm) 95 } 96 97 if (tag.params.affiliate) { 98 params = Object.assign(params, tag.params.affiliate) 99 } 100 101 return params 102} 103 104function getFastSpringTags() { 105 var tag = getTagFromLocalStorage() 106 107 if (isTagExpired(tag)) { 108 return {} 109 } 110 111 return getTagParams(tag) 112} 113 114function appendSearchParamsForTag(searchParams) { 115 var tag = getTagFromLocalStorage() 116 117 if (isTagExpired(tag)) { 118 return searchParams 119 } 120 121 var params = getTagParams(tag) 122 123 if (!searchParams) { 124 searchParams = '?' 125 } else { 126 if (searchParams !== '?') { 127 searchParams += '&' 128 } 129 } 130 131 return searchParams + toQueryString(params) 132} 133 134function isTagExpired(tag) { 135 return tag && new Date().getTime() > tag.expiryDate 136} 137 138function captureGclid(tag) { 139 var gclid = getParam('gclid') 140 var gclsrc = getParam('gclsrc') 141 var isValid = !gclsrc || gclsrc.indexOf('aw') !== -1 142 143 if (gclid && isValid) { 144 tag.params.gclid = { value: gclid } 145 } 146} 147 148function captureMsclkid(tag) { 149 var msclkid = getParam('msclkid') 150 151 if (msclkid) { 152 tag.params.msclkid = { value: msclkid } 153 } 154} 155 156function captureUtm(tag) { 157 var params = { 158 utm_source: getParam('utm_source'), 159 utm_medium: getParam('utm_medium'), 160 utm_campaign: getParam('utm_campaign'), 161 utm_term: getParam('utm_term'), 162 utm_content: getParam('utm_content'), 163 } 164 165 if ( 166 Object.keys(params).some(function (key) { 167 return params[key] 168 }) 169 ) { 170 tag.params.utm = mergeObject(tag.params.utm || {}, truthy(params)) 171 } 172} 173 174function captureOffer(tag) { 175 var offerId = getParam('offer') 176 177 if (offerId) { 178 setCookie('offer', offerId) 179 } 180} 181 182function captureAffiliate(tag) { 183 var params = { 184 aid: getParam('aid'), 185 cid: getParam('cid'), 186 } 187 188 if ( 189 Object.keys(params).some(function (key) { 190 return params[key] 191 }) 192 ) { 193 tag.params.aff = mergeObject(tag.params.aff || {}, truthy(params)) 194 } 195} 196 197function captureTag() { 198 var tag = getTagFromLocalStorage() 199 captureGclid(tag) 200 captureMsclkid(tag) 201 captureUtm(tag) 202 captureOffer(tag) 203 captureAffiliate(tag) 204 localStorage.setItem('tag', JSON.stringify(tag)) 205} 206 207window.addEventListener('load', captureTag)
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.