// Simple analytics tracking for ISSINFO.NET // This script tracks page views and sends them to our analytics API (function() { 'use strict'; // Generate a session ID for this browser session function generateSessionId() { let sessionId = sessionStorage.getItem('session_id'); if (!sessionId) { sessionId = 'sess_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now(); sessionStorage.setItem('session_id', sessionId); } return sessionId; } // Get current page path function getCurrentPage() { return window.location.pathname; } // Get referrer (cleaned up) function getReferrer() { const referrer = document.referrer; if (!referrer) return ''; try { const referrerUrl = new URL(referrer); // Don't track internal referrals if (referrerUrl.hostname === window.location.hostname) { return ''; } return referrerUrl.hostname; } catch (e) { return ''; } } // Get user agent function getUserAgent() { return navigator.userAgent; } // Get screen resolution function getScreenResolution() { return screen.width + 'x' + screen.height; } // Get user's location (with permission) function getUserLocation() { return new Promise((resolve) => { // Don't request GPS location - rely on IP-based geolocation instead resolve({ latitude: 0, longitude: 0 }); }); } // Track page view async function trackPageView(heartbeat = false) { try { const location = await getUserLocation(); const data = { sessionId: generateSessionId(), page: getCurrentPage(), referrer: getReferrer(), userAgent: getUserAgent(), screen_resolution: getScreenResolution(), timestamp: new Date().toISOString(), latitude: location.latitude, longitude: location.longitude, heartbeat: heartbeat }; // Send to analytics API fetch('/api/analytics/track', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data) }).catch(err => { // Silently fail - don't block the page console.debug('Analytics tracking failed:', err); }); } catch (error) { console.debug('Analytics error:', error); } } // Track initial page view if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => trackPageView()); } else { trackPageView(); } // Track heartbeat every 30 seconds to show active sessions setInterval(() => { trackPageView(true); }, 30000); // Track page visibility changes document.addEventListener('visibilitychange', () => { if (!document.hidden) { trackPageView(true); } }); })();