CGI Day Month Calendar
CGI
Download (.zip)
#!perl
########################################################################### # configuration ###########################################################################
# display date or month calendar? # 0 - Date # 1 - Month $Cal = 1;
# display in what language? # 0 - Chinese # 1 - English # 2 - German (Friedemann Lindenthal) # 3 - French (Jean-Francois Rouault) $Lang = 1;
########################################################################### # main programme ###########################################################################
use CGI qw(param); use POSIX qw(ceil); use Time::Local qw(timelocal);
# get argument, if any if (defined(param('Cal'))) {$Cal = param('Cal');} if (defined(param('Lang'))) {$Lang = param('Lang');}
@TimeNow = localtime; if (defined(param('Year'))) { $Year = param('Year')-1900; } else { $Year = $TimeNow[5]; } if (defined(param('Month'))) { $Month = param('Month')-1; } else { $Month = $TimeNow[4]; } if (defined(param('Date'))) { $Date = param('Date'); } else { $Date = $TimeNow[3]; }
# define constants @MonthDays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if (&isLeap($Year+1900)) {$MonthDays[1]=29;}
@Month0 = ('¤@¤ë', '¤G¤ë', '¤T¤ë', '¥|¤ë', '¤¤ë', '¤»¤ë', '¤C¤ë', '¤K¤ë', '¤E¤ë', '¤Q¤ë', '¤Q¤@¤ë', '¤Q¤G¤ë'); @Month1 = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); @Month2 = ('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'); @Month3 = ('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'); @Day0 = ('¬P´Á¤é', '¬P´Á¤@', '¬P´Á¤G', '¬P´Á¤T', '¬P´Á¥|', '¬P´Á¤', '¬P´Á¤»'); @Day1 = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); @Day2 = ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'); @Day3 = ('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'); $Week00 = '²Ä'; $Week01 = '¶g'; $Week1 = 'Week'; $Week2 = 'Woche'; $Week3 = 'Semaine';
$Space = ' ';
# table cell space packing for Netscape browser only if ( ($ENV{'HTTP_USER_AGENT'} =~ /Mozilla/i) && ($ENV{'HTTP_USER_AGENT'} !~ /MSIE/i) ) { $Pack = '<FONT STYLE="font-size:1pt"> </FONT>'; } else { $Pack = ''; }
# get time @aTime = localtime(timelocal(0,0,0,$Date,$Month,$Year));
# construct calendar if ($Cal==0) { $out = &calDate; } elsif ($Cal==1) { $out = &calMonth; }
# show output print "Content-type: text/html\n\n"; print $out;
exit(0);
########################################################################### # sub-routines ###########################################################################
sub calDate { my($Head1Col, $Head2Col, $ForeCol, $BackCol, $ShadowCol, $FontSize); my($Year, $Month, $Date, $Day, $Week); my($DateCal);
# define colours & constants $Head1Col = 'orange'; # Background colour for header $Head2Col = 'peru'; # Shadow colour for header if ($aTime[6]==0) { # Text colour $ForeCol = 'red'; } else { $ForeCol = 'green'; } $BackCol = 'lightyellow'; # Background colour $ShadowCol = 'silver'; # Shadow colour
# construct time components if ($Lang==0) { # Chinese $Year = $aTime[5]+1900; $Month = $Month0[$aTime[4]]; $Date = $aTime[3]; $Day = $Day0[$aTime[6]]; if ($aTime[7]<=$aTime[6]) { $Week = $Week00.' 0 '.$Week01; } else { $Week = $Week00.' '.ceil(($aTime[7]-$aTime[6])/7).' '.$Week01; }
$FontSize = '-2'; } elsif ($Lang==1) { # English $Year = $aTime[5]+1900; $Month = substr($Month1[$aTime[4]],0,3); $Date = $aTime[3]; $Day = $Day1[$aTime[6]]; if ($aTime[7]<=$aTime[6]) { $Week = $Week1.' 0'; } else { $Week = $Week1.' '.ceil(($aTime[7]-$aTime[6])/7); }
$FontSize = '+0'; } elsif ($Lang==2) { # German $Year = $aTime[5]+1900; $Month = substr($Month2[$aTime[4]],0,3); $Date = $aTime[3]; $Day = $Day2[$aTime[6]]; if ($aTime[7]<=$aTime[6]) { $Week = $Week2.' 0'; } else { $Week = $Week2.' '.ceil(($aTime[7]-$aTime[6])/7); }
$FontSize = '+0'; } elsif ($Lang==3) { # French $Year = $aTime[5]+1900; $Month = substr($Month3[$aTime[4]],0,3); $Date = $aTime[3]; $Day = $Day3[$aTime[6]]; if ($aTime[7]<=$aTime[6]) { $Week = $Week3.' 0'; } else { $Week = $Week3.' '.ceil(($aTime[7]-$aTime[6])/7); }
$FontSize = '+0'; }
# construct output $DateCal = qq~ <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"> <TR> <TD WIDTH="2" HEIGHT="6" BGCOLOR="$Head1Col">$Pack</TD> <TD WIDTH="36" BGCOLOR="$Head1Col">$Pack</TD> <TD WIDTH="36" BGCOLOR="$Head1Col">$Pack</TD> <TD WIDTH="2" BGCOLOR="$Head1Col">$Pack</TD> <TD WIDTH="3" BGCOLOR="$Head2Col">$Pack</TD> </TR> <TR> <TD HEIGHT="18" BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$BackCol" ALIGN="LEFT"><FONT FACE="Arial" COLOR="$ForeCol">$Year</FONT></TD> <TD BGCOLOR="$BackCol" ALIGN="RIGHT"><FONT FACE="Arial" SIZE="$FontSize" COLOR="$ForeCol">$Month</FONT></TD> <TD BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$ShadowCol">$Pack</TD> </TR> <TR> <TD HEIGHT="42" BGCOLOR="$BackCol">$Pack</TD> <TH BGCOLOR="$BackCol" ALIGN="CENTER" COLSPAN="2"><FONT FACE="Arial" SIZE="+3" COLOR="$ForeCol">$Date</FONT></TH> <TD BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$ShadowCol">$Pack</TD> </TR> <TR> <TD HEIGHT="12" BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$ForeCol" ALIGN="CENTER" COLSPAN="2"><FONT FACE="Arial" SIZE="-2" COLOR="$BackCol">$Day</FONT></TD> <TD BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$ShadowCol">$Pack</TD> </TR> <TR> <TD HEIGHT="18" BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$BackCol" ALIGN="CENTER" COLSPAN="2"><FONT FACE="Arial" SIZE="-2" COLOR="$ForeCol">$Week</FONT></TD> <TD BGCOLOR="$BackCol">$Pack</TD> <TD BGCOLOR="$ShadowCol">$Pack</TD> </TR> <TR> <TD HEIGHT="3" BGCOLOR="$ShadowCol" COLSPAN="5">$Pack</TD> </TR> </TABLE> ~;
return($DateCal); }
sub calMonth { my($SunCol, $DayCol, $WeekBGCol, $NumBGCol, $TodayCol, $BorderCol, $Width); my($Year, $Month, $D0, $D1, $D2, $D3, $D4, $D5, $D6); my($wday, $i, $j); my($MonthCal);
# define colours & constants $SunCol = 'red'; # Text colour for sundays $DayCol = 'black'; # Text colour for others $WeekBGCol = 'lightblue'; # Background colour for week header $NumBGCol = 'lightcyan'; # Background colour for others $TodayCol = 'lightyellow'; # Background highlight colour for today $BorderCol = 'skyblue'; # Border colour
$Width = 30;
# construct time components if ($Lang==0) { # Chinese $Year = $aTime[5]+1900; $Month = $Month0[$aTime[4]];
$D0 = substr($Day0[0],4,2); $D1 = substr($Day0[1],4,2); $D2 = substr($Day0[2],4,2); $D3 = substr($Day0[3],4,2); $D4 = substr($Day0[4],4,2); $D5 = substr($Day0[5],4,2); $D6 = substr($Day0[6],4,2); } elsif ($Lang==1) { # English $Year = $aTime[5]+1900; $Month = $Month1[$aTime[4]];
$D0 = substr($Day1[0],0,3); $D1 = substr($Day1[1],0,3); $D2 = substr($Day1[2],0,3); $D3 = substr($Day1[3],0,3); $D4 = substr($Day1[4],0,3); $D5 = substr($Day1[5],0,3); $D6 = substr($Day1[6],0,3); } elsif ($Lang==2) { # German $Year = $aTime[5]+1900; $Month = $Month2[$aTime[4]];
$D0 = substr($Day2[0],0,2); $D1 = substr($Day2[1],0,2); $D2 = substr($Day2[2],0,2); $D3 = substr($Day2[3],0,2); $D4 = substr($Day2[4],0,2); $D5 = substr($Day2[5],0,2); $D6 = substr($Day2[6],0,2); } elsif ($Lang==3) { # French $Year = $aTime[5]+1900; $Month = $Month3[$aTime[4]];
$D0 = substr($Day3[0],0,2); $D1 = substr($Day3[1],0,2); $D2 = substr($Day3[2],0,2); $D3 = substr($Day3[3],0,2); $D4 = substr($Day3[4],0,2); $D5 = substr($Day3[5],0,2); $D6 = substr($Day3[6],0,2); }
# get weekday of day1 $wday = $aTime[6]-($aTime[3]-1)%7; if ($wday<0) {$wday+=7;}
# construct table header $MonthCal = qq~ <TABLE BGCOLOR="$NumBGCol" BORDER="0" CELLPADDING="1" CELLSPACING="0"> <TR BGCOLOR="$BorderCol"> <TH COLSPAN="9">$Pack</TH> </TR> <TR> <TH BGCOLOR="$BorderCol">$Pack</TH> <TH COLSPAN="7"><FONT COLOR="$DayCol">$Year$Space$Space$Space$Month</FONT></TH> <TH BGCOLOR="$BorderCol">$Pack</TH> </TR> <TR BGCOLOR="$WeekBGCol"> <TH BGCOLOR="$BorderCol">$Pack</TH> <TH WIDTH="$Width"><FONT COLOR="$SunCol">$D0</FONT></TH> <TH WIDTH="$Width"><FONT COLOR="$DayCol">$D1</FONT></TH> <TH WIDTH="$Width"><FONT COLOR="$DayCol">$D2</FONT></TH> <TH WIDTH="$Width"><FONT COLOR="$DayCol">$D3</FONT></TH> <TH WIDTH="$Width"><FONT COLOR="$DayCol">$D4</FONT></TH> <TH WIDTH="$Width"><FONT COLOR="$DayCol">$D5</FONT></TH> <TH WIDTH="$Width"><FONT COLOR="$DayCol">$D6</FONT></TH> <TH BGCOLOR="$BorderCol">$Pack</TH> </TR> ~;
# construct pre-day1 table cells for ($i=0; $i<=($wday-1); $i++) { if ($i==0) { $MonthCal .= "<TR>\n"; $MonthCal .= "<TH BGCOLOR=\"$BorderCol\">$Pack</TH>\n"; } $MonthCal .= "<TH>$Space</TH>\n"; }
# construct day1->dayLast table cells for ($i=1; $i<=$MonthDays[$aTime[4]]; $i++) { if ($i==$aTime[3]) { $j=" BGCOLOR=\"$TodayCol\""; } else { $j=''; }
if ($wday==0) { $MonthCal .= "<TR>\n"; $MonthCal .= "<TH BGCOLOR=\"$BorderCol\">$Pack</TH>\n"; $MonthCal .= "<TH$j><FONT COLOR=\"$SunCol\">$i</FONT></TH>\n"; } elsif ($wday==6) { $MonthCal .= "<TH$j><FONT COLOR=\"$DayCol\">$i</FONT></TH>\n"; $MonthCal .= "<TH BGCOLOR=\"$BorderCol\">$Pack</TH>\n"; $MonthCal .= "</TR>\n"; } else { $MonthCal .= "<TH$j><FONT COLOR=\"$DayCol\">$i</FONT></TH>\n"; }
$wday++; if ($wday==7) {$wday=0;} }
# construct post-dayLast table cells if ($wday!=0) { for ($i=$wday; $i<=6; $i++) { $MonthCal .= "<TH>$Space</TH>\n"; if ($i==6) { $MonthCal .= "<TH BGCOLOR=\"$BorderCol\">$Pack</TH>\n"; $MonthCal .= "</TR>\n"; } } }
# construct table footer $MonthCal .= qq~ <TR BGCOLOR="$BorderCol"> <TH COLSPAN="9">$Pack</TH> </TR> </TABLE> ~;
return($MonthCal); }
sub isLeap { my($y)=shift; if (($y%4==0)&&($y%100!=0)||($y%400==0)) { return(1); } else { return(0); } }
|