(function() { var STORAGE_KEY = 'lemarie_tracking_v1'; var TTL_DAYS = 30; var now = Date.now(); var params = new URLSearchParams(window.location.search); function safeUuid() { if (window.crypto && typeof window.crypto.randomUUID === 'function') { return 'lv_' + window.crypto.randomUUID(); } return 'lv_' + Math.random().toString(36).slice(2) + '_' + Date.now().toString(36); } function getHost(url) { try { return new URL(url).hostname.toLowerCase(); } catch (e) { return ''; } } function isInternalReferrer(referrer) { var host = getHost(referrer); return host !== '' && host === window.location.hostname.toLowerCase(); } function classifyCurrentSource() { var utmSource = (params.get('utm_source') || '').toLowerCase().trim(); var utmMedium = (params.get('utm_medium') || '').toLowerCase().trim(); var utmCampaign = (params.get('utm_campaign') || '').toLowerCase().trim(); var referrer = (document.referrer || '').toLowerCase().trim(); var refHost = getHost(referrer); var hasGoogleAdsId = !!(params.get('gclid') || params.get('gbraid') || params.get('wbraid')); if ( hasGoogleAdsId || utmMedium === 'cpc' || utmMedium === 'ppc' || utmMedium === 'paidsearch' || utmMedium === 'paid_search' || utmSource === 'google_ads' || utmSource === 'googleads' || utmSource === 'google-adwords' || utmCampaign.indexOf('ads') !== -1 || utmCampaign.indexOf('adwords') !== -1 || refHost.indexOf('googleads.g.doubleclick.net') !== -1 || refHost.indexOf('pagead2.googlesyndication.com') !== -1 || refHost.indexOf('syndicatedsearch.goog') !== -1 || refHost.indexOf('googleadservices.com') !== -1 ) { return 'google_ads'; } if ( ['social', 'social-network', 'social_network'].indexOf(utmMedium) !== -1 || ['facebook', 'instagram', 'linkedin', 'twitter', 'x', 'tiktok', 'youtube', 'pinterest'].indexOf(utmSource) !== -1 ) { return 'social'; } if (utmMedium === 'email' || utmSource === 'newsletter') { return 'email'; } if (utmSource || utmMedium) { return 'utm_other'; } if (referrer) { if (isInternalReferrer(referrer)) { return 'internal'; } var searchEngines = ['google.', 'bing.', 'yahoo.', 'duckduckgo.', 'qwant.', 'ecosia.', 'lilo.', 'brave.', 'search.brave.com']; for (var i = 0; i < searchEngines.length; i++) { if (refHost.indexOf(searchEngines[i]) !== -1) { return 'organic'; } } var socials = ['facebook.', 'fb.', 'instagram.', 'linkedin.', 'twitter.', 'x.com', 't.co', 'tiktok.', 'youtube.', 'pinterest.']; for (var j = 0; j < socials.length; j++) { if (refHost.indexOf(socials[j]) !== -1) { return 'social'; } } return 'referral'; } return 'direct'; } function shouldUpdateLastSource(source) { return ['google_ads', 'organic', 'social', 'email', 'utm_other', 'referral'].indexOf(source) !== -1; } function loadState() { try { var raw = window.localStorage.getItem(STORAGE_KEY); if (!raw) { return null; } var state = JSON.parse(raw); if (!state || !state.created_at || now - state.created_at > TTL_DAYS * 24 * 60 * 60 * 1000) { return null; } return state; } catch (e) { return null; } } function saveState(state) { try { window.localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (e) {} } var currentSource = classifyCurrentSource(); var currentLanding = window.location.pathname; var currentReferrer = document.referrer || ''; var state = loadState(); if (!state) { state = { visitor_id: safeUuid(), created_at: now, first_source: currentSource, first_referrer: currentReferrer, first_landing_page: currentLanding, last_source: currentSource, last_referrer: currentReferrer, last_landing_page: currentLanding }; } if (!state.first_source) { state.first_source = currentSource; state.first_referrer = currentReferrer; state.first_landing_page = currentLanding; } if (shouldUpdateLastSource(currentSource)) { state.last_source = currentSource; state.last_referrer = currentReferrer; state.last_landing_page = currentLanding; } state.updated_at = now; saveState(state); fetch('/track.php', { method: 'POST', keepalive: true, headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ site_name: window.location.hostname, page: window.location.pathname, referrer: document.referrer, utm_source: params.get('utm_source') || '', utm_medium: params.get('utm_medium') || '', utm_campaign: params.get('utm_campaign') || '', gclid: params.get('gclid') || '', gbraid: params.get('gbraid') || '', wbraid: params.get('wbraid') || '', visitor_id: state.visitor_id || '', first_source: state.first_source || '', first_referrer: state.first_referrer || '', first_landing_page: state.first_landing_page || '', last_source: state.last_source || '', last_referrer: state.last_referrer || '', last_landing_page: state.last_landing_page || '' }) }); })();