<?php
class Calendar
{
function num_weeks($month, $year)
{
$num_weeks=4;
$first_day = $this->first_day($month, $year);
// if the first week doesn't start on monday
// we are sure that the month has at minimum 5 weeks
if($first_day!=1) $num_weeks++;
$widows=$first_day-1;
$fw_days=7-$widows;
if($fw_days==7) $fw_days=0;
$numdays=date("t",mktime(2, 0, 0, $month, 1, $year));
if( ($numdays - $fw_days) > 28 ) $num_weeks++;
return $num_weeks;
}
// this method returns array with the days
// in a given week. Always starts from Monday and return 7 numbers
// if the day is there, returns the date, otherwise returns zero
// very useful to build the empty cells of the calendar
function days($month, $year, $week, $num_weeks=0)
{
$days=array();
if($num_weeks==0) $num_weeks=$this->num_weeks($month, $year);
// find which day of the week is 1st of the given month
$first_day = $this->first_day($month, $year);
// find widow days (first week)
$widows=$first_day-1;
// first week days
$fw_days=7-$widows;
// if $week==1 don't do further calculations
if($week==1)
{
for($i=0;$i<$widows;$i++) $days[]=0;
for($i=1;$i<=$fw_days;$i++) $days[]=$i;
return $days;
}
// any other week
if($week!=$num_weeks)
{
$first=$fw_days+(($week-2)*7);
for($i=$first+1;$i<=$first+7;$i++) $days[]=$i;
return $days;
}
# only last week calculations below
// number of days in the month
$numdays=date("t",mktime(2, 0, 0, $month, 1, $year));
// find orphan days (last week)
$orphans=$numdays-$fw_days-(($num_weeks-2)*7);
$empty=7-$orphans;
for($i=($numdays-$orphans)+1;$i<=$numdays;$i++) $days[]=$i;
for($i=0;$i<$empty;$i++) $days[]=0;
return $days;
}
function first_day($month, $year)
{
$first_day= date("w", mktime(2, 0, 0, $month, 1, $year));
if($first_day==0) $first_day=7; # convert Sunday
return $first_day;
}
}
?>
|