1const wpgensUTMCookieManage = { 2 set: function (name, value, days) { 3 const expires = days ? new Date(Date.now() + days * 24 * 60 * 60 * 1000).toUTCString() : ''; 4 const domain = this.getCleanHost(window.location.href) ? '; domain=' + this.getCleanHost(window.location.href) : ''; 5 document.cookie = `${name}=${encodeURIComponent(value || '')}; expires=${expires}${domain}; path=/`; 6 }, 7 get: function (name) { 8 const cookieArray = document.cookie.split(';'); 9 for (let i = 0; i < cookieArray.length; i++) { 10 let cookie = cookieArray[i].trim(); 11 if (cookie.indexOf(name + '=') === 0) { 12 return decodeURIComponent(cookie.substring(name.length + 1, cookie.length)); 13 } 14 } 15 return null; 16 }, 17 remove: function (name) { 18 document.cookie = name + '=; Max-Age=-99999999;'; 19 }, 20 getCleanHost: function (url) { 21 try { 22 // Create a URL object from the input URL string. 23 var parsedUrl = new URL(url); 24 // Extract the hostname from the URL object. 25 var hostname = parsedUrl.hostname; 26 // Remove 'www.' from the hostname if present. 27 var cleanHostname = hostname.replace(/^www\./, ''); 28 return cleanHostname; 29 } catch (error) { 30 console.error('Error parsing URL: ', error); 31 return null; 32 } 33 }, 34}; 35 36(function () { 37 'use strict'; 38 39 const socialNetworks = [ 40 'facebook.com', 41 'twitter.com', 42 'linkedin.com', 43 'instagram.com', 44 'pinterest.com', 45 'tiktok.com', 46 'snapchat.com', 47 'reddit.com', 48 'youtube.com', 49 'whatsapp.com', 50 'wechat.com', 51 'qq.com', 52 'twitch.tv', 53 'tumblr.com', 54 'vimeo.com', 55 'flickr.com', 56 'medium.com', 57 'quora.com', 58 'vk.com', 59 't.co', 60 'twitter.com', 61 'x.com', 62 'ok.ru', 63 'douban.com', 64 'kakao.com', 65 'line.me', 66 'telegram.org', 67 'mix.com', 68 'digg.com', 69 'stumbleupon.com', 70 'myspace.com', 71 ]; 72 73 const clickIdentifiers = { 74 gclid: { 75 source: 'google', 76 medium: 'cpc', 77 }, 78 dclid: { 79 source: 'google', 80 medium: 'cpm', 81 }, 82 msclkid: { 83 source: 'bing', 84 medium: 'cpc', 85 }, 86 gclsrc: { 87 source: 'google', 88 medium: 'cpc', 89 }, 90 wbraid: { 91 source: 'google', 92 medium: 'cpc', 93 }, 94 gbraid: { 95 source: 'google', 96 medium: 'cpc', 97 }, 98 }; 99 100 const searchEngines = { 101 google: { 102 p: 'q', 103 n: 'google', 104 regex: true, 105 }, 106 'yahoo.com': { 107 p: 'p', 108 n: 'yahoo', 109 }, 110 'msn.com': { 111 p: 'q', 112 n: 'msn', 113 }, 114 'bing.com': { 115 p: 'q', 116 n: 'bing', 117 }, 118 'duckduckgo.com': { 119 n: 'duckduckgo', 120 }, 121 'daum.net': { 122 p: 'q', 123 n: 'daum', 124 }, 125 'eniro.se': { 126 p: 'search_word', 127 n: 'eniro ', 128 }, 129 'naver.com': { 130 p: 'query', 131 n: 'naver ', 132 }, 133 'aol.com': { 134 p: 'q', 135 n: 'aol', 136 }, 137 'lycos.com': { 138 p: 'q', 139 n: 'lycos', 140 }, 141 'ask.com': { 142 p: 'q', 143 n: 'ask', 144 }, 145 'altavista.com': { 146 p: 'q', 147 n: 'altavista', 148 }, 149 'search.netscape.com': { 150 p: 'query', 151 n: 'netscape', 152 }, 153 'cnn.com': { 154 p: 'query', 155 n: 'cnn', 156 }, 157 'about.com': { 158 p: 'terms', 159 n: 'about', 160 }, 161 'mamma.com': { 162 p: 'query', 163 n: 'mama', 164 }, 165 'alltheweb.com': { 166 p: 'q', 167 n: 'alltheweb', 168 }, 169 'voila.fr': { 170 p: 'rdata', 171 n: 'voila', 172 }, 173 'search.virgilio.it': { 174 p: 'qs', 175 n: 'virgilio', 176 }, 177 'baidu.com': { 178 p: 'wd', 179 n: 'baidu', 180 }, 181 'alice.com': { 182 p: 'qs', 183 n: 'alice', 184 }, 185 'yandex.com': { 186 p: 'text', 187 n: 'yandex', 188 }, 189 'najdi.org.mk': { 190 p: 'q', 191 n: 'najdi', 192 }, 193 'seznam.cz': { 194 p: 'q', 195 n: 'seznam', 196 }, 197 'search.com': { 198 p: 'q', 199 n: 'search', 200 }, 201 'brave.com': { 202 p: 'q', 203 n: 'brave', 204 }, 205 'wp.pl': { 206 p: 'szukaj ', 207 n: 'wirtulana polska', 208 }, 209 'online.onetcenter.org': { 210 p: 'qt', 211 n: 'o*net', 212 }, 213 'szukacz.pl': { 214 p: 'q', 215 n: 'szukacz', 216 }, 217 'yam.com': { 218 p: 'k', 219 n: 'yam', 220 }, 221 'pchome.com': { 222 p: 'q', 223 n: 'pchome', 224 }, 225 'kvasir.no': { 226 p: 'q', 227 n: 'kvasir', 228 }, 229 'sesam.no': { 230 p: 'q', 231 n: 'sesam', 232 }, 233 'ozu.es': { 234 p: 'q', 235 n: 'ozu ', 236 }, 237 'terra.com': { 238 p: 'query', 239 n: 'terra', 240 }, 241 'mynet.com': { 242 p: 'q', 243 n: 'mynet', 244 }, 245 'ekolay.net': { 246 p: 'q', 247 n: 'ekolay', 248 }, 249 'rambler.ru': { 250 p: 'words', 251 n: 'rambler', 252 }, 253 }; 254 255 const dataBrowsers = [ 256 { name: 'Chrome', value: 'Chrome', version: 'Chrome' }, 257 { name: 'Firefox', value: 'Firefox', version: 'Firefox' }, 258 { name: 'Safari', value: 'Safari', version: 'Version' }, 259 { name: 'Internet Explorer', value: 'MSIE', version: 'MSIE' }, 260 { name: 'Opera', value: 'Opera', version: 'Opera' }, 261 { name: 'BlackBerry', value: 'CLDC', version: 'CLDC' }, 262 { name: 'Mozilla', value: 'Mozilla', version: 'Mozilla' }, 263 ]; 264 265 const exceptionSLDs = ['co', 'gov', 'ac', 'org', 'edu', 'mil', 'sch', 'biz', 'eun', 'sci', 'nom', 'int']; 266 267 function getDomain_(url, ex_SDLs = exceptionSLDs) { 268 if (url === null) return null; 269 270 const getProtocol = () => window.location.protocol || 'https:'; 271 272 url = url.substring(0, 4) == 'http' ? url : getProtocol() + '//' + url; 273 274 try { 275 const domain = new URL(url).hostname; 276 const sldSet = new Set(ex_SDLs); 277 const domainParts = domain.split('.'); 278 279 if (sldSet.has(domainParts.slice(-2, -1)[0]) && domainParts.length >= 3) { 280 return domainParts.slice(-3).join('.'); 281 } 282 return domainParts.slice(-2).join('.'); 283 } catch (error) { 284 return null; 285 } 286 } 287 288 function getUtmTags() { 289 // get url parameters
290 const urlParams = new URLSearchParams(window.location.search); 291 // then turn them into an object with key: value pairs 292 const urlParamsObject = Object.fromEntries(urlParams); 293 294 const utmTagMap = { 295 utm_source: 'source', 296 utm_medium: 'medium', 297 utm_campaign: 'campaign', 298 utm_content: 'content', 299 utm_term: 'term', 300 }; 301 302 let utmTagResults = {}; 303 304 for (const key in urlParamsObject) { 305 if (utmTagMap.hasOwnProperty(key)) { 306 utmTagResults[utmTagMap[key]] = urlParamsObject[key]; 307 } 308 } 309 310 return Object.keys(utmTagResults).length > 0 ? utmTagResults : null; 311 } 312 313 function getPaidUrlData(urlParamsObject, paidUrlParamsConfig) { 314 // Return first Click Id config found. There should never be more than one anyway. 315 for (const key in urlParamsObject) { 316 if (key in paidUrlParamsConfig) { 317 return true; 318 // return paidUrlParamsConfig[key]; 319 } 320 } 321 if (urlParamsObject.hasOwnProperty('utm_source') && urlParamsObject.hasOwnProperty('fbclid')) { 322 return true; 323 } 324 return null; 325 } 326 327 function getSearchEngineData(referringDomain, urlParamsObject, searchEngineConfig) { 328 if (referringDomain == null) return null; 329 330 if (searchEngineConfig.hasOwnProperty(referringDomain)) { 331 let returnData = { 332 source: searchEngineConfig[referringDomain]['n'], 333 medium: 'organic', 334 }; 335 const search_p = searchEngineConfig[referringDomain]['p']; 336 337 if (urlParamsObject.hasOwnProperty(search_p)) { 338 returnData['term'] = urlParamsObject[search_p]; 339 } 340 341 return returnData; 342 } 343 344 // This bit takes only those searchEngineConfigs where regex == true 345 // if referring domain isn't otherwise found, we will match against regex, but only then 346 const filteredSearchEngineConfig = Object.keys(searchEngineConfig).reduce((result, key) => { 347 if (searchEngineConfig[key]['regex']) { 348 result[key] = searchEngineConfig[key]; 349 } 350 return result; 351 }, {}); 352 353 for (const key in filteredSearchEngineConfig) { 354 let safeKey = key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 355 let regex = new RegExp(safeKey); 356 if (regex.test(referringDomain)) { 357 return { 358 source: searchEngineConfig[key]['n'], 359 medium: 'organic', 360 }; 361 } 362 } 363 364 return null; 365 } 366 367 function getDevice() { 368 const userAgent = navigator.userAgent; 369 const isMobile = /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); 370 const isTablet = /iPad|Android.*Tablet|Kindle|Tablet/i.test(userAgent); 371 372 // Check if Facebook App 373 if (!isMobile && /FBAN|FBAV/i.test(userAgent)) { 374 isMobile = true; 375 } 376 377 let type = 'desktop'; 378 if (isMobile) { 379 type = 'mobile'; 380 } 381 if (isTablet) { 382 type = 'tablet'; 383 } 384 return type; 385 } 386 387 function getBrowser() { 388 const agentString = navigator.userAgent; 389 for (let i = 0; i < dataBrowsers.length; i++) { 390 const browser = dataBrowsers[i]; 391 const regex = new RegExp(browser.value, 'i'); 392 if (regex.test(agentString)) { 393 return browser.name; 394 } 395 } 396 return 'unknown'; 397 } 398 399 function generateUniqueSessionID() { 400 return new Date().getTime() + '_' + Math.random().toString(36).substring(2, 11); 401 } 402 403 function setUniqueSessionID() { 404 let uniqueSessionID = null; 405 406 try { 407 uniqueSessionID = localStorage.getItem('wpg_id'); 408 } catch (error) { 409 console.error('Failed to access localStorage:', error); 410 } 411 412 if (!uniqueSessionID) { 413 try { 414 uniqueSessionID = wpgensUTMCookieManage.get('wpg_id'); 415 } catch (error) { 416 console.error('Failed to access cookies:', error); 417 } 418 } 419 420 if (!uniqueSessionID) { 421 uniqueSessionID = generateUniqueSessionID(); 422 423 try { 424 localStorage.setItem('wpg_id', uniqueSessionID); 425 } catch (error) { 426 console.error('Failed to set localStorage:', error); 427 } 428 429 try { 430 wpgensUTMCookieManage.set('wpg_id', uniqueSessionID, 365); 431 } catch (error) {
432 console.error('Failed to set cookie:', error); 433 } 434 } 435 } 436 437 function get_ga_clientid() { 438 return wpgensUTMCookieManage.get('_ga')?.substring(6); 439 } 440 441 function getTrafficSource() { 442 const urlParams = new URLSearchParams(window.location.search); 443 const urlParamsObject = Object.fromEntries(urlParams.entries()); 444 445 const referrer = document.referrer; 446 const direct = referrer.length === 0; 447 const internal = direct ? false : referrer.indexOf(wpgens_utm.homeUrl) === 0; 448 let referringDomain = getDomain_(referrer, exceptionSLDs); 449 if (internal || direct) { 450 referringDomain = null; 451 const cookie = JSON.parse(wpgensUTMCookieManage.get('wpg_last')); 452 if (cookie) { 453 return cookie; 454 } 455 } 456 457 const utmTags = getUtmTags(); 458 const paidUrlData = getPaidUrlData(urlParamsObject, clickIdentifiers); 459 const searchEngineData = getSearchEngineData(referringDomain, urlParamsObject, searchEngines); 460 461 const queryString = new URLSearchParams(window.location.search); 462 const customParams = {}; 463 if (Array.isArray(wpgens_utm.trackingParams) && wpgens_utm.trackingParams.length > 0) { 464 wpgens_utm.trackingParams.forEach((key) => { 465 const value = queryString.get(key); 466 if (value !== null) { 467 customParams[key] = decodeURIComponent(value); 468 } 469 }); 470 } 471 472 let source = '(Direct)'; 473 let medium = ''; 474 let campaign = utmTags ? utmTags.campaign || '' : ''; 475 let content = utmTags ? utmTags.content || '' : ''; 476 let term = utmTags ? utmTags.term || '' : ''; 477 478 // Set source 479 if (utmTags && utmTags.source) { 480 source = utmTags.source; 481 } else if (referringDomain) { 482 source = searchEngines[referringDomain]?.n || referringDomain; 483 } 484 485 // Set medium 486 if (utmTags && utmTags.medium) { 487 medium = utmTags.medium; 488 } else if (paidUrlData) { 489 medium = 'cpc'; 490 } else if (socialNetworks.includes(referringDomain)) { 491 medium = 'social'; 492 } else if (searchEngineData) { 493 medium = 'organic'; 494 } else if (referringDomain) { 495 medium = 'referral'; 496 } 497 498 let type = '(Direct)'; 499 if (paidUrlData) { 500 type = 'cpc'; 501 } else if (socialNetworks.includes(referringDomain)) { 502 type = 'social'; 503 } else if (searchEngineData) { 504 type = 'organic'; 505 } else if (referringDomain) { 506 type = 'referral'; 507 } 508 509 return { 510 url: window.location.href, 511 lpt: new Date().toISOString(), 512 lp: typeof window.location.pathname !== 'undefined' ? window.location.pathname : '/', 513 type: type, 514 referrer: referringDomain, 515 source: source, 516 medium: medium, 517 campaign: campaign, 518 content: content, 519 term: term, 520 ga_c_id: get_ga_clientid(), 521 device: getDevice(), 522 browser: getBrowser(), 523 custom_params: customParams, 524 }; 525 } 526 527 function wpgensUTMManageCookies() { 528 try { 529 const source = getTrafficSource(); 530 const existingData = wpgensUTMCookieManage.get('wpg_last'); 531 if (JSON.stringify(existingData) !== JSON.stringify(source)) { 532 wpgensUTMCookieManage.set('wpg_last', JSON.stringify(source), wpgens_utm.cookieTime || 7); 533 } 534 return source; 535 } catch (e) { 536 console.log(e); 537 } 538 } 539 540 function getFirstPage() { 541 if (!wpgensUTMCookieManage.get('wpg_first')) { 542 wpgensUTMCookieManage.set('wpg_first', JSON.stringify(getTrafficSource()), 90); 543 } 544 } 545 546 // Dont run on checkout page - need to test this 547 if (!window.location.href.includes(wpgens_utm.checkoutUrl)) { 548 wpgensUTMManageCookies(); 549 getFirstPage(); 550 } 551 552 setUniqueSessionID(); 553})();
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.