PageSourceSearch

https://www.petersons.com/testprep/wp-content/plugins/wpgens-utm-tracking/assets/wpgens-st-public.js?ver=2.1.0

js petersons.com collected 2026-09-24 08:38:46 UTC 16,048 bytes, 553 lines download raw bytes

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.