480 lines
16 KiB
PHP
480 lines
16 KiB
PHP
|
|
<?
|
||
|
|
// PHP Calendar Class Version 1.4 (5th March 2001)
|
||
|
|
//
|
||
|
|
// Copyright David Wilkinson 2000 - 2001. All Rights reserved.
|
||
|
|
//
|
||
|
|
// This software may be used, modified and distributed freely
|
||
|
|
// providing this copyright notice remains intact at the head
|
||
|
|
// of the file.
|
||
|
|
//
|
||
|
|
// This software is freeware. The author accepts no liability for
|
||
|
|
// any loss or damages whatsoever incurred directly or indirectly
|
||
|
|
// from the use of this script. The author of this software makes
|
||
|
|
// no claims as to its fitness for any purpose whatsoever. If you
|
||
|
|
// wish to use this software you should first satisfy yourself that
|
||
|
|
// it meets your requirements.
|
||
|
|
//
|
||
|
|
// URL: http://www.cascade.org.uk/software/php/calendar/
|
||
|
|
// Email: davidw@cascade.org.uk
|
||
|
|
|
||
|
|
//Modifications and additions for the OSCommerce contribution ShipDate by Matt Plummer
|
||
|
|
//7/28/03
|
||
|
|
|
||
|
|
require('shipsched.php');
|
||
|
|
|
||
|
|
function GetLine($exclude_vars=array()) {
|
||
|
|
$result='';
|
||
|
|
if(isset($_GET)){
|
||
|
|
$revised_gets=array_key_diff($_GET,$exclude_vars);
|
||
|
|
foreach($revised_gets as $key=>$get){
|
||
|
|
$result.= '&' . $key . '=' . $get;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
function array_key_diff($ar1, $ar2) {
|
||
|
|
// returns copy of array $ar1 with those entries removed
|
||
|
|
// whose keys appear as keys in any of the other function args
|
||
|
|
|
||
|
|
$aSubtrahends = array_slice(func_get_args(),1);
|
||
|
|
foreach ($ar1 as $key => $val)
|
||
|
|
if (in_array($key, $ar2))
|
||
|
|
unset ($ar1[$key]);
|
||
|
|
return $ar1;
|
||
|
|
}
|
||
|
|
|
||
|
|
class Calendar
|
||
|
|
{
|
||
|
|
/*
|
||
|
|
Constructor for the Calendar class
|
||
|
|
*/
|
||
|
|
function Calendar()
|
||
|
|
{
|
||
|
|
}
|
||
|
|
function getClass(){
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Get the array of strings used to label the days of the week. This array contains seven
|
||
|
|
elements, one for each day of the week. The first entry in this array represents Sunday.
|
||
|
|
*/
|
||
|
|
function getDayNames()
|
||
|
|
{
|
||
|
|
return $this->dayNames;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Set the array of strings used to label the days of the week. This array must contain seven
|
||
|
|
elements, one for each day of the week. The first entry in this array represents Sunday.
|
||
|
|
*/
|
||
|
|
function setDayNames($names)
|
||
|
|
{
|
||
|
|
$this->dayNames = $names;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Get the array of strings used to label the months of the year. This array contains twelve
|
||
|
|
elements, one for each month of the year. The first entry in this array represents January.
|
||
|
|
*/
|
||
|
|
function getMonthNames()
|
||
|
|
{
|
||
|
|
return $this->monthNames;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Set the array of strings used to label the months of the year. This array must contain twelve
|
||
|
|
elements, one for each month of the year. The first entry in this array represents January.
|
||
|
|
*/
|
||
|
|
function setMonthNames($names)
|
||
|
|
{
|
||
|
|
$this->monthNames = $names;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Gets the start day of the week. This is the day that appears in the first column
|
||
|
|
of the calendar. Sunday = 0.
|
||
|
|
*/
|
||
|
|
function getStartDay()
|
||
|
|
{
|
||
|
|
return $this->startDay;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Sets the start day of the week. This is the day that appears in the first column
|
||
|
|
of the calendar. Sunday = 0.
|
||
|
|
*/
|
||
|
|
function setStartDay($day)
|
||
|
|
{
|
||
|
|
$this->startDay = $day;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Gets the start month of the year. This is the month that appears first in the year
|
||
|
|
view. January = 1.
|
||
|
|
*/
|
||
|
|
function getStartMonth()
|
||
|
|
{
|
||
|
|
return $this->startMonth;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Sets the start month of the year. This is the month that appears first in the year
|
||
|
|
view. January = 1.
|
||
|
|
*/
|
||
|
|
function setStartMonth($month)
|
||
|
|
{
|
||
|
|
$this->startMonth = $month;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Return the URL to link to in order to display a calendar for a given month/year.
|
||
|
|
You must override this method if you want to activate the "forward" and "back"
|
||
|
|
feature of the calendar.
|
||
|
|
|
||
|
|
Note: If you return an empty string from this function, no navigation link will
|
||
|
|
be displayed. This is the default behaviour.
|
||
|
|
|
||
|
|
If the calendar is being displayed in "year" view, $month will be set to zero.
|
||
|
|
*/
|
||
|
|
function getCalendarLink($month, $year)
|
||
|
|
{
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Return the URL to link to for a given date.
|
||
|
|
You must override this method if you want to activate the date linking
|
||
|
|
feature of the calendar.
|
||
|
|
|
||
|
|
Note: If you return an empty string from this function, no navigation link will
|
||
|
|
be displayed. This is the default behaviour.
|
||
|
|
*/
|
||
|
|
function getDateLink($day, $month, $year)
|
||
|
|
{
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Return the HTML for the current month
|
||
|
|
*/
|
||
|
|
function getCurrentMonthView()
|
||
|
|
{
|
||
|
|
$d = getdate(time());
|
||
|
|
return $this->getMonthView($d["mon"], $d["year"]);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Return the HTML for the current year
|
||
|
|
*/
|
||
|
|
function getCurrentYearView()
|
||
|
|
{
|
||
|
|
$d = getdate(time());
|
||
|
|
return $this->getYearView($d["year"]);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Return the HTML for a specified month
|
||
|
|
*/
|
||
|
|
function getMonthView($month, $year)
|
||
|
|
{
|
||
|
|
return $this->getMonthHTML($month, $year);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Return the HTML for a specified year
|
||
|
|
*/
|
||
|
|
function getYearView($year)
|
||
|
|
{
|
||
|
|
return $this->getYearHTML($year);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/********************************************************************************
|
||
|
|
|
||
|
|
The rest are private methods. No user-servicable parts inside.
|
||
|
|
|
||
|
|
You shouldn't need to call any of these functions directly.
|
||
|
|
|
||
|
|
*********************************************************************************/
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Calculate the number of days in a month, taking into account leap years.
|
||
|
|
*/
|
||
|
|
function getDaysInMonth($month, $year)
|
||
|
|
{
|
||
|
|
if ($month < 1 || $month > 12)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
$d = $this->daysInMonth[$month - 1];
|
||
|
|
|
||
|
|
if ($month == 2)
|
||
|
|
{
|
||
|
|
// Check for leap year
|
||
|
|
// Forget the 4000 rule, I doubt I'll be around then...
|
||
|
|
|
||
|
|
if ($year%4 == 0)
|
||
|
|
{
|
||
|
|
if ($year%100 == 0)
|
||
|
|
{
|
||
|
|
if ($year%400 == 0)
|
||
|
|
{
|
||
|
|
$d = 29;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
$d = 29;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return $d;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Generate the HTML for a given month
|
||
|
|
*/
|
||
|
|
function getMonthHTML($m, $y, $showYear = 1)
|
||
|
|
{
|
||
|
|
$s = "";
|
||
|
|
|
||
|
|
$a = $this->adjustDate($m, $y);
|
||
|
|
$month = $a[0];
|
||
|
|
$year = $a[1];
|
||
|
|
|
||
|
|
$daysInMonth = $this->getDaysInMonth($month, $year);
|
||
|
|
$date = getdate(mktime(12, 0, 0, $month, 1, $year));
|
||
|
|
|
||
|
|
$first = $date["wday"];
|
||
|
|
$monthName = $this->monthNames[$month - 1];
|
||
|
|
|
||
|
|
$prev = $this->adjustDate($month - 1, $year);
|
||
|
|
$next = $this->adjustDate($month + 1, $year);
|
||
|
|
|
||
|
|
if ($showYear == 1)
|
||
|
|
{
|
||
|
|
$prevMonth = $this->getCalendarLink($prev[0], $prev[1]);
|
||
|
|
$nextMonth = $this->getCalendarLink($next[0], $next[1]);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
$prevMonth = "";
|
||
|
|
$nextMonth = "";
|
||
|
|
}
|
||
|
|
|
||
|
|
$header = $monthName . (($showYear > 0) ? " " . $year : "");
|
||
|
|
|
||
|
|
$s .= "<table class=\"calendar\">\n";
|
||
|
|
$s .= "<tr>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\">" . (($prevMonth == "") ? " " : "<a href=\"$prevMonth\"><<</a>") . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\" colspan=\"5\">$header</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\">" . (($nextMonth == "") ? " " : "<a href=\"$nextMonth\">>></a>") . "</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
|
||
|
|
$s .= "<tr>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay)%7] . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay+1)%7] . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay+2)%7] . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay+3)%7] . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay+4)%7] . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay+5)%7] . "</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" class=\"calendarHeader\">" . $this->dayNames[($this->startDay+6)%7] . "</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
|
||
|
|
// We need to work out what date to start at so that the first appears in the correct column
|
||
|
|
$d = $this->startDay + 1 - $first;
|
||
|
|
while ($d > 1)
|
||
|
|
{
|
||
|
|
$d -= 7;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Make sure we know when today is, so that we can use a different CSS style
|
||
|
|
$today = getdate(time());
|
||
|
|
|
||
|
|
while ($d <= $daysInMonth)
|
||
|
|
{
|
||
|
|
$s .= "<tr>\n";
|
||
|
|
|
||
|
|
for ($i = 0; $i < 7; $i++)
|
||
|
|
{
|
||
|
|
|
||
|
|
|
||
|
|
if ($d > 0 && $d <= $daysInMonth)
|
||
|
|
{
|
||
|
|
$class = $this->getClass($d,$month,$year);
|
||
|
|
$s .= "<td $class align=\"right\" valign=\"top\">";
|
||
|
|
$link = $this->getDateLink($d, $month, $year);
|
||
|
|
$s .= (($link == "") ? $d : "<a href=\"$link\">$d</a>");
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
$class = 'class="invalid"';
|
||
|
|
$s .= "<td $class align=\"right\" valign=\"top\">";
|
||
|
|
$s .= " ";
|
||
|
|
}
|
||
|
|
|
||
|
|
$s .= "</td>\n";
|
||
|
|
$d++;
|
||
|
|
}
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
}
|
||
|
|
|
||
|
|
$s .= "</table>\n";
|
||
|
|
|
||
|
|
return $s;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Generate the HTML for a given year
|
||
|
|
*/
|
||
|
|
function getYearHTML($year)
|
||
|
|
{
|
||
|
|
$s = "";
|
||
|
|
$prev = $this->getCalendarLink(0, $year - 1);
|
||
|
|
$next = $this->getCalendarLink(0, $year + 1);
|
||
|
|
|
||
|
|
$s .= "<table class=\"calendar\" border=\"0\">\n";
|
||
|
|
$s .= "<tr>";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" align=\"left\">" . (($prev == "") ? " " : "<a href=\"$prev\"><<</a>") . "</td>\n";
|
||
|
|
$s .= "<td class=\"calendarHeader\" valign=\"top\" align=\"center\">" . (($this->startMonth > 1) ? $year . " - " . ($year + 1) : $year) ."</td>\n";
|
||
|
|
$s .= "<td align=\"center\" valign=\"top\" align=\"right\">" . (($next == "") ? " " : "<a href=\"$next\">>></a>") . "</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
$s .= "<tr>";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(0 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(1 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(2 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
$s .= "<tr>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(3 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(4 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(5 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
$s .= "<tr>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(6 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(7 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(8 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
$s .= "<tr>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(9 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(10 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "<td class=\"calendar\" valign=\"top\">" . $this->getMonthHTML(11 + $this->startMonth, $year, 0) ."</td>\n";
|
||
|
|
$s .= "</tr>\n";
|
||
|
|
$s .= "</table>\n";
|
||
|
|
|
||
|
|
return $s;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Adjust dates to allow months > 12 and < 0. Just adjust the years appropriately.
|
||
|
|
e.g. Month 14 of the year 2001 is actually month 2 of year 2002.
|
||
|
|
*/
|
||
|
|
function adjustDate($month, $year)
|
||
|
|
{
|
||
|
|
$a = array();
|
||
|
|
$a[0] = $month;
|
||
|
|
$a[1] = $year;
|
||
|
|
|
||
|
|
while ($a[0] > 12)
|
||
|
|
{
|
||
|
|
$a[0] -= 12;
|
||
|
|
$a[1]++;
|
||
|
|
}
|
||
|
|
|
||
|
|
while ($a[0] <= 0)
|
||
|
|
{
|
||
|
|
$a[0] += 12;
|
||
|
|
$a[1]--;
|
||
|
|
}
|
||
|
|
|
||
|
|
return $a;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
The start day of the week. This is the day that appears in the first column
|
||
|
|
of the calendar. Sunday = 0.
|
||
|
|
*/
|
||
|
|
var $startDay = 1;
|
||
|
|
|
||
|
|
/*
|
||
|
|
The start month of the year. This is the month that appears in the first slot
|
||
|
|
of the calendar in the year view. January = 1.
|
||
|
|
*/
|
||
|
|
var $startMonth = 1;
|
||
|
|
|
||
|
|
/*
|
||
|
|
The labels to display for the days of the week. The first entry in this array
|
||
|
|
represents Sunday.
|
||
|
|
*/
|
||
|
|
var $dayNames = array("D", "L", "M", "X", "J", "V", "S");
|
||
|
|
|
||
|
|
/*
|
||
|
|
The labels to display for the months of the year. The first entry in this array
|
||
|
|
represents January.
|
||
|
|
*/
|
||
|
|
var $monthNames = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
|
||
|
|
"Julio", "Agosto", "Septiempre", "Octubre", "Noviembre", "Diciembre");
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
The number of days in each month. You're unlikely to want to change this...
|
||
|
|
The first entry in this array represents January.
|
||
|
|
*/
|
||
|
|
var $daysInMonth = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
|
||
|
|
|
||
|
|
}
|
||
|
|
class MyCalendar extends Calendar
|
||
|
|
{
|
||
|
|
var $ship_sched;
|
||
|
|
function MyCalendar(){
|
||
|
|
$this->ship_sched=new ShippingSchedule;
|
||
|
|
}
|
||
|
|
function getCalendarLink($month, $year){
|
||
|
|
|
||
|
|
// Redisplay the current page, but with some parameters
|
||
|
|
// to set the new month and year
|
||
|
|
$exclude_vars[]=(isset($_GET['month'])) ? 'month' : '';
|
||
|
|
$exclude_vars[]=(isset($_GET['year'])) ? 'year' : '';
|
||
|
|
|
||
|
|
|
||
|
|
$s = $_SERVER['PHP_SELF'];
|
||
|
|
return "$s?month=$month&year=$year" . GetLine($exclude_vars);
|
||
|
|
}
|
||
|
|
|
||
|
|
function getDateLink($day, $month, $year){
|
||
|
|
$datestamp=mktime(0,0,0,$month,$day,$year);
|
||
|
|
$exclude_vars[]=(isset($_GET['date'])) ? 'date' : '';
|
||
|
|
|
||
|
|
$date_info=$this->ship_sched->DateInfo($datestamp);
|
||
|
|
$link = $date_info['valid'] ? $_SERVER['PHP_SELF'] . '?date=' . $datestamp . GetLine($exclude_vars) : '';
|
||
|
|
|
||
|
|
return $link;
|
||
|
|
}
|
||
|
|
function getClass($day,$month,$year){
|
||
|
|
$datestamp=mktime(0,0,0,$month,$day,$year);
|
||
|
|
$date_info=$this->ship_sched->DateInfo($datestamp);
|
||
|
|
|
||
|
|
$class='class="' . $date_info['class'] . '"';
|
||
|
|
if(isset($_GET['date']) && $datestamp==$_GET['date']){
|
||
|
|
$class.=' id="selected"';
|
||
|
|
}elseif(!isset($_GET['date']) && isset($_SESSION['shipdate'])){
|
||
|
|
if($_SESSION['shipdate']==$datestamp)$class.=' id="selected"';
|
||
|
|
}
|
||
|
|
return $class;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
?>
|