/* Zyap OS Website Intelligence — first-party tracking */ (function () { var script = document.currentScript; var siteKey = script && script.getAttribute('data-site-key'); if (!siteKey) { return; } var endpoint = script.src.replace(/\/zyap-analytics\.js.*$/, '/collect'); var STORAGE_VISITOR = 'zyap_wi_visitor'; var STORAGE_SESSION = 'zyap_wi_session'; function id() { return 'x' + Math.random().toString(36).slice(2) + Date.now().toString(36); } function stored(store, key) { try { var v = store.getItem(key); if (!v) { v = id(); store.setItem(key, v); } return v; } catch (e) { return id(); } } var visitorId = stored(window.localStorage, STORAGE_VISITOR); var sessionId = stored(window.sessionStorage, STORAGE_SESSION); var params = new URLSearchParams(window.location.search); function send(body) { var payload = JSON.stringify(Object.assign({ site_key: siteKey, session_id: sessionId, visitor_id: visitorId }, body)); // sendBeacon survives the page unloading; fetch is the fallback. if (navigator.sendBeacon) { navigator.sendBeacon(endpoint, new Blob([payload], { type: 'application/json' })); } else { fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: payload, keepalive: true }).catch(function () {}); } } function pageview() { var timing = window.performance && window.performance.timing; var loadMs = timing && timing.loadEventEnd && timing.navigationStart ? timing.loadEventEnd - timing.navigationStart : null; send({ referrer: document.referrer || null, utm_source: params.get('utm_source'), utm_medium: params.get('utm_medium'), utm_campaign: params.get('utm_campaign'), screen_resolution: window.screen.width + 'x' + window.screen.height, language: navigator.language, pageviews: [{ path: window.location.pathname, title: document.title, load_time_ms: loadMs && loadMs > 0 ? loadMs : null }] }); } window.zyapTrack = function (name, properties, value) { send({ events: [{ name: name, path: window.location.pathname, properties: properties || {}, value: value }] }); }; function loadTags() { fetch(endpoint.replace(/\/collect$/, '/tags') + '?site_key=' + encodeURIComponent(siteKey)) .then(function (r) { return r.ok ? r.json() : null; }) .then(function (cfg) { if (!cfg || !cfg.tracking_enabled) { return; } function loadScript(src, onload) { if (document.querySelector('script[src="' + src + '"]')) { return; } var s = document.createElement('script'); s.async = true; s.src = src; if (onload) { s.onload = onload; } document.head.appendChild(s); } var ga4 = cfg.ga4_measurement_id && encodeURIComponent(cfg.ga4_measurement_id); var gtm = cfg.gtm_container_id && encodeURIComponent(cfg.gtm_container_id); if (ga4) { window.dataLayer = window.dataLayer || []; window.gtag = window.gtag || function () { window.dataLayer.push(arguments); }; loadScript('https://www.googletagmanager.com/gtag/js?id=' + ga4, function () { window.gtag('js', new Date()); window.gtag('config', cfg.ga4_measurement_id); }); } if (gtm) { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); loadScript('https://www.googletagmanager.com/gtm.js?id=' + gtm); } }) .catch(function () {}); } if (document.readyState === 'complete') { pageview(); loadTags(); } else { window.addEventListener('load', function () { pageview(); loadTags(); }); } })();