{
  "version": 3,
  "sources": ["/cdn/shop/t/50/assets/bfcm-optin-counter.js?enable_js_minification=1"],
  "sourcesContent": ["// Count is calculated from the END time, in UTC: ceil((END_DATE - now) / 15 minutes).\n// Fri 11/13/2026 12:00 AM CT = 06:00 UTC. After the end it loops RESET_COUNT..1 every 15 minutes, forever.\nconst END_DATE = '2026-11-13T06:00:00Z';\nconst TIME_API_URL = 'https://worldtimeapi.org/api/timezone/UTC';\nconst COUNT_SELECTOR = '.count';\nconst DIGIT_SPAN_SELECTOR = ':scope > span';\nconst FORM_SELECTOR = '#ps__subscribe-form form';\nconst INITIAL_COUNT = 2068; // starting value of the page-load roll-in animation only\nconst RESET_COUNT = 88;\nconst PERIOD_MS = 1000 * 60 * 15;\nconst END_TIME = new Date(END_DATE).getTime();\nlet isAnimating = false;\nlet serverTimeOffset = 0;\nasync function syncTime() {\n    try {\n        const response = await fetch(TIME_API_URL, { cache: 'no-store' });\n        const data = await response.json();\n        serverTimeOffset = new Date(data.datetime).getTime() - Date.now();\n    } catch (error) {\n        serverTimeOffset = 0;\n    }\n}\nfunction calculateCount() {\n    const currentTime = Date.now() + serverTimeOffset;\n    const msToEnd = END_TIME - currentTime;\n    if (msToEnd > 0) {\n        return Math.ceil(msToEnd / PERIOD_MS);\n    }\n    // At or after the end: when the count would hit 0 it resets to RESET_COUNT and counts down to 1.\n    const periodsAfterEnd = Math.floor(-msToEnd / PERIOD_MS);\n    return RESET_COUNT - (periodsAfterEnd % RESET_COUNT);\n}\nfunction updateDisplay(count) {\n    const counters = document.querySelectorAll(COUNT_SELECTOR);\n    counters.forEach(counter => {\n        const spans = counter.querySelectorAll(DIGIT_SPAN_SELECTOR);\n        const countStr = count.toString().padStart(spans.length, '0');\n        for (let i = 0; i < spans.length; i++) {\n            spans[i].textContent = countStr[i] || '0';\n        }\n    });\n}\nfunction animateCountdown(startValue, endValue, duration = 2500) {\n    isAnimating = true;\n    let startTime = null;\n    const animate = (timestamp) => {\n        if (!startTime) startTime = timestamp;\n        const progress = Math.min((timestamp - startTime) / duration, 1);\n        const currentValue = Math.floor(progress * (endValue - startValue) + startValue);\n        updateDisplay(currentValue);\n        if (progress < 1) {\n            requestAnimationFrame(animate);\n        } else {\n            isAnimating = false;\n        }\n    };\n    requestAnimationFrame(animate);\n}\nfunction scheduleNext() {\n    const currentTime = Date.now() + serverTimeOffset;\n    // Boundaries are every 15 minutes counted from END_TIME, before and after it.\n    let msIntoPeriod = ((END_TIME - currentTime) % PERIOD_MS + PERIOD_MS) % PERIOD_MS;\n    if (msIntoPeriod === 0) {\n        msIntoPeriod = PERIOD_MS;\n    }\n    const timeUntilNext = Math.max(100, msIntoPeriod);\n    setTimeout(() => {\n        if (!isAnimating) {\n            const count = calculateCount();\n            const currentDisplayed = getCurrentDisplayed();\n            if (count !== currentDisplayed) {\n                animateCountdown(currentDisplayed, count, 1000);\n            }\n        }\n        scheduleNext();\n    }, timeUntilNext);\n}\nfunction startCountdown() {\n    const currentCount = calculateCount();\n    animateCountdown(INITIAL_COUNT, currentCount);\n    syncTime().then(() => {\n        const correctedCount = calculateCount();\n        if (correctedCount !== currentCount) {\n            setTimeout(() => animateCountdown(currentCount, correctedCount, 1000), 2500);\n        }\n    });\n    scheduleNext();\n}\nfunction getCurrentDisplayed() {\n    const counter = document.querySelector(COUNT_SELECTOR);\n    if (!counter) return 0;\n    const spans = counter.querySelectorAll(DIGIT_SPAN_SELECTOR);\n    let displayedStr = '';\n    for (let i = 0; i < spans.length; i++) {\n        displayedStr += spans[i].textContent || '0';\n    }\n    return parseInt(displayedStr, 10) || 0;\n}\nfunction setupFormListener() {\n    const form = document.querySelector(FORM_SELECTOR);\n    if (form) {\n        form.addEventListener('submit', function(e) {\n            // Form submission no longer redirects\n        });\n    }\n}\nfunction setupPhoneValidation() {\n    const phoneField = document.querySelector('#ps__phone-subscribe');\n    if (phoneField) {\n        phoneField.required = true;\n        phoneField.pattern = '^[\\\\+]?[1-9]\\\\d{6,14}$|^[\\\\+]?[\\\\d\\\\s\\\\-\\\\(\\\\)\\\\.]{7,18}$';\n        phoneField.addEventListener('invalid', function() {\n            const errorElement = document.querySelector('.error');\n            if (errorElement) {\n                errorElement.style.display = 'block';\n            }\n        });\n        phoneField.addEventListener('input', function() {\n            if (phoneField.validity.valid) {\n                const errorElement = document.querySelector('.error');\n                if (errorElement) {\n                    errorElement.style.display = 'none';\n                }\n            }\n        });\n    }\n}\nif (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => {\n        startCountdown();\n        setupPhoneValidation();\n        //setupFormListener();\n    });\n} else {\n    startCountdown();\n    setupPhoneValidation();\n    //setupFormListener();\n}"],
  "mappings": "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",
  "names": []
}
