// Calendar tab — timezone-aware (auto-converts to your local time) (() => { const FIREBASE_CONFIG = { apiKey: "AIzaSyDuSjEGEKx5FnWYnQq8f_owbpYRBRrl5x0", authDomain: "esef-514bf.firebaseapp.com", projectId: "esef-514bf", storageBucket: "esef-514bf.firebasestorage.app", messagingSenderId: "353969651290", appId: "1:353969651290:web:41e3aaf8e54c743702a263" }; const WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; const MONTHS = ["January","February","March","April","May","June", "July","August","September","October","November","December"]; document.addEventListener("DOMContentLoaded", () => { const tab = document.getElementById("calendar"); if (!tab) return; if (!firebase.apps.length) firebase.initializeApp(FIREBASE_CONFIG); const db = firebase.firestore(); let allEvents = []; const now = new Date(); let viewYear = now.getFullYear(); let viewMonth = now.getMonth(); const gridEl = document.getElementById("cal-grid"); const navEl = document.getElementById("cal-nav-title"); const sidebarEl = document.getElementById("cal-sidebar-list"); db.collection("calendar_events").onSnapshot(snap => { allEvents = snap.docs.map(doc => toEvent(doc.data())); allEvents.sort((a, b) => a.when - b.when); render(); }, () => { gridEl.innerHTML = '
Could not load.
'; }); document.getElementById("cal-prev").onclick = () => shiftMonth(-1); document.getElementById("cal-next").onclick = () => shiftMonth(1); // Auto-refresh every 60s so "Upcoming" stays current as time passes setInterval(render, 60000); function shiftMonth(delta) { // Day 1 avoids overflow (e.g. Jan 31 + 1 month → Mar 3) const d = new Date(viewYear, viewMonth + delta, 1); viewYear = d.getFullYear(); viewMonth = d.getMonth(); render(); } function render() { navEl.textContent = MONTHS[viewMonth] + " " + viewYear; const byDate = {}; allEvents.forEach(e => { (byDate[e.date] = byDate[e.date] || []).push(e); }); const firstDay = new Date(viewYear, viewMonth, 1).getDay(); const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate(); const todayStr = ymd(new Date()); let html = ""; WEEKDAYS.forEach(d => html += 'No upcoming events.
Use !book in Discord.