#!/usr/local/bin/perl require 'timelocal.pl'; @month_names = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', December'); @wday_names = ('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'); @color_names = ('red', 'green', 'blue', 'yellow'); $user = $ENV{'REMOTE_USER'}; @ltime = localtime; $year = $ltime[5] + 1900; $month = $ltime[4] + 1; if ($ENV{'QUERY_STRING'} ne '') { local(@pairs) = split (/&/, $ENV{'QUERY_STRING'}); local ($i); for ($i = 0; $i <= $#pairs; $i++) { local(@entry) = split (/=/, $pairs[$i]); if ($entry[0] eq 'month') { $month = $entry[1]; } elsif ($entry[0] eq 'year') { $year = $entry[1]; } } } print <<__EOF__; Content-type: text/html Calendar

${user}'s calendar for $month/$year

\n\n
__EOF__ if ($month == 1) { $prev = sprintf ("month=12&year=%d", $year - 1); &print_cal (12, $year - 1); } else { $prev = sprintf ("month=%d&year=%d", $month - 1, $year); &print_cal ($month - 1, $year); } printf (""); &print_cal ($month, $year); printf (""); if ($month == 12) { $next = sprintf ("month=1&year=%d", $year + 1); &print_cal (1, $year + 1); } else { $next = sprintf ("month=%d&year=%d", $month + 1, $year); &print_cal ($month + 1, $year); } print <<__EOF__;

Previous Month   Next Month

Month:     Year:    
__EOF__ sub print_cal { local($month) = $_[0]; local($year) = $_[1]; local($time) = timelocal (0, 0, 0, 1, $month - 1, $year - 1900); local(@ltime) = localtime ($time); local($wday) = $ltime[6]; local($ndays,$day); local(@appointments) = &parse_appointments ($month, $year); if (($month % 2 == 0) == ($month >= 8)) { $ndays = 31; } elsif ($month != 2) { $ndays = 30; } elsif ($year % 4 == 0) { $ndays = 29; } else { $ndays = 28; } print <<__EOF__; __EOF__ for ($day = 1; $day < 6; $day++) { printf ("", $wday_names[$day]); } print <<__EOF__; __EOF__ for ($day = 0; $day < $wday; $day++) { printf (""); } for ($day = 1; $day <= $ndays; $day++, $wday++) { if ($wday == 7) { $wday = 0; printf ("\n"); } printf ("", "day-cal.pl", $year, $month, $day, $user, $day); } printf ("
$month_names[$month - 1] $year
$wday_names[0]%s
$wday_names[6]

", $appointments[$day - 1]); printf ("%d
"); } sub parse_appointments { local($month) = $_[0]; local($year) = $_[1]; local(@colors); open (APP, "<$user.app"); while () { chop; local(@entry) = split (/ /); local(@date) = split (/\//, $entry[0]); if ($date[0] == $month && $date[2] == $year) { if ($entry[1] eq 'group') { colors[$date[1] - 1] += &find_color ($entry[2]) + 1; } else { colors[$date[1] - 1] += 10 * (&find_color ($entry[2]) + 1); } } } close (APP); @colors; } sub find_color { local($color) = $_[0]; local($i); for ($i = 0; $i <= $#color_names; $i++) { if ($color eq $color_names[$i]) { return $i; } } 0; }