document.addEventListener("DOMContentLoaded", function() { const cutoffHour = 16; function formatKey(d){ return d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0'+d.getDate()).slice(-2); } function isHoliday(d, holidays){ return holidays.includes(formatKey(d)); } function isBusinessDay(d, holidays){ const day = d.getDay(); if (day === 0 || day === 6) return false; return !isHoliday(d, holidays); } function formatDate(d){ return d.toLocaleDateString('en-GB', { weekday:'long', day:'numeric', month:'long' }); } function getBaseDate(holidays){ let d = new Date(); if (d.getHours() >= cutoffHour || !isBusinessDay(d, holidays)) { d.setDate(d.getDate() + 1); } while (!isBusinessDay(d, holidays)) { d.setDate(d.getDate() + 1); } return d; } function addBusinessDays(start, days, holidays){ let d = new Date(start); let added = 0; while (added < days) { d.setDate(d.getDate() + 1); if (isBusinessDay(d, holidays)) added++; } return d; } function initETA() { document.querySelectorAll('.awn-eta').forEach(function(block){ const minDays = parseInt(block.dataset.min); const maxDays = parseInt(block.dataset.max); const holidays = JSON.parse(block.dataset.holidays); const rangeEl = block.querySelector('.awn-eta-range'); const dispatchEl = block.querySelector('.awn-eta-dispatch'); const base = getBaseDate(holidays); const min = addBusinessDays(base, minDays, holidays); const max = addBusinessDays(base, maxDays, holidays); rangeEl.textContent = formatDate(min) + ' – ' + formatDate(max); const now = new Date(); const cutoff = new Date( now.getFullYear(), now.getMonth(), now.getDate(), cutoffHour,0,0,0 ); if (isBusinessDay(now, holidays) && now < cutoff) { function tick(){ const n = new Date(); const diff = cutoff - n; if (diff <= 0) return; const h = Math.floor(diff / 3600000); const m = Math.floor((diff % 3600000)/60000); const s = Math.floor((diff % 60000)/1000); dispatchEl.innerHTML = 'Order within ' + h+'h '+m+'m '+s+'s for dispatch today'; } tick(); setInterval(tick, 1000); } else { dispatchEl.innerHTML = 'Orders placed now ship ' + formatDate(base) + ''; } }); } initETA(); });