format('Y'));
$startMonth = (int)($_GET['month'] ?? $today->format('n'));
// Clamp
if ($startMonth < 1) { $startMonth = 12; $startYear--; }
if ($startMonth > 12) { $startMonth = 1; $startYear++; }
// Build the 3-month window: startMonth, +1, +2
$months = [];
for ($i = 0; $i < 3; $i++) {
$m = $startMonth + $i;
$y = $startYear;
if ($m > 12) { $m -= 12; $y++; }
$months[] = ['year' => $y, 'month' => $m];
}
// ── Fetch all events across the 3-month window ────────────────────────────
// Window: first day of startMonth → last day of startMonth+2
$windowStart = sprintf('%04d-%02d-01', $months[0]['year'], $months[0]['month']);
$lastMo = $months[2];
$lastDay = (int)(new DateTime("{$lastMo['year']}-{$lastMo['month']}-01"))->format('t');
$windowEnd = sprintf('%04d-%02d-%02d', $lastMo['year'], $lastMo['month'], $lastDay);
$events = [];
try {
$stmt = $pdo->prepare(
"SELECT a." . COL_ART_ID . ", a." . COL_ART_TITLE . ",
a." . COL_ART_AUTHOR . ", a." . COL_ART_FEATURED . ",
a." . COL_ART_EVENT_DATE . ", a." . COL_ART_EVENT_TIME . ",
a." . COL_ART_LOCATION . "
FROM " . TBL_ARTICLE . " a
INNER JOIN " . TBL_TOPIC . " t ON a." . COL_ART_TOPIC_ID . " = t." . COL_TOPIC_ID . "
WHERE t." . COL_TOPIC_SLUG . " = 'event'
AND a." . COL_ART_ACTIVE . " = 1
AND a." . COL_ART_EVENT_DATE . " BETWEEN :start AND :end
ORDER BY a." . COL_ART_EVENT_DATE . " ASC, a." . COL_ART_EVENT_TIME . " ASC"
);
$stmt->execute([':start' => $windowStart, ':end' => $windowEnd]);
$events = $stmt->fetchAll();
} catch (Exception $e) {}
// Group events by YYYY-MM-DD key
$byDate = [];
foreach ($events as $ev) {
$byDate[$ev[COL_ART_EVENT_DATE]][] = $ev;
}
// ── Navigation: prev/next windows ────────────────────────────────────────
$prevM = $startMonth - 3; $prevY = $startYear;
if ($prevM < 1) { $prevM += 12; $prevY--; }
$nextM = $startMonth + 3; $nextY = $startYear;
if ($nextM > 12) { $nextM -= 12; $nextY++; }
$MONTH_NAMES = ['','January','February','March','April','May','June',
'July','August','September','October','November','December'];
$DAY_NAMES = ['','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];
?>
= htmlspecialchars(getSetting($pdo, 'page_title_calendar', 'Calendar — blocmedia')) ?>
Events — = $MONTH_NAMES[$months[0]['month']] . ' ' . $months[0]['year'] ?>
– = $MONTH_NAMES[$months[2]['month']] . ' ' . $months[2]['year'] ?>
« Previous
Today
Next »
Showing = $MONTH_NAMES[$months[0]['month']] ?> – = $MONTH_NAMES[$months[2]['month']] . ' ' . $months[2]['year'] ?>. Days with no events are hidden. Submit an event.
format('Y-m-d');
$anyEvents = false;
foreach ($months as $mo):
$mYear = $mo['year'];
$mMonth = $mo['month'];
$daysInMo = (int)(new DateTime("$mYear-$mMonth-01"))->format('t');
// Collect event dates for this month
$monthHasEvents = false;
for ($d = 1; $d <= $daysInMo; $d++) {
$key = sprintf('%04d-%02d-%02d', $mYear, $mMonth, $d);
if (!empty($byDate[$key])) { $monthHasEvents = true; break; }
}
?>
= $MONTH_NAMES[$mMonth] . ' ' . $mYear ?>
No events this month.
format('N');
$isToday = ($dateKey === $todayStr);
$anchor = 'day-' . $mYear . '-' . str_pad($mMonth, 2, '0', STR_PAD_LEFT) . '-' . str_pad($d, 2, '0', STR_PAD_LEFT);
?>
= !empty($ev[COL_ART_EVENT_TIME]) ? date('g:i A', strtotime($ev[COL_ART_EVENT_TIME])) : 'TBA' ?>