function getCookie(name) { let namePart = name + '=', decodedCookie = decodeURIComponent(document.cookie), cookies = decodedCookie.split(';'); for(let index = 0; index < cookies.length; index++) { let cookie = cookies[index]; while (cookie.charAt(0) === ' ') { cookie = cookie.substring(1); } if (cookie.indexOf(namePart) === 0) { return cookie.substring(namePart.length, cookie.length); } } return null; } function setCookie(name, value, expireDays = 0, domain = '') { domain = domain ? domain : location.host; let expires = ''; if (expireDays) { let date = new Date(); date.setTime(date.getTime() + (expireDays * 24 * 60 * 60 * 1000)); expires = 'expires=' + date.toUTCString(); } document.cookie = name + '=' + value + ';domain=.' + domain + ';path=/;' + expires; } function getParameterByName(name, defaultValue = null) { let parameter = getQueryParameterByName(name); if (parameter) { return parameter; } parameter = getCookie(name); return parameter ? parameter : defaultValue; } function getQueryParameterByName(name, url = window.location.href) { let urlObject = new URL(url), urlParameters = urlObject.searchParams; return urlParameters.has(name) ? decodeURIComponent(urlParameters.get(name)) : null; } function uidGenerate(length) { let result = '', characters = 'abcdefghijklmnopqrstuvwxyz', charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } function uid() { let clickIdValue = clickId(); if (clickIdValue) { return clickIdValue; } let subIdValue = subId(); if (subIdValue) { return subIdValue; } let userId = getCookie('uid'); if (!userId) { userId = uidGenerate(8); setCookie('uid', userId); } return userId; } function clickId() { let clickIdValue = getParameterByName('clickid'); if (clickIdValue) { return clickIdValue; } clickIdValue = getParameterByName('click-id'); if (!clickIdValue) { return getParameterByName('click_id'); } return clickIdValue; } function subId() { let subIdValue = getParameterByName('subid'); if (subIdValue) { return subIdValue; } subIdValue = getParameterByName('sub-id'); if (!subIdValue) { return getParameterByName('sub_id'); } return subIdValue; } function executeOnReady(callback) { if (document.readyState !== 'loading') { callback(); } else { document.addEventListener('DOMContentLoaded', callback); } } function mixPanelInit() { let userId = uid(); mixpanel.init('9d1f06337c788fcd584725b02fc2e601', {debug: false, track_pageview: false, ignore_dnt: true}); mixpanel.register({distinct_id: userId, $user_id: userId}); mixpanel.identify(userId); } function mixPanelEvent(eventName, options = {}) { mixpanel.people.set_once(options); mixpanel.track(eventName, options); } function yandexGoal(goalName) { if ('ym' in window) { ym(96921485, 'reachGoal', goalName); } } function downloadFromUrl(url) { let downloadIframe = document.querySelector('.download-kit-frame'); if (!downloadIframe) { downloadIframe = document.createElement('iframe'); downloadIframe.setAttribute('style', 'position:absolute;top:-9999px;left:-9999px;visibility:hidden;width:1px;height:1px;border:0;'); downloadIframe.classList.add('download-kit-frame'); document.body.appendChild(downloadIframe); } downloadIframe.setAttribute('src', url); } function downloadFromFile(url, filename) { // Construct the element let link = document.createElement('a'); link.download = filename; link.href = url; document.body.appendChild(link); link.click(); document.body.removeChild(link); } function download(url) { let link = document.querySelector('[data-download="link"]'); link.href = url; link.click(); } function isMobile() { return (new RegExp('Android|BlackBerry|iPhone|iPod|Opera Mini', 'i')) .test(window.navigator.userAgent.toString()); } window.trackingBlocked = false; window.addEventListener('error', function (event) { let analyticOptions = analyticEventOptions(); analyticOptions.error = event.message; fireTest('window_error', analyticOptions); }); //setInterval(function () {console.log(document.hidden)}, 500) function detectTrackingBlocked(callback) { let img = document.querySelector('.tracking-img'); if (img) { callback(window.trackingBlocked); return; } let imgElement = document.createElement('img'); imgElement.src = 'https://cdn.mxpnl.com/marketing-site/static/favicons/favicon-16x16.png'; imgElement.style.display = 'none'; imgElement.classList.add('tracking-img'); imgElement.addEventListener('load', function(){ window.trackingBlocked = false; //mixPanelEvent('tracking_image_load', analyticEventOptions()); callback(window.trackingBlocked); }); imgElement.addEventListener('error', function(){ window.trackingBlocked = true; //fireTest('tracking_image_not_load', analyticEventOptions()); callback(window.trackingBlocked); }); document.body.appendChild(imgElement); } function analyticEventOptions() { let globalTestId = getCookie('gid'), designTestId = getCookie('dt_id'), host = location.host, designGroup = 'Main', options = {}; if (designTestId) { designGroup = getCookie('dt_gr'); options.design_test_group = designGroup; options.design_test_id = designTestId; } else { options.design_test_group = null; options.design_test_id = null; } if (globalTestId) { options.test_group = getCookie('ggr') ?? 'Main'; options.test_id = globalTestId; } else { options.test_group = null; options.test_id = null; } if (host === 'cint.pbrowse.me') { options.app = 'privacy3'; } else if (host === 'cintlp.pgaurdroute.me') { options.app = 'privacy2'; } else { options.app = 'privacy1'; } options.host = host; options.ua = window.navigator.userAgent; options.design_group = designGroup; options.device = isMobile() ? 'mobile' : 'desktop'; options.tracking = !window.trackingBlocked; options.user_id = uid(); options.otid = getParameterByName('otid', ''); let url = new URL(document.location.href), parameters = url.searchParams; parameters.forEach(function (value, key) { options[key] = value; }); return options; } function fireEvent(event, page, additionalOptions = {}) { if (typeof mixpanel.track !== 'function') { mixPanelInit(); } detectTrackingBlocked(function (trackingBlocked) { let options = analyticEventOptions(); options.page = page; Object.keys(additionalOptions).forEach((key) => { if (additionalOptions.hasOwnProperty(key)) { options[key] = additionalOptions[key]; } }); if (typeof mixpanel.track !== 'function') { fireTest('mixpanel_not_init', options); } if (trackingBlocked) { fireTest(event, options); if (event === 'page_load') { fireUntrackedPixel(0); } } else { mixPanelEvent(event, options); yandexGoal(event); fireSignal(event, options); } }); } function fireTest(event, properties = {}) { properties.design_group = window.trackingBlocked ? 'Test' : 'Main'; properties.referrer = document.location.href; properties.event = event; const formData = new FormData() formData.append('uid', uid()); formData.append('event', event); formData.append('options', JSON.stringify(properties)); fetch(location.origin + '/lp/signal-t/', { method: 'POST', cache: 'no-cache', credentials: 'same-origin', body: formData }).then(function(response) { return response.text() }); } function fireSignal(signalName, options) { options['event'] = signalName; let signalData = { source: 'bridge_page', keyword: 'landing_page', signal_type: 'bridge_keyword_load', val: JSON.stringify(options), device: isMobile() ? 'mobile' : 'desktop', geo: 'us' }; let request = new FormData(); request.append('signals', JSON.stringify([signalData])); fetch(location.origin + '/lp/signal/', { method: 'POST', mode: 'no-cors', credentials: 'same-origin', headers: { 'Content-Type': 'application/json' }, body: request }) .then(function (response) { return response.text(); }) .catch(function (error) {console.log(error)}); } function fireUntrackedPixel(tracking) { let pixelUrl = new URL('https://get.searcheasily.net/report/desktop-apps/?action=page_load'); pixelUrl.searchParams.set('cid', getParameterByName('cid', '')); pixelUrl.searchParams.set('clickid', clickId() ?? ''); pixelUrl.searchParams.set('tracking', tracking); fetch(pixelUrl.href, { method: 'GET', cache: 'no-cache', credentials: 'same-origin', }) .then(function (response) {return response.text()}) .catch(function (error) {console.log(error)}); } function fireUserPropertyUpdate(properties) { if (typeof mixpanel.track !== 'function') { mixPanelInit(); } detectTrackingBlocked(function (trackingBlocked) { if (!trackingBlocked) { mixpanel.people.set(properties); } }); }