Source of: /cal.php
<?php
$_SERVER['BASE_PAGE'] = 'cal.php';
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/prepend.inc';
$site_header_config = array(
"current" => "community",
"css" => array('calendar.css'),
);
$begun = FALSE; $errors = array();
$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
$cy = isset($_GET['cy']) ? (int) $_GET['cy'] : 0;
$cm = isset($_GET['cm']) ? (int) $_GET['cm'] : 0;
$cd = isset($_GET['cd']) ? (int) $_GET['cd'] : 0;
if ($cy != 0 && !valid_year($cy)) {
$cy = date("Y");
}
if ($id) {
if ($event = load_event($id)) {
site_header("Event: " . stripslashes(htmlentities($event['sdesc'], ENT_QUOTES | ENT_IGNORE, 'UTF-8')), $site_header_config);
display_event($event, 0);
$begun = TRUE;
}
else {
$errors[] = "There is no event for specified id ('".htmlentities($id, ENT_QUOTES | ENT_IGNORE, 'UTF-8')."')";
}
}
elseif ($cy && $cm && $cd) {
if (checkdate($cm,$cd,$cy)) {
$date = mktime(0, 0, 1, $cm, $cd, $cy);
if ($events = load_events($date)) {
$site_header_config = array('classes' => 'calendar calendar-day') + $site_header_config;
site_header("Events: ".date("F j, Y", $date), $site_header_config);
echo "<h2>", date("F j, Y", $date), "</h2>\n";
foreach ($events as $event) {
display_event($event, 0);
echo "<br />";
}
$begun = TRUE;
}
else {
$errors[] = "There are no events for the specified date (".date("F j, Y",$date).").";
}
}
else {
$errors[] = "The specified date (".htmlentities("$cy/$cm/$cd", ENT_QUOTES | ENT_IGNORE, 'UTF-8').") was not valid.";
unset($cm); unset($cd); unset($cy);
}
}
if ($cm && $cy && !checkdate($cm,1,$cy)) {
$errors[] = "The specified year and month (".htmlentities("$cy, $cm", ENT_QUOTES | ENT_IGNORE, 'UTF-8').") are not valid.";
unset($cm); unset($cy);
}
if (!isset($cm) || $cm == 0) { $cm = date("m"); }
if (!isset($cy) || $cy == 0) { $cy = date("Y"); }
$date = mktime(0, 0, 1, $cm, 1, $cy);
if (!$begun) {
site_header("Events: ".date("F Y", $date), $site_header_config);
?>
<div class="tip">
<p>
If you would like to suggest an upcoming event to be listed on this
calendar, you can use <a href="submit-event.php">our event submission
form</a>.
</p>
<p>
You can click on each of the events for details, or on the number for a day
to get the details for all of the events taking place that day.
</p>
</div>
<?php
}
$events = load_events($date, TRUE);
if ($events === FALSE || count($events) == 0) {
$errors[] = "No events found for this month";
}
if (count($errors) > 0) {
display_errors($errors);
site_footer();
exit;
}
$bom = mktime(0, 0, 1, $cm, 1, $cy);
$eom = mktime(0, 0, 1, $cm+1, 0, $cy);
$lm = mktime(0, 0, 1, $cm, 0, $cy);
if (valid_year(date("Y", $lm))) {
$prev_link = '<a href="/cal.php' . strftime('?cm=%m&cy=%Y">%B, %Y</a>', $lm);
} else {
$prev_link = ' ';
}
$nm = mktime(0, 0, 1, $cm+1, 1, $cy);
if (valid_year(date("Y", $nm))) {
$next_link = '<a href="/cal.php' . strftime('?cm=%m&cy=%Y">%B, %Y</a>', $nm);
} else {
$next_link = ' ';
}
echo '<br /><table id="calnav" width="100%" border="0" cellspacing="0" cellpadding="3">',
"\n<tr>", '<td align="left" width="33%">', $prev_link, '</td>',
'<td align="center" width="33%">', strftime('<b>%B, %Y</b></td>', $bom),
'<td align="right" width="33%">', $next_link, "</td></tr>\n</table>\n";
echo '<table id="cal" width="100%" border="1" cellspacing="0" cellpadding="3">',
"\n",'<tr>',"\n";
for ($i = 0; $i < 7; $i++) {
echo '<th width="14%">', date("l",mktime(0,0,1,4,$i+1,2001)), "</th>\n";
}
echo "</tr>\n<tr>";
for ($days = $i = date("w",$bom); $i > 0; $i--) {
echo '<td class="notaday"> </td>';
}
for ($i = 1; $i <= date("t",$bom); $i++) {
echo '<td><a class="day" href="/cal.php', "?cm=$cm&cd=$i&cy=$cy",
'">',$i,'</a>';
display_events_for_day(date("Y-m-",$bom).sprintf("%02d",$i), $events);
echo '</td>';
if (++$days % 7 == 0) echo "</tr>\n<tr>";
}
for (; $days % 7; $days++) {
echo '<td class="notaday"> </td>';
}
echo "</tr>\n</table>\n";
site_footer();
function date_for_recur($recur, $day, $bom, $eom)
{
if ($recur > 0) {
$bomd = date("w", $bom) + 1;
$days = (($day - $bomd + 7) % 7) + (($recur - 1) * 7);
return mktime(0,0,1, date("m",$bom), $days + 1, date("Y",$bom));
}
else {
$eomd = date("w",$eom) + 1;
$days = (($eomd - $day + 7) % 7) + ((abs($recur) - 1) * 7);
return mktime(0,0,1, date("m",$bom)+1, -$days, date("Y",$bom));
}
}
function display_events_for_day($day, $events)
{
global $cm, $cy, $COUNTRY;
foreach ($events as $event) {
if (($event['type'] == 2 && $event['start'] <= $day && $event['end'] >= $day)
|| ($event['start'] == $day)) {
echo '<div class="event">',
($COUNTRY == $event['country'] ? "<strong>" : ""),
'<a class="cat' . $event['category'] . '" href="/cal.php',
"?id=$event[id]&cm=$cm&cy=$cy", '">',
stripslashes(htmlentities($event['sdesc'], ENT_QUOTES | ENT_IGNORE, 'UTF-8')),
'</a>',
($COUNTRY == $event['country'] ? "</strong>" : ""),
'</div>';
}
}
}
function load_event($id)
{
$fp = @fopen("backend/events.csv",'r');
if (!$fp) { return FALSE; }
while (!feof($fp)) {
$event = read_event($fp);
if ($event !== FALSE && $event['id'] == $id) {
fclose($fp);
return $event;
}
}
fclose($fp);
return FALSE;
}
function load_events($from, $whole_month = FALSE)
{
$from_date = date("Y-m-d", $from);
$bom = mktime(0, 0, 1, date("m",$from), 1, date("Y",$from));
$eom = mktime(0, 0, 1, date("m",$from) + 1, 0, date("Y",$from));
$to_date = date("Y-m-d", $whole_month ? $eom : $from);
$events = $seen = array();
$fp = @fopen("backend/events.csv",'r');
if (!$fp) { return FALSE; }
while (!feof($fp)) {
if (($event = read_event($fp)) === FALSE) {
continue;
}
if (!isset($seen[$event['id']])) { $seen[$event['id']] = 1; }
else { continue; }
switch ($event['type']) {
case 3:
$date = date_for_recur($event['recur'], $event['recur_day'], $bom, $eom);
$event['start'] = date("Y-m-d", $date);
case 1:
if ($event['start'] >= $from_date && $event['start'] <= $to_date) {
$events[] = $event;
}
break;
case 2:
if (($event['start'] >= $from_date && $event['start'] <= $to_date)
|| ($event['end'] >= $from_date && $event['end'] <= $to_date)
|| ($event['start'] <= $from_date && $event['end'] >= $to_date)) {
$events[] = $event;
}
break;
}
}
fclose($fp);
return $events;
}
function read_event($fp)
{
if (($linearr = fgetcsv($fp, 8192)) === FALSE) {
return FALSE;
}
if (count($linearr) < 13) { return FALSE; }
list(
$day, $month, $year, $country,
$sdesc, $id, $ldesc, $url, $recur, $tipo, $sdato, $edato, $category
) = $linearr;
@list($recur, $recur_day) = explode(":", $recur, 2);
return array(
'id' => $id,
'type' => $tipo,
'start' => $sdato,
'end' => $edato,
'recur' => $recur,
'recur_day' => $recur_day,
'sdesc' => $sdesc,
'url' => $url,
'ldesc' => base64_decode($ldesc),
'country' => $country,
'category' => $category,
);
}
function valid_year($year)
{
$current_year = date("Y");
if ($year != $current_year && $year != $current_year+1) {
return FALSE;
}
return TRUE;
}
?>