1document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(".countdown-banner").forEach(function(banner){initializeCountdown(banner)});function getNextMidnightUSTimezone(){const now=new Date,formatter=new Intl.DateTimeFormat("en-US",{timeZone:"Europe/London",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),parts=formatter.formatToParts(now),currentYear=parseInt(parts.find(p=>p.type==="year").value),currentMonth=parseInt(parts.find(p=>p.type==="month").value),currentDay=parseInt(parts.find(p=>p.type==="day").value),currentHour=parseInt(parts.find(p=>p.type==="hour").value),currentMinute=parseInt(parts.find(p=>p.type==="minute").value),currentSecond=parseInt(parts.find(p=>p.type==="second").value),currentTimeMs=(currentHour*3600+currentMinute*60+currentSecond)*1e3,dayMs=24*3600*1e3,msUntilMidnight=dayMs-currentTimeMs,targetDateStr=`${currentYear}-${String(currentMonth).padStart(2,"0")}-${String(currentDay).padStart(2,"0")}`,targetTimeStr="00:00";let targetDate=parseDateInUSTimezone(targetDateStr,targetTimeStr);if(targetDate.getTime()<=now.getTime()){const tomorrow=new Date(targetDate.getTime()+dayMs),tomorrowParts=formatter.formatToParts(tomorrow),tomorrowYear=parseInt(tomorrowParts.find(p=>p.type==="year").value),tomorrowMonth=parseInt(tomorrowParts.find(p=>p.type==="month").value),tomorrowDay=parseInt(tomorrowParts.find(p=>p.type==="day").value),tomorrowDateStr=`${tomorrowYear}-${String(tomorrowMonth).padStart(2,"0")}-${String(tomorrowDay).padStart(2,"0")}`;targetDate=parseDateInUSTimezone(tomorrowDateStr,targetTimeStr)}return targetDate}function parseDateInUSTimezone(dateStr,timeStr){const[year,month,day]=dateStr.split("-").map(Number),[hours,minutes]=timeStr.split(":").map(Number);let targetUTC=Date.UTC(year,month-1,day,hours,minutes,0);const formatter=new Intl.DateTimeFormat("en-US",{timeZone:"Europe/London",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1});for(let i=0;i<10;i++){const checkDate=new Date(targetUTC),parts=formatter.formatToParts(checkDate),checkYear=parseInt(parts.find(p=>p.type==="year").value),checkMonth=parseInt(parts.find(p=>p.type==="month").value),checkDay=parseInt(parts.find(p=>p.type==="day").value),checkHour=parseInt(parts.find(p=>p.type==="hour").value),checkMinute=parseInt(parts.find(p=>p.type==="minute").value);if(checkYear===year&&checkMonth===month&&checkDay===day&&checkHour===hours&&checkMinute===minutes)break;const checkLocal=new Date(checkYear,checkMonth-1,checkDay,checkHour,checkMinute,0),diffMs=new Date(year,month-1,day,hours,minutes,0).getTime()-checkLocal.getTime();if(targetUTC+=diffMs,Math.abs(diffMs)<1e3)break}return new Date(targetUTC)}function initializeCountdown(bannerElement){const timerElement=bannerElement.querySelector(".countdown-banner__timer");if(!timerElement)return;const countdownMode=bannerElement.getAttribute("data-countdown-mode")||"daily_24h",targetDateStr=bannerElement.getAttribute("data-target-date"),targetTimeStr=bannerElement.getAttribute("data-target-time")||"23:59",showDays=bannerElement.getAttribute("data-show-days")==="true",showTimerAfterExpired=bannerElement.getAttribute("data-show-timer-after-expired")==="true";let targetDate;if(countdownMode==="daily_24h"){const sessionKey="countdown_banner_daily_24h",savedDate=localStorage.getItem(sessionKey),savedTimestamp=savedDate?parseInt(savedDate):null,now=new Date().getTime();if(savedTimestamp&&savedTimestamp>now){const savedDateObj=new Date(savedTimestamp),formatter=new Intl.DateTimeFormat("en-US",{timeZone:"Europe/London",year:"numeric",month:"2-digit",day:"2-digit"}),savedParts=formatter.formatToParts(savedDateObj),nowParts=formatter.formatToParts(new Date),savedDay=savedParts.find(p=>p.type==="day").value,nowDay=nowParts.find(p=>p.type==="day").value,savedMonth=savedParts.find(p=>p.type==="month").value,nowMonth=nowParts.find(p=>p.type==="month").value,savedYear=savedParts.find(p=>p.type==="year").value,nowYear=nowParts.find(p=>p.type==="year").value;savedDay===nowDay&&savedMonth===nowMonth&&savedYear===nowYear?targetDate=savedDateObj:(targetDate=getNextMidnightUSTimezone(),localStorage.setItem(sessionKey,targetDate.getTime().toString()))}else targetDate=getNextMidnightUSTimezone(),localStorage.setItem(sessionKey,targetDate.getTime().toString())}else if(countdownMode==="specific_date"&&targetDateStr)try{targetDate=parseDateInUSTimezone(targetDateStr,targetTimeStr),isNaN(targetDate.getTime())&&(targetDate=getNextMidnightUSTimezone())}catch{targetDate=getNextMidnightUSTimezone()}else targetDate=getNextMidnightUSTimezone();const daysElement=showDays?timerElement.querySelector("#countdown-days"):null,hoursElement=timerElement.querySelector("#countdown-hours"),minutesElement=timerElement.querySelector("#countdown-minutes"),secondsElement=timerElement.querySelector("#countdown-seconds");
1if(!hoursElement||!minutesElement||!secondsElement)return;const countdownInterval=setInterval(function(){updateCountdown(targetDate,daysElement,hoursElement,minutesElement,secondsElement,bannerElement,countdownInterval,countdownMode,showDays,showTimerAfterExpired)},1e3);updateCountdown(targetDate,daysElement,hoursElement,minutesElement,secondsElement,bannerElement,countdownInterval,countdownMode,showDays,showTimerAfterExpired)}function updateCountdown(targetDate,daysElement,hoursElement,minutesElement,secondsElement,bannerElement,interval,countdownMode,showDays,showTimerAfterExpired){const now=new Date().getTime();let distance=targetDate.getTime()-now;if(distance<0)if(countdownMode==="daily_24h"){const newTargetDate=getNextMidnightUSTimezone();localStorage.setItem("countdown_banner_daily_24h",newTargetDate.getTime().toString()),targetDate=newTargetDate,distance=targetDate.getTime()-now}else{clearInterval(interval),daysElement&&(daysElement.textContent="00"),hoursElement.textContent="00",minutesElement.textContent="00",secondsElement.textContent="00",bannerElement.classList.add("expired");const timerContainer=bannerElement.querySelector("[data-timer-container]"),textElement=bannerElement.querySelector("[data-text-element]"),expiredTextElement=bannerElement.querySelector("[data-expired-text]");timerContainer&&(showTimerAfterExpired?timerContainer.style.display="flex":timerContainer.style.display="none"),textElement&&(textElement.style.display="none"),expiredTextElement&&(expiredTextElement.style.display="block");const contentElement=bannerElement.querySelector(".countdown-banner__content");contentElement&&(contentElement.style.justifyContent="center");return}const days=showDays?Math.floor(distance/(1e3*60*60*24)):0,hours=Math.floor(distance%(1e3*60*60*24)/(1e3*60*60)),minutes=Math.floor(distance%(1e3*60*60)/(1e3*60)),seconds=Math.floor(distance%(1e3*60)/1e3);daysElement&&showDays&&updateTimeDisplay(daysElement,days,2),updateTimeDisplay(hoursElement,hours,2),updateTimeDisplay(minutesElement,minutes,2),updateTimeDisplay(secondsElement,seconds,2)}function updateTimeDisplay(element,value,minDigits=2){const formattedValue=value.toString().padStart(minDigits,"0");element.textContent!==formattedValue&&(element.textContent=formattedValue)}window.countdownBanner={reset:function(){localStorage.removeItem("countdown_banner_daily_24h"),location.reload()},getTimeRemaining:function(){const savedEndTime=localStorage.getItem("countdown_banner_daily_24h");if(savedEndTime){const now=new Date().getTime(),distance=parseInt(savedEndTime)-now;return Math.max(0,distance)}return 0}}}); 2//# sourceMappingURL=/cdn/shop/t/74/assets/countdown-banner.js.map?v=74164278964207897081764285712
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.