{
  "version": 3,
  "sources": ["js/analytics.js"],
  "sourcesContent": ["// Bounded first-party business events. Identifiers/context come from rendered server data.\nlet queue = [];\nlet timer;\nlet observer;\nlet mutations;\nlet observed = new WeakSet();\nconst sent = new WeakSet();\nlet scanScheduled = false;\nconst enabled = () => document.body?.dataset.analyticsEnabled === 'true' && navigator.doNotTrack !== '1' && !navigator.globalPrivacyControl;\nfunction flush() {\n    clearTimeout(timer);\n    if (!queue.length || !enabled()) return;\n    const events = queue.splice(0, 20);\n    const token = document.querySelector('meta[name=\"analytics-csrf-token\"]')?.content;\n    if (!token) return;\n    // Navigation must never wait for analytics; no unbounded retry or persistent queue.\n    fetch('/analytics/events', {method: 'POST', credentials: 'same-origin', keepalive: true,\n        headers: {'Content-Type': 'application/json', 'X-Analytics-Token': token},\n        body: JSON.stringify({events})}).catch(() => {});\n    if (queue.length) timer = setTimeout(flush, 1000);\n}\nfunction record(element, eventName, extra = {}) {\n    if (!enabled() || !globalThis.crypto?.randomUUID || queue.length >= 40) return false;\n    const context = element.closest('[data-analytics-context]');\n    const result = element.closest('[data-analytics-offer]');\n    const link = element.closest('[data-analytics-product]');\n    const event = {event_id: crypto.randomUUID(), event_name: eventName,\n        search_id: context?.dataset.analyticsSearchId,\n        context_token: context?.dataset.analyticsContextToken,\n        product_id: result?.dataset.analyticsProduct || link?.dataset.analyticsProduct || context?.dataset.analyticsProduct,\n        offer_id: result?.dataset.analyticsOffer, ...extra};\n    queue.push(event);\n    clearTimeout(timer);\n    timer = setTimeout(flush, 1000);\n    return true;\n}\nfunction scan() {\n    if (!enabled()) return;\n    document.querySelectorAll('[data-analytics-offer]').forEach(element => {\n        if (!observed.has(element) && !sent.has(element)) { observed.add(element); observer.observe(element); }\n    });\n}\nfunction start() {\n    observer?.disconnect();\n    mutations?.disconnect();\n    if (!enabled() || !('IntersectionObserver' in window)) return;\n    observed = new WeakSet();\n    observer = new IntersectionObserver(entries => entries.forEach(entry => {\n        if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {\n            if (record(entry.target, 'offer_impression')) { sent.add(entry.target); observer.unobserve(entry.target); }\n        }\n    }), {threshold: 0.5});\n    scan();\n    mutations = new MutationObserver(() => {\n        if (scanScheduled) return;\n        scanScheduled = true;\n        queueMicrotask(() => { scanScheduled = false; scan(); });\n    });\n    mutations.observe(document.body, {childList: true, subtree: true});\n}\ndocument.addEventListener('click', event => {\n    const element = event.target.closest?.('[data-analytics-click]');\n    if (!element) return;\n    record(element, element.dataset.analyticsClick, element.dataset.analyticsSection ? {section: element.dataset.analyticsSection} : {});\n    flush();\n});\ndocument.addEventListener('turbo:before-visit', flush);\ndocument.addEventListener('turbo:before-cache', () => { flush(); observer?.disconnect(); mutations?.disconnect(); });\ndocument.addEventListener('turbo:load', start);\ndocument.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') flush(); });\nwindow.addEventListener('pagehide', flush);\nif (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start); else start();\n\n// AI connection events carry an explicit bounded schema and no product context.\ndocument.addEventListener('hp:ai-event', event => {\n    if (!enabled() || !globalThis.crypto?.randomUUID || queue.length >= 40) return;\n    const {event_name, properties} = event.detail || {};\n    if (!['ai_page_view', 'ai_client_select', 'ai_connection_copy', 'ai_help_click'].includes(event_name)) return;\n    queue.push({event_id: crypto.randomUUID(), event_name, properties,\n        context_token: document.querySelector('[data-ai-context-token]')?.dataset.aiContextToken});\n    clearTimeout(timer);\n    timer = setTimeout(flush, 1000);\n});\n"],
  "mappings": "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",
  "names": ["__name", "events", "token", "element", "eventName", "extra", "context", "result", "link", "event", "entries", "entry", "event_name", "properties"]
}
