Version: 2.6
Type: Class
Category: Calendars/Dates
License: GNU General Public License
Description: Contains a core class with no visual interface for use by you in your scripts AND a HTML interface class that will use the core class to display a one month calender with drop down month & year selector, next/previous month buttons, dates displayed are clickable and highlightable. Currently it doesn't look so great in netscape so I would appreciate any assistance with that.
<?php
/*
This an extension to the class I wrote, v 2.5.1 written by: David Hernandez Sanz
(davidhdezsanz@terra.es) http://www.dhs.sitio.net/
This class is intended to be an extension, so make sure you download 2.5.1 first.
It includes a lot of improvements, and also allows for some european calendar option.
*/
//require("cal.php");
class Calendar1 extends Calendar
{
var $dayBeginWeek = 1; // Day begin of week (for example, 1 for UK or 2 for Spain)
var $minMonth = 2; // Valid date interval for mktime()
var $minYear = 1970;
var $maxMonth = 12;
var $maxYear = 2037;
function startCalendar($myCal) {
if (!(null === $myCal["month"]) && !(null === $myCal["year"])) {
$thecalendar = $this->displayCalendar($myCal);
}
else {
$now = date('n,Y');
$myDate = explode(",",$now);
$myCal["month"] = $myDate[0];
$myCal["year"] = $myDate[1];
$thecalendar = $this->displayCalendar($myCal);
}
return $thecalendar;
}
function checkDate($month,$year) {
if (!is_numeric($month) || !is_numeric($year))
$txt = $this->myError("Either the month of year was non-numeric.");
elseif ($month > 12 || $month < 1 || ((1 == $month) && ($this->minYear == $year)))
$txt = $this->myError("The number passed for the month value is not valid.");
elseif ($year > $this->maxYear || $year < $this->minYear)
$txt = $this->myError("The number passed for the year value is not valid.");
else
$txt = null;
return $txt;
}
function next($month, $year) {
if (($this->maxMonth == $month) && ($this->maxYear == $year))
$next = null;
elseif (12 == $month) {
$next["month"] = 1;
$next["year"] = $year + 1;
}
else {
$next["month"] = $month + 1;
$next["year"] = $year;
}
return $next;
}
function last($month,$year) {
if (($this->minMonth == $month) && ($this->minYear == $year))
$last = null;
elseif (1 == $month) {
$last["month"] = 12;
$last["year"] = $year - 1;
}
else {
$last["month"] = $month - 1;
$last["year"] = $year;
}
return $last;
}
function dayName($day) {
$dayName = array(1 => "Sun",
2 => "Mon",
3 => "Tue",
4 => "Wed",
5 => "Thu",
6 => "Fri",
7 => "Sat");
return $dayName[$day];
}
function displayCalendar($myCal)
{
global $_SERVER;
extract($myCal);
// Make sure that we have a valid month and year.
$check = $this->checkDate($month,$year);
if (null == $check)
{
$next = ($link_next) ? $this->next($month, $year) : null;
$last = ($link_last) ? $this->last($month, $year) : null;
if (!$url_nav)
$url_nav = $_SERVER["PHP_SELF"];
$parse = parse_url($url_nav);
$sep = $parse["query"] ? "&" : "?";
if ($last)
{
$url = $url_nav . $sep . "month=" . $last["month"] . "&year=" . $last["year"];
$url = htmlentities($url, ENT_QUOTES);
$txt_last = "<a href=\"$url\" class=\"$class\"><<</a>";
}
else
$txt_last = " ";
if ($next)
{
$url = $url_nav . $sep . "month=" . $next["month"] . "&year=" . $next["year"];
$url = htmlentities($url, ENT_QUOTES);
$txt_next = "<a href=\"$url\" class=\"$class\">>></a>";
}
else
$txt_next = " ";
$myCalendar = "<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" class=\"$class\">\n" .
" <tr>\n" .
" <td colspan=\"7\" align=\"center\">\n" .
" <table border=\"0\" cellpadding=\"1\" cellspacing=\"0\" width=\"100%\" class=\"$class\">\n" .
" <tr>\n" .
" <th align=\"center\" width=\"30\" class=\"$class_nav\">\n" .
" $txt_last</th>\n" .
" <th align=\"center\" class=\"$class_header\">\n" .
" " . $this->monthName($month) . " $year</th>\n" .
" <th align=\"center\" width=\"30\" class=\"$class_nav\">\n" .
" $txt_next</th>\n" .
" </tr>\n" .
" </table></td>\n" .
" </tr>\n" .
" <tr>\n";
for ($i = 0; $i < 7; $i++)
{
$i_real = $i + $this->dayBeginWeek;
if (8 <= $i_real)
$i_real -= 7;
$myCalendar .= " <td width=\"27\" align=\"center\" valign=\"middle\" class=\"$class\">\n" .
" " . $this->dayName($i_real) . "</td>\n";
}
$myCalendar .= " </tr>\n";
$day = null;
$first_day_of_month = $this->getDayOfWeek(1, $month, $year);
$first_c_of_month = $first_day_of_month + 1 - $this->dayBeginWeek;
if (0 > $first_c_of_month)
$first_c_of_month += 7;
if (!$url_day)
$url_day = $_SERVER["PHP_SELF"];
$parse = parse_url($url_day);
$sep = $parse["query"] ? "&" : "?";
//scan thru calendar grid
for ($r = 1; $r <= 6; $r++)
for ($c = 0; $c < 7; $c++) {
if (0 == $c)
$myCalendar .= " <tr>\n";
if ((null === $day) && ($c < $first_c_of_month))
$myCalendar .= " <td class=\"$class_empty\">\n" .
" </td>\n";
elseif ($day && ($this->daysInMonth($month, $year) < $day)) {
$myCalendar .= " <td class=\"$class_empty\">\n" .
" </td>\n";
$r = 7;
}
else {
if (null === $day)
$day = 1;
$day_week = $c + $this->dayBeginWeek;
if (7 < $day_week)
$day_week -= 7;
if ($holiday[$day_week])
$myCalendar .= " <td align=\"center\" valign=\"middle\" class=\"$class_holiday\">\n" .
" $day</td>\n";
elseif ((date(d) == $day) && (date(m) == $month) &&
(date(Y) == $year)) {
$url = $url_day . $sep . "day=$day&month=$month&year=$year";
$url = htmlentities($url, ENT_QUOTES);
$myCalendar .= " <td align=\"center\" valign=\"middle\" class=\"$class_today\">\n" .
" <a href=\"$url\" class=\"$class\">\n" .
" $day</a></td>\n";
}
else {
$url = $url_day . $sep . "day=$day&month=$month&year=$year";
$url = htmlentities($url, ENT_QUOTES);
$myCalendar .= " <td align=\"center\" valign=\"middle\" class=\"$class_normal\">\n" .
" <a href=\"$url\" class=\"$class\">\n" .
" $day</a></td>\n";
}
$day++;
}
if (6 == $c) {
$myCalendar .= " </tr>\n";
if ($this->daysInMonth($month, $year) < $day)
$r = 7;
}
}
$myCalendar .= "</table>\n";
}
else
$myCalendar = $check;
return $myCalendar;
}
}
/*
// First configure this bad boy.
echo '<style>
TABLE.calendario
{
FONT-FAMILY: tahoma, arial, sans-serif;
}
TH.calendarioCab
{
BACKGROUND-COLOR: #DDDDDD;
COLOR: #000000;
FONT-SIZE: 100%;
FONT-WEIGHT: normal;
}
TH.calendarioNav
{
BACKGROUND-COLOR: #DDDDDD;
COLOR: #000000;
FONT-SIZE: 80%;
FONT-WEIGHT: normal;
}
TD.calendario
{
BACKGROUND-COLOR: #BBBBBB;
COLOR: #000000;
FONT-SIZE: 80%;
}
TD.calendarioNormal
{
BACKGROUND-COLOR: #EEEEEE;
COLOR: "#0063C6";
FONT-SIZE: 80%;
}
TD.calendarioHoy
{
BACKGROUND-COLOR: #DDDDDD;
COLOR: #000000;
FONT-SIZE: 80%;
}
TD.calendarioFiesta
{
BACKGROUND-COLOR: #CCCCCC;
COLOR: #000000;
FONT-SIZE: 80%;
}
TD.calendarioVacio
{
BACKGROUND-COLOR: #FFFFFF;
COLOR: #000000;
FONT-SIZE: 80%;
}
A.calendario
{
TEXT-DECORATION: none;
}
</style>
';
$myCal["class"] = "calendario";
$myCal["class_header"] = "calendarioCab";
$myCal["class_nav"] = "calendarioNav";
$myCal["class_normal"] = "calendarioNormal";
$myCal["class_today"] = "calendarioHoy";
$myCal["class_holiday"] = "calendarioFiesta";
$myCal["class_empty"] = "calendarioVacio";
$myCal["link_next"] = true;
$myCal["link_last"] = true;
$myCal["url_nav"] = $_SERVER["PHP_SELF"] . "?var=value";
$myCal["url_day"] = "page.php?var=value";
$myCal["holiday"] = array(1 => true, 2 => false, 3 => false, 4 => false, 5 => false, 6 => false, 7 => true);
extract($_GET);
if (!(isset($month) && isset($year))) {
$month = null;
$year = null;
}
$myCal = array_merge($myCal, compact("month", "year"));
// Start your engines!
$newCal = new Calendar1();
print $newCal->startCalendar($myCal);
*/
?>