1 /** 2 * UTMZ Cookie Replicator 3 * 4 * Makes a generally faithful representation of the old __utmz cookie 5 * from Classic Analytics. Stores the data in a cookie named __utmzz. 6 * Also sets a session cookie named __utmzzses. 7 * 8 * Data is stored in the __utmzz cookie in the following format; brackets 9 * indicate optional data and are aexcluded from the stored string: 10 * 11 * utmcsr=SOURCE|utmcmd=MEDIUM[|utmccn=CAMPAIGN][|utmcct=CONTENT] 12 * [|utmctr=TERM/KEYWORD] 13 * 14 * e.g.: 15 * 16 * utmcsr=example.com|utmcmd=affl-link|utmccn=foo|utmcct=bar|utmctr=biz 17 * 18 * Follows the same campaign assignment/overriding flow as Classic Analytics. 19 */ 20 (function(document) { 21 22 var referrer = document.referrer; 23 //default value in case everything else fails 24 var gaReferral = { 25 'utmcsr': '(direct)', 26 'utmcmd': '(none)', 27 'utmccn': '(not set)' 28 }; 29 var thisHostname = document.location.hostname; 30 var thisDomain = getDomain_(thisHostname); 31 var referringDomain = getDomain_(document.referrer); 32 var sessionCookie = getCookie_('__utmzzses'); 33 var cookieExpiration = new Date(+new Date() + 1000 * 60 * 60 * 24 * 30 * 6); 34 //return the parameters of the current url 35 var qs = document.location.search.replace('?', ''); 36 var hash = document.location.hash.replace('#', ''); 37 //atribution from parameters 38 var gaParams = parseGoogleParams(qs + '#' + hash); 39 //atribution from referrer 40 var referringInfo = parseGaReferrer(referrer); 41 //atribution from cookie 42 var storedVals = getCookie_('__utmz') || getCookie_('__utmzz'); 43 var newCookieVals = []; 44 var keyMap = { 45 'utm_source': 'utmcsr', 46 'utm_medium': 'utmcmd', 47 'utm_campaign': 'utmccn', 48 'utm_content': 'utmcct', 49 'utm_term': 'utmctr', 50 'd_source': 'utmcsr', 51 'd_medium': 'utmcmd', 52 'd_campaign': 'utmccn', 53 'd_content': 'utmcct', 54 'd_term': 'utmctr', 55 'gclid': 'utmgclid', 56 'dclid': 'utmdclid', 57 'tap_a': 'tap_a', 58 'tap_s': 'tap_s', 59 }; 60 var keyName, 61 values, 62 _val, 63 _key, 64 raw, 65 key, 66 len, 67 i; 68 69 // if there is already attribution and the previous page is internal 70 if (sessionCookie && referringDomain === thisDomain) { 71 72 gaParams = null; 73 referringInfo = null; 74 75 } 76 77 //if there are parameters and source or google ads params are defined 78 if (gaParams && (gaParams.utm_source ||gaParams.d_source|| gaParams.gclid || gaParams.dclid)) { 79 80 for (key in gaParams) { 81 82 if (typeof gaParams[key] !== 'undefined') { 83 84 keyName = keyMap[key]; 85 gaReferral[keyName] = gaParams[key]; 86 87 } 88 89 } 90 //if it comes from google ads set predefined source/medium 91 if (gaParams.gclid || gaParams.dclid) { 92 93 gaReferral.utmcsr = 'google'; 94 gaReferral.utmcmd = gaReferral.utmgclid ? 'cpc' : 'cpm'; 95 96 } 97 //if there is no utm_params, use the previous one recorded 98 } else if (storedVals && !storedVals.includes('utmcsr=(direct)')) { 99 100 values = {}; 101 raw = storedVals.split('|'); 102 len = raw.length; 103 104 for (i = 0; i < len; i++) { 105 106 _val = raw[i].split('='); 107 _key = _val[0].split('.').pop(); 108 values[_key] = _val[1]; 109 110 } 111 112 gaReferral = values; 113 114 //if there are no utm_params or cookie then use data from referrer 115 } else if (referringInfo) { 116 117 gaReferral.utmcsr = referringInfo.source; 118 gaReferral.utmcmd = referringInfo.medium; 119 if (referringInfo.term) gaReferral.utmctr = referringInfo.term; 120 121 } 122 123 for (key in gaReferral) { 124 125 if (typeof gaReferral[key] !== 'undefined') { 126 127 newCookieVals.push(key + '=' + gaReferral[key]); 128 129 } 130 131 } 132 133 writeCookie_('__utmzz', newCookieVals.join('|'), cookieExpiration, '/', thisDomain); 134 writeCookie_('__utmzzses', 1, null, '/', thisDomain); 135 136 //function to get data from parameters 137 function parseGoogleParams(str) { 138 139 var campaignParams = ['source', 'medium', 'campaign', 'term', 'content']; 140 //regex to match any utm (defined before) or google ads parameters 141 var regex = new RegExp('((utm|d)_(' + campaignParams.join('|') + ')|(d|g)clid|tap_(a|s))=.*?([^&#]*|$)', 'gi'); 142 var gaParams = str.match(regex); 143 var paramsObj, 144 vals, 145 len, 146 i; 147 148 //if there are parameters, save them into paramsObj array 149 if (gaParams) { 150 151 paramsObj = {}; 152 len = gaParams.length; 153 154 for (i = 0; i < len; i++) { 155 156 vals = gaParams[i].split('='); 157 158 if (vals) { 159 160 paramsObj[vals[0]] = vals[1]; 161 162 } 163 164 } 165 166 } 167 168 return paramsObj; 169 170 } 171 172 //attribution when the url doesn't contain parameters 173 function parseGaReferrer(referrer) { 174 175 if (!referrer) return; 176 177 var searchEngines = { 178 'daum.net': { 179 'p': 'q', 180 'n': 'daum' 181 }, 182 'eniro.se': { 183 'p': 'search_word', 184 'n': 'eniro ' 185 }, 186 'naver.com': { 187 'p': 'query', 188 'n': 'naver ' 189 }, 190 'yahoo.com': { 191 'p': 'p', 192 'n': 'yahoo' 193 }, 194 'msn.com': { 195 'p': 'q', 196 'n': 'msn' 197 }, 198 'bing.com': { 199 'p': 'q', 200 'n': 'live' 201 }, 202 'aol.com': { 203 'p': 'q', 204 'n': 'aol' 205 }, 206 'lycos.com': { 207 'p': 'q', 208 'n': 'lycos' 209 }, 210 'ask.com': { 211 'p': 'q', 212 'n': 'ask' 213 }, 214 'altavista.com': { 215 'p': 'q', 216 'n': 'altavista' 217 }, 218 'search.netscape.com': { 219 'p': 'query', 220 'n': 'netscape' 221 }, 222 'cnn.com': { 223 'p': 'query', 224 'n': 'cnn' 225 }, 226 'about.com': { 227 'p': 'terms', 228 'n': 'about' 229 }, 230 'mamma.com': { 231 'p': 'query', 232 'n': 'mama' 233 }, 234 'alltheweb.com': { 235 'p': 'q', 236 'n': 'alltheweb' 237 }, 238 'voila.fr': { 239 'p': 'rdata', 240 'n': 'voila' 241 }, 242 'search.virgilio.it': { 243 'p': 'qs', 244 'n': 'virgilio' 245 }, 246 'baidu.com': { 247 'p': 'wd', 248 'n': 'baidu' 249 }, 250 'alice.com': { 251 'p': 'qs', 252 'n': 'alice' 253 }, 254 'yandex.com': { 255 'p': 'text', 256 'n': 'yandex' 257 }, 258 'najdi.org.mk': { 259 'p': 'q', 260 'n': 'najdi' 261 }, 262 'seznam.cz': { 263 'p': 'q', 264 'n': 'seznam' 265 }, 266 'search.com': { 267 'p': 'q', 268 'n': 'search' 269 }, 270 'wp.pl': { 271 'p': 'szukaj ', 272 'n': 'wirtulana polska' 273 }, 274 'online.onetcenter.org': { 275 'p': 'qt', 276 'n': 'o*net' 277 }, 278 'szukacz.pl': { 279 'p': 'q', 280 'n': 'szukacz' 281 }, 282 'yam.com': { 283 'p': 'k', 284 'n': 'yam' 285 }, 286 'pchome.com': { 287 'p': 'q', 288 'n': 'pchome' 289 }, 290 'kvasir.no': { 291 'p': 'q', 292 'n': 'kvasir' 293 }, 294 'sesam.no': { 295 'p': 'q', 296 'n': 'sesam' 297 }, 298 'ozu.es': { 299 'p': 'q', 300 'n': 'ozu ' 301 }, 302 'terra.com': { 303 'p': 'query', 304 'n': 'terra' 305 }, 306 'mynet.com': { 307 'p': 'q', 308 'n': 'mynet' 309 }, 310 'ekolay.net': { 311 'p': 'q', 312 'n': 'ekolay' 313 }, 314 'rambler.ru': { 315 'p': 'words', 316 'n': 'rambler' 317 }, 318 'google': { 319 'p': 'q', 320 'n': 'google' 321 } 322 }; 323 var a = document.createElement('a'); 324 var values = {}; 325 var searchEngine, 326 termRegex, 327 term; 328 329 a.href = referrer; 330 331 // Shim for the billion google search engines 332 if (a.hostname.indexOf('google') > -1) { 333 334 referringDomain = 'google'; 335 336 } 337 338 if (searchEngines[referringDomain]) { 339 340 searchEngine = searchEngines[referringDomain]; 341 termRegex = new RegExp(searchEngine.p + '=.*?([^&#]*|$)', 'gi'); 342 term = a.search.match(termRegex); 343 344 values.source = searchEngine.n; 345 values.medium = 'organic'; 346 347 values.term = (term ? term[0].split('=')[1] : '') || '(not provided)'; 348 349 //if it's not a search engine, saves it as a referral with the domain it came from. 350 } else if (referringDomain !== thisDomain) { 351 352 values.source = a.hostname; 353 values.medium = 'referral'; 354 355 } 356 357 return values; 358 359 } 360
361 function writeCookie_(name, value, expiration, path, domain) { 362 363 var str = name + '=' + value + ';'; 364 if (expiration) str += 'Expires=' + expiration.toGMTString() + ';'; 365 if (path) str += 'Path=' + path + ';'; 366 if (domain) str += 'Domain=' + domain + ';'; 367 368 document.cookie = str; 369 370 } 371 372 function getCookie_(name) { 373 374 var cookies = '; ' + document.cookie 375 var cvals = cookies.split('; ' + name + '='); 376 377 if (cvals.length > 1) return cvals.pop().split(';')[0]; 378 379 } 380 381 function getDomain_(url) { 382 383 if (!url) return; 384 385 var a = document.createElement('a'); 386 a.href = url; 387 388 try { 389 390 return a.hostname.match(/[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$/)[0]; 391 392 } catch(squelch) {} 393 394 } 395 396 function splitUTMCookie(cookieName, keyMap, oldHref) { 397 var cookie = getCookie_(cookieName); 398 var utmParams = cookie.split('|'); 399 var newUTMParams; 400 var keyMapValues = Object.values(keyMap); 401 var keyMapKeys = Object.keys(keyMap); 402 403 var paramsString ='';
404 utmParams.forEach(function (value, index) { 405 var b = value.split('='); 406 407 var paramName = Object.keys(keyMap).find(key => keyMap[key] === b[0] && !key.includes('utm')); 408 var paramValue = b[1]; 409 410 if((paramName === 'gclid') || (paramName === 'dclid')) { 411 if(Cookiebot.consent?.marketing) { 412 paramName = 'd_click'; 413 }else return; 414 } 415 416 var paramsConector = '&'; 417 if (index === 0 ){ 418 paramsConector =''; 419 } 420 paramsString += paramsConector + paramName+ '='+paramValue; 421 422 423 }); 424 var landingCodeCookie = getCookie_('landingCode'); 425 if(landingCodeCookie) { 426 paramsString += '&ref='+landingCodeCookie; 427 } 428 if(isPensionPage){ 429 paramsString = '&'+paramsString; 430 } 431 else if(paramsString.length) { 432 paramsString ='?'+paramsString; 433 } 434 435 return oldHref + paramsString; 436 437 } 438 439 const allOpenAccountCTA = document.querySelectorAll('.openaccountbtn'); 440 for (var i = 0; i < allOpenAccountCTA.length; i++) { 441 var oldHref = allOpenAccountCTA.item(i).getAttribute("href"); 442 allOpenAccountCTA.item(i).href = splitUTMCookie('__utmzz',keyMap, oldHref) 443 } 444 const crossDomainParams = document.querySelectorAll('.crossDomainParams'); 445 for (var i = 0; i < crossDomainParams.length; i++) { 446 var oldHref2 = crossDomainParams.item(i).getAttribute("href"); 447 crossDomainParams.item(i).href = splitUTMCookie('__utmzz',keyMap, oldHref2) 448 } 449 450 window.addEventListener('CookiebotOnConsentReady', () => { 451 if(Cookiebot.consent?.marketing) { 452 for (let i = 0; i < allOpenAccountCTA.length; i++) { 453 let oldHref = allOpenAccountCTA.item(i).getAttribute("href"); 454 if(oldHref.includes('d_click')) { return }; 455 let hasParams = oldHref.indexOf('?'); 456 let cookie = getCookie_('__utmzz'); 457 let utmParams = cookie.split('|');
458 utmParams.forEach(function (value, index) { 459 let b = value.split('='); 460 let paramName = Object.keys(keyMap).find(key => keyMap[key] === b[0] && !key.includes('utm')); 461 let paramValue = b[1]; 462 if((paramName === 'gclid') || (paramName === 'dclid')) { 463 paramName = 'd_click'; 464 if(hasParams > -1) { 465 allOpenAccountCTA.item(i)["href"] = oldHref+= '&'+paramName+ '='+paramValue; 466 } else { 467 allOpenAccountCTA.item(i)["href"] = oldHref+= '?'+paramName+ '='+paramValue; 468 } 469 } 470 }) 471 } 472 } 473 }) 474 475 })(document); 476 477 478 // 479 // function getCookieValue(a, b, c, d, e) { 480 // b = document.cookie.split('; '); 481 // console.log(b); 482 // for (e = b.length - 1; e >= 0; e--) 483 // { 484 // c = b[e].split('='); 485 // if (a === c[0]) 486 // return c[1]; 487 // } 488 // return ''; 489 // } 490
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.