#!/usr/bin/perl
##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# Calendar (by: Dan C Clark)
# Created: December, 15 ,2000
# ©2002 Daniel C. Clark (www.dancclark.com)
# Everything for the calendar is included in this file
##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
use CGI qw(:all) ;
use CGI::Carp qw(fatalsToBrowser);
@days=( "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
@monarr=("31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31");
@months = ('January','February','March','April','May','June','July',
'August','September','October','November','December');
$eventsPath = "/home/events" ; # Full Path to writable directory where events are stored
$todaysdate=`date +%B__%d,_%Y`; # Should remove this, because it forks
$todaysdate=~s/_/ /g;
$end_a="";
$cal =`cal`;
$m_day =`date +%w`;
$digitday=`date +%d`;
$digitday=~s/\n|\s|\?//g;
$m_day =~s/\n|\s|\?//g;
$c = 0;
$home =qq(
Home
);
sub default {
$m_day =`date +%w`;
$m_year =`date +%Y`;
$m_mon =`date +%m`;
$m_mon =~s/^0//g ;
$m_mon =~s/\n//g ;
$m_mon =~s/\?|\s//g;
$mon = $m_mon ;
$myyear = $m_year ;
$myyear =~s/\n|\s|\?//g;
$m_day =~s/\n|\s|\?//g;
}
if (defined param('doAdd')) { AddEvent(); }
elsif (defined param('searchMe')) { SearchEvent(); }
elsif (defined param('del')) { DelEvent(); }
elsif (defined param('new')) { NewEvent(); }
elsif (defined param('get')) { GetEvent(); }
elsif (defined param('d_e')) { DelEntry(); }
elsif (defined param('edd')) { EditView(); }
elsif (defined param('chg')) { ChgEvent(); }
elsif (defined param('upd')) { Update(); }
else { noselect(); }
sub DelEntry { #physically removes entry
my $mon_in = param('m') ;
my $day_in = param('d') ;
my $year_in= param('y') ;
my $db_new = $year_in .$mon_in .$day_in ;
$un1 = unlink "$eventsPath/$db_new.db";
##dbmopen(%dan, "$eventsPath/$db_new", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
##delete ;
##dbmclose(%dan);
my $dbdate = $mon_in . $year_in ;
$un2 = unlink "$eventsPath/$dbdate.db" ;
#dbmopen(%dn, "$eventsPath/$dbdate", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
#$dn{$day_in} = 1 ;
#dbmclose(%dn);
noselect() ;
}
sub ChgEvent {
my $mon_in = param('m') ;
my $day_in = param('d') ;
my $year_in= param('y') ;
if (!$mon_in || !$day_in || !$year_in) { noselect(); exit 0; }
my $db_new = $year_in .$mon_in .$day_in ;
dbmopen(%dan, "$eventsPath/$db_new", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
foreach (keys %dan) {
$all_tab .= qq( |
$days[day_in], @months[$mon_in] $day_in $year_in :: $_
|
|
|
);
}
dbmclose(%dan);
$html=qq(
$home );
print header;
print $html ;
}
sub Update {
my $mon_in = param('m') ;
my $day_in = param('d') ;
my $year_in= param('y') ;
if (!$mon_in || !$day_in || !$year_in) { noselect(); exit 0; }
my $db_new = $year_in .$mon_in .$day_in ;
dbmopen(%dan, "$eventsPath/$db_new", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
foreach (keys %dan) {
$dan{$_} = param("$_");
}
dbmclose(%dan);
noselect() ;
}
sub noselect
{
make() ;
calHTML();
print header ;
print " $html
$days
";
}
sub SearchEvent { noselect(); }
sub EditView {
make() ;
$html = qq(Click on Hyperlinked dates to EditHome);
print header ;
print $html ;
}
sub DelEvent {
make() ;
$html = qq(Click on Hyperlinked dates to DeleteHome);
print header ;
print $html ;
}
sub NewEvent {
$mon_in = param('m') ;
$day_in = param('d') ;
$year_in= param('y') ;
$time_in= param('t') ;
$text_in= param('txt') ;
$db_new = $year_in .$mon_in .$day_in ; # ie : a unique date ( 2000713) --- Dan CLark (7/14/2000)
dbmopen(%dan, "$eventsPath/$db_new", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
if ($dan{$time_in}) { $text_in .= "
" .$dan{$time_in} ; }
$dan{$time_in} = $text_in ."
" ;
dbmclose(%dan);
my $dbdate = $mon_in . $year_in ;
dbmopen(%dn, "data/$dbdate", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
$dn{$day_in} = 1 ;
dbmclose(%dn);
generic_print() ;
}
sub generic_print {
doTables() ;
$hash_mon = setMonth() ;
$hash_year = setYear() ;
theDetails();
calHTML() ;
print header ;
print " $html
$days
";
}
sub GetEvent {
$mon_in = param('m') ;
$day_in = param('d') ;
$year_in= param('y') ;
$eventDetails =1;
my $db_new = $year_in .$mon_in .$day_in ;
dbmopen(%dan, "$eventsPath/$db_new", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
foreach (keys %dan) {
$hash_evnt .= qq( $dan{$_} );
}
dbmclose(%dan);
generic_print() ;
}
sub AddEvent {
$html= makeHTMLevent() ;
print header ;
print $html ;
}
sub doTables
{
$mon = param('m') ;
$myyear = param('y') ;
$g = 1;
$isOn = 0;
if (!$mon || !$myyear || $mon > 12 || $mon < 1 || $myyear < 1900 ) { default() ; }
if ((($myyear % 4 == 0) && ($myyear % 100 != 0)) || ($myyear % 400 == 0)) { @monarr[1] = "29"; }
$fin = @monarr[$mon - 1] ; # @monarr is a 0 based array -- Dan (7/13/00))
$begin = dayofweek(1,$mon,$myyear);
$begin++; # dday derived 'begin' is in range 0-6. I need 1-7 -- Dan (7/11/00)
$db_date .=$mon;
$db_date .=$myyear ;
if (!$fin) { $fin = 31 ; }
dbmopen(%dannyd, "data/$db_date", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
$tables =qq(\n\n) ;
$tables .=qq( \n) ;
$tables .=qq( \n) ;
$tables .=qq( \n) ;
$tables .=qq( \n) ;
$tables .=qq( \n) ;
foreach (1..42)
{
$url ="";
$end_a ="";
if ($_ == 36 && $isOn == 0) { last; }
if ($_ == $begin) { $isOn=1; $w=0; }
if ($w == $fin ) { $isOn=0; }
if ($isOn) {
######### For deleting only ################
if (defined param('del')) {
if ($dannyd{$g}) { $url = qq( ); $end_a=""; }
}
###########################################
elsif (defined param('edd')) {
if ($dannyd{$g}) { $url = qq( ); $end_a=""; }
}
else {
if ($dannyd{$g}) { $url = qq( ); $end_a=""; }
}
$tables.= qq(\n \n | $url $g $end_a | ) ;
$g++;
$w++;
}
else { $tables.= qq( \n\n | ) ; }
if ($_ % 7 == 0 && $_ != 0) { $tables.="\n"; }
}
dbmclose(%dannyd);
}
sub dayofweek {
my ($day, $month, $year) = @_;
# When is doomsday this year?
my $doomsday = doomsday( $year );
# And when is doomsday this month?
my $baseday;
if ( $month == 2 ) {
$baseday = isleap($year) ? 29 : 28;
# For even months, the Nth day of the Nth month is doomsday
} elsif ( $month % 2 == 0 ) {
$baseday = $month;
# I work from 9-5 at the 7-11
} elsif ( $month == 5 ) {
$baseday = 9;
} elsif ( $month == 9 ) {
$baseday = 5;
} elsif ( $month == 7 ) {
$baseday = 11;
} elsif ( $month == 11 ) {
$baseday = 7;
# march
} elsif ( $month == 3 ) {
$baseday = 7;
# January
} elsif ( $month == 1 ) {
$baseday = isleap($year) ? 32 : 31;
}
# And how far after that are we?
my $on = $day - $baseday;
$on = $on % 7;
# And, just to make sure it's positive ...
$on = ($on + 7) % 7;
# So, the day of the week should be doomsday, plus however far on we are
return ($doomsday + $on) % 7;
}
sub isleap {
my ($year) = @_;
return 1 if ( ($year % 4 == 0) &&
( ($year % 100) || ($year % 400 == 0) ) );
return 0;
}
sub doomsday {
$yearss = @_[0] ;
# All your base ...
my %base = ( 1500 => 3, 1600 => 2, 1700 => 0,
1800 => 5, 1900 => 3, 2000 => 2,
2100 => 0, 2200 => 5, 2300 => 3,
2400 => 2, 2500 => 0, 2600 => 5 );
my $century = $yearss - ( $yearss % 100 );
if ($century < 1500 || $century > 2600) {
warn "Date is outside the range that I know about.";
exit();
}
my $base = $base{$century};
my $twelves = int ( ( $yearss - $century )/12);
my $rem = ( $yearss - $century ) % 12;
my $fours = int ($rem/4);
my $doomsday = $base + ($twelves + $rem + $fours)%7;
# ... are belong to Dooms day - Danny D !
return $doomsday % 7;
}
sub make
{
doTables() ;
$hash_mon = setMonth() ;
$hash_year = setYear() ;
$hash_evnt = doEvents() ;
#else { $hash_evnt =" "; }
theDetails() ;
}
sub theDetails {
if ($eventDetails) {
$eventDate="Events for: @days[dayofweek($day_in,$mon_in,$year_in)], @months[$mon_in - 1] $day_in, $year_in " ;
}
### else { $eventDate ="@days[$m_day], @months[$mon - 1] $digitday, $myyear " ; }
$gen_cal =qq(
$tables
|
| |
);
}
sub doEvents {
# default() ;
$my_evnt .=$myyear ;
$my_evnt .=$mon ;
$my_evnt .=$digitday ;
dbmopen(%eve, "$eventsPath/$my_evnt", 0777) || die "Can't open DBM Dan (line 41 ) ---> $! " ;
$ww=0;
foreach (keys %eve)
{
@tmp[$ww] = $_ ;
$ww++ ;
}
foreach (sort { $b <=> $a } @tmp)
{
$h_evnt.=qq( $eve{$_} );
}
return $h_evnt ;
}
sub setDay
{
my $m_day =`date +%w`;
$m_day =~s/^0|\s|\n//g;
foreach (1..31) {
$ddd =" " ;
if ($m_day == $_) { $ddd =~s/\ " ;
if ($c == $danclark) { $p =~s/\ |