`; monthListEl.appendChild(card); }); if (monthWrap) monthWrap.querySelector(".count").textContent = monthCount + (monthCount === 1 ? " event" : " events"); } function renderRecurring() { const root = document.getElementById("recurringRoot"); root.innerHTML = ""; const t0 = today0(); let visible = recurringEvents .filter(e => { if (e.activeFrom && t0 < parseDate(e.activeFrom)) return false; if (e.activeUntil && t0 > parseDate(e.activeUntil)) return false; return true; }) .filter(matchesFilterAndSearch); document.getElementById("recurringSection").style.display = visible.length ? "" : "none"; visible.forEach(e => { const tagClass = e.cat === "civic" ? "civic" : "recurring"; const tagLabel = e.cat === "civic" ? "Civic" : "Recurring"; const card = document.createElement("div"); card.className = "recur-card" + (e.cat === "civic" ? " civic-card" : ""); card.innerHTML = `
${e.title}${tagLabel}
${e.venue} • ${e.schedule}
${e.desc}${e.link ? ` Official schedule →` : ""}
`; root.appendChild(card); }); } function updateEmptyState() { const empty = document.getElementById("emptyState"); const datedVisible = document.getElementById("datedSection").style.display !== "none"; const recurringVisible = document.getElementById("recurringSection").style.display !== "none"; empty.style.display = (!datedVisible && !recurringVisible) ? "block" : "none"; } function render() { renderDated(); renderRecurring(); updateEmptyState(); } function renderTodayStrip() { const t0 = today0(); const strip = document.getElementById("todayStrip"); const upcoming = datedEvents .filter(e => parseDate(e.date) >= t0) .filter(e => e.cat === "signature" || e.cat === "arts") .sort((a,b) => parseDate(a.date) - parseDate(b.date)) .slice(0, 2); const dateStr = t0.toLocaleDateString(undefined, { weekday: "long", year: "numeric", month: "long", day: "numeric" }); let next = upcoming.map(e => e.title + " (" + monthNames[parseDate(e.date).getMonth()] + " " + parseDate(e.date).getDate() + ")").join(" · "); strip.innerHTML = "
" + (next ? " Next up: " + next : ""); } document.getElementById("searchBox").addEventListener("input", (ev) => { searchTerm = ev.target.value.trim().toLowerCase(); render(); }); document.querySelectorAll(".filter-btn").forEach(btn => { btn.addEventListener("click", () => { document.querySelectorAll(".filter-btn").forEach(b => b.classList.remove("active")); btn.classList.add("active"); activeFilter = btn.dataset.filter; render(); }); }); document.getElementById("pageTitle").textContent = "Marco Island Events Calendar — " + CALENDAR_YEAR; document.getElementById("lastUpdatedBadge").textContent = "Last refreshed: " + LAST_UPDATED; renderTodayStrip(); render();