<?php
class calendar{
var $thedate;
var $startday;
var $tabletags;
var $tdinmonth;
var $tdoutmonth;
var $tdtoday;
var $tdtodayevent;
var $tdevent;
var $tdoutevent;
var $dayformat;
var $thtags;
var $themonth;
var $theday;
var $theyear;
var $firstofmonthts;
function setdate($thedate){
$bits = split("-", $thedate);
$this->thedate = $thedate;
$this->themonth = (int)$bits[1];
$this->theyear = $bits[0];
$this->theday = (int)$bits[2];
$this->firstofmonthts = mktime(0,0,0,$this->themonth, 1, $this->theyear);
}
function dayofweek(){
return date("w", strtotime($this->thedate));
}
function notaweekend($frimon = -1){
$day = $this->dayofweek();
if( $day == 0 ){ // sunday
$this->setdate( $this->dateadd( "%Y-%m-%d", $frimon == -1 ? -2 : 1));
}elseif( $day == 6 ){ // saturday
$this->setdate($this->dateadd("%Y-%m-%d", $frimon == -1 ? -1 : 2));
}
}
function addweekdays($format = "%Y-%m-%d", $days=0){
$inc = $days < 0 ? -1 : 1;
$days = abs($days);
$firstday = $this->dayofweek();
$numdays = 0;
$day = 0;
while( $day < $days ){
if( $firstday != 0 && $firstday != 6 ) $day++;
$numdays++;
$firstday += $inc;
if( $firstday < 0 ) $firstday = 6;
if( $firstday > 6 ) $firstday = 0;
}
return strftime($format, mktime(0,0,0,$this->themonth, $this->theday+($numdays * $inc), $this->theyear));
}
function dateadd($format = "%Y-%m-%d", $days = 0, $months = 0, $years = 0, $keepday = true){
if( $days == 0 && $keepday == true ){
$daysinnewmonth = date("t", mktime(0,0,0,$this->themonth+$months, $this->theyear+$years));
if( $daysinnewmonth < $this->theday ){
return strftime($format, mktime(0,0,0,$this->themonth+$months, $daysinnewmonth, $this->theyear+$years));
}else{
return strftime($format, mktime(0,0,0,$this->themonth+$months, $this->theday+$days, $this->theyear+$years));
}
}else{
return strftime($format, mktime(0,0,0,$this->themonth+$months, $this->theday+$days, $this->theyear+$years));
}
}
function getdate($format = "%Y-%m-%d"){return strftime($format, mktime(0,0,0,$this->themonth, $this->theday, $this->theyear));}
function nextmonth($format = "%Y-%m-%d"){return $this->dateadd($format, 0, 1, 0);}
function prevmonth($format = "%Y-%m-%d"){return $this->dateadd($format, 0, -1, 0);}
function nextday($format = "%Y-%m-%d"){return $this->dateadd($format, 1, 0, 0, false);}
function prevday($format = "%Y-%m-%d"){return $this->dateadd($format, -1, 0,0, false);}
function nextyear($format = "%Y-%m-%d"){return $this->dateadd($format, 0, 0, 1);}
function prevyear($format = "%Y-%m-%d"){return $this->dateadd($format, 0, 0, -1);}
function nextweek($format = "%Y-%m-%d"){return $this->dateadd($format, 7, 0, 0, false);}
function prevweek($format = "%Y-%m-%d"){return $this->dateadd($format, -7, 0,0, false);}
function daysinmonth(){
return (int)date("t", mktime(0,0,0,$this->themonth, 1, $this->theyear));
}
function calendar($thedate = "", $startday = 0){
global $HTTP_SERVER_VARS;
if( $thedate == "" ) $thedate = date("Y-m-d");
$this->setdate($thedate);
$this->startday = $startday;
$this->tabletags = "<table>";
$this->tdinmonth = "<td width='32' height='32'><a href='".$HTTP_SERVER_VARS["PATH_INFO"]."?thedate=%date%'>%day%</a></td>\n";
$this->tdoutmonth = "<td>%day%</td>\n";
$this->tdinmonthevent = "<td><a href='".$HTTP_SERVER_VARS["PATH_INFO"]."?thedate=%date%'>%day%</a><br>%event%</td>\n";
$this->tdoutmonthevent = "<td>%day%<br>%event%</td>\n";
$this->dayformat = "full";
$this->thtags = "<th width='32'>%day%</th>";
$this->tdtoday = "<td bgcolor='#bbbbbb'><a href='".$HTTP_SERVER_VARS["PATH_INFO"]."?thedate=%date%'>%day%</a></td>\n";
$this->tdtodayevent = "<td bgcolor='#bbbbbb'><a href='".$HTTP_SERVER_VARS["PATH_INFO"]."?thedate=%date%'>%day%</a><br>%event%</td>\n";
}
function getcalendardays(){
$daysinmonth = $this->daysinmonth();
$firstdayofmonth = date("w", $this->firstofmonthts);
$lastdayofmonth = date("w", mktime(0,0,0,$this->themonth, $daysinmonth, $this->theyear));
$daysinlastmonth = date("t", mktime(0,0,0,$this->themonth-1, 1, $this->theyear));
$daysback = $firstdayofmonth - $this->startday;
if( $daysback < 0 ){
$daysback += 7;
}
$days = array();
for( $i = $daysback-1; $i >= 0; $i--) $days[] = $daysinlastmonth - $i;
for( $i = 1; $i <= $daysinmonth; $i++){
$days[] = $i;
}
if( count($days) % 7 != 0 ){
$daysremaining = 7 - (count($days) % 7);
for( $i = 1; $i <= $daysremaining; $i++) $days[] = $i;
}
return $days;
}
function getdaynames(&$days, $themonth, $theyear){
$daynames = array();
switch ($this->dayformat){
case "full":
$dformat = "%A";
break;
default:
$dformat = "%a";
break;
}
for( $i = 0; $i < 7; $i++){
if( $days[$i] > 7 ){
$daynames[$i] = strftime( $dformat, mktime(0,0,0,$themonth-1, $days[$i], $theyear));
}else{
$daynames[$i] = strftime( $dformat, mktime(0,0,0,$themonth, $days[$i], $theyear));
}
if( $this->dayformat == "short" ) $daynames[$i] = substr($daynames[$i], 0, 1);
}
return $daynames;
}
function displaycalendar($events = array()){
$thedays = $this->getcalendardays();
$dayofweek = 0;
$inmonth = 0;
$daynames = $this->getdaynames($thedays, $this->themonth, $this->theyear);
echo "<table border=1 cellpadding=0 cellspacing=0 align=center>\n";
echo "<tr>\n";
for( $i = 0; $i < 7; $i++) echo str_replace("%day%", $daynames[$i], $this->thtags);
echo "</tr>\n";
$search = array("%day%", "%date%", "%event%");
for( $i = 0; $i < count($thedays); $i++){
$event = "";
if( $dayofweek == 0 ){
echo "<tr>\n";
}elseif( $dayofweek == 7 ){
echo "</tr>\n";
$dayofweek = 0;
}
if( $thedays[$i] == 1 ){
$inmonth = 1 - $inmonth;
}
if( $inmonth ){
$thedate = date("Y-m-d", mktime( 0,0,0,$this->themonth, $thedays[$i], $this->theyear));
if( $thedays[$i] == $this->theday ){
if( isset($events["$thedate"]) ){
$out = $this->tdtodayevent;
$event = $events["$thedate"];
}else{
$out = $this->tdtoday;
}
}else{
if( isset($events["$thedate"]) ){
$out = $this->tdinmonthevent;
$event = $events["$thedate"];
}else{
$out = $this->tdinmonth;
}
}
}else{
if( $thedays[$i] < 7 ){
$thedate = date("Y-m-d", mktime(0,0,0,$this->themonth+1, $thedays[$i], $this->theyear));
}else{
$thedate = date("Y-m-d", mktime(0,0,0,$this->themonth-1, $thedays[$i], $this->theyear));
}
if( isset($events["$thedate"]) ){
$out = $this->tdoutmonthevent;
$event = $events["$thedate"];
}else{
$out = $this->tdoutmonth;
}
}
echo str_replace($search,array($thedays[$i], $thedate, $event), $out);
$dayofweek++;
}
if( $dayofweek == 7 ) echo "</tr>\n";
echo "</table>\n";
}
}
?>