#!/usr/bin/perl
# class_schedule_maker.pl
# CGI for creating a class schedule
# Copyright (C) 2000 Brock Wilcox
# Released under the same terms as Perl itself
# HISTORY
# 2000.08.16.23.54
# - Now goes all the way through the process correctly
# - Uses code from scheduler.pl for converting
# to pretty schedule
# 2000.08.16.21.26
# - Shifted towards events wrather than classes
# 2000.08.15.04.24
# - Adapted from schedule4.pl
use BrockCGI;
use BrockHTML;
use Time::Local;
@colors = ("#ff0000",,"#0000ff","#00ff00","#ff00ff","#00ffff",
"#ffff00","#ff8888","#8888ff","#88ff88","#ff88ff","#88ffff","#ffff88");
sub print_input_form
{
print "
ENDPRINT
stop_block;
}
sub print_current_table
{
print <<" LIST_HEADER";
Event
Start
End
Days
Description
LIST_HEADER
# Loop through, printing out current data
for($i=0;$i<$length;$i++)
{
print "\n";
print "" . $data{'event'}[$i] . " \n";
print " $data{'start_hour'}[$i]:" .
$data{'start_min'}[$i] . " " .
($data{'start_ampm'}[$i] == 0 ? "AM" : "PM") . " \n";
print " $data{'end_hour'}[$i]:" .
$data{'end_min'}[$i] . " " .
($data{'end_ampm'}[$i] == 0 ? "AM" : "PM") . " \n";
print "";
if ($data{'monday'}[$i] eq 'on') {print "M";}
if ($data{'tuesday'}[$i] eq "on") {print "T";}
if ($data{'wednesday'}[$i] eq "on") {print "W";}
if ($data{'thursday'}[$i] eq "on") {print "TH";}
if ($data{'friday'}[$i] eq "on") {print "F";}
if ($data{'satday'}[$i] eq "on") {print "S";}
if ($data{'sunday'}[$i] eq "on") {print "SU";}
print " \n";
print "", $data{'description'}[$i], " \n";
print " \n";
}
print "
\n \n";
}
sub create_event_list
{
for($i=0;$i<$length;$i++)
{
$start = timelocal(0,
$data{'start_min'}[$i],
($data{'start_hour'}[$i]%12)+12*$data{'start_ampm'}[$i],
1,0,2000);
$end = timelocal(0,
$data{'end_min'}[$i],
($data{'end_hour'}[$i]%12)+12*$data{'end_ampm'}[$i],
1,0,2000);
$desc = $data{'description'}[$i];
$color = $colors[$data{'color'}[$i]];
$event = $data{'event'}[$i];
if($data{'sunday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*0,
'end' => $end + 60*60*24*0,
'desc' => $desc,
'color' => $color};
}
if($data{'monday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*1,
'end' => $end + 60*60*24*1,
'desc' => $desc,
'color' => $color};
}
if($data{'tuesday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*2,
'end' => $end + 60*60*24*2,
'desc' => $desc,
'color' => $color};
}
if($data{'wednesday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*3,
'end' => $end + 60*60*24*3,
'desc' => $desc,
'color' => $color};
}
if($data{'thursday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*4,
'end' => $end + 60*60*24*4,
'desc' => $desc,
'color' => $color};
}
if($data{'friday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*5,
'end' => $end + 60*60*24*5,
'desc' => $desc,
'color' => $color};
}
if($data{'saturday'}[$i] eq 'on')
{
push @events,{
'event' => $event,
'start' => $start + 60*60*24*6,
'end' => $end + 60*60*24*6,
'desc' => $desc,
'color' => $color};
}
}
}
sub dump_event_list
{
print <<" ENDPRINT";
Event
Start
End
Description
ENDPRINT
foreach $event (@events)
{
print "{color} . "\">\n";
print "" . $event->{event} . " \n";
print "" . $event->{start} . " \n";
print "" . $event->{end} . " \n";
print "" . $event->{desc} . " \n";
print " \n";
}
print <<" ENDPRINT";
ENDPRINT
}
sub convert_event_list
{
$start_day = timelocal(0,0,0,1,0,2000);
$stop_day = timelocal(0,0,0,7,0,2000);
$start_time = 60*60*9;
$stop_time = 60*60*16 - 1;
$time_inc = 60*10;
for($day=$start_day;$day<=$stop_day;$day+=60*60*24)
{
for($hour=$start_time;$hour<=$stop_time;$hour+=$time_inc)
{
$col = int (($day - $start_day) / (60*60*24));
$row = int (($hour - $start_time) / $time_inc);
$s_time = $day+$hour;
$e_time = $day+$hour+$time_inc;
$sch[$col][$row][0] = '';
$sch[$col][$row][1] = '#dddddd';
foreach $event (@events)
{
if(($event->{start}>=$s_time) && ($event->{start}<$e_time))
{
if(length $sch[$col][$row][0]>0)
{
$sch[$col][$row][0] .= ' ' . $event->{event};
} else {
$sch[$col][$row][0] = $event->{event};
}
}
if($event->{start}<$e_time and $event->{end}>$s_time)
{
$sch[$col][$row][1] = ($event->{color} or '#444499');
}
}
}
}
}
sub print_sch
{
# $start_day = timelocal(0,0,0,1,0,2000);
# $stop_day = timelocal(0,0,0,7,0,2000);
# $start_time = 0;
# $stop_time = 60*60*24 - 1;
# $time_inc = 60*30;
print " \n";
print "\n";
print "\n \n";
# for($day=$start_day;$day<=$stop_day;$day+=60*60*24)
for $day ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')
{
# print "",substr(scalar localtime($day),0,3)," \n";
print "$day \n";
}
print " \n";
$t = $start_time;
for $x (0 .. $#{$sch[0]})
{
print "\n";
print "",substr(scalar localtime($t+$start_day),-13,5)," \n";
$t += $time_inc;
for $y (0 .. $#sch)
{
print "$sch[$y][$x][0] \n";
}
print " \n";
}
print "
\n";
}
sub print_current_list_with_done
{
print " \n";
start_block("width" => "80%");
print_current_table;
print "\n\n";
# Save current data
foreach $name (keys %data)
{
foreach $value (@{$data{$name}})
{
print " \n";
}
}
print " \n";
print " \n \n";
stop_block;
}
sub print_current_list
{
print " \n";
start_block("width" => "80%");
print_current_table;
print " \n";
stop_block;
}
sub parse_form
{
if ($length > 0)
{
# Make sure values are there.
# If not, we will give them one.
if (scalar(@{$data{'monday'}}) < $length) {push @{$data{'monday'}}, "off";}
if (scalar(@{$data{'tuesday'}}) < $length) {push @{$data{'tuesday'}}, "off";}
if (scalar(@{$data{'wednesday'}}) < $length) {push @{$data{'wednesday'}}, "off";}
if (scalar(@{$data{'thursday'}}) < $length) {push @{$data{'thursday'}}, "off";}
if (scalar(@{$data{'friday'}}) < $length) {push @{$data{'friday'}}, "off";}
if (scalar(@{$data{'satday'}}) < $length) {push @{$data{'satday'}}, "off";}
if (scalar(@{$data{'sunday'}}) < $length) {push @{$data{'sunday'}}, "off";}
if ($data{'event'}[$length - 1] eq "") {$data{'class'}[$length - 1] = " ";}
if ($data{'start_hour'}[$length - 1] eq "") {$data{'start_hour'}[$length - 1] = " ";}
if ($data{'start_min'}[$length - 1] eq "") {$data{'start_min'}[$length - 1] = " ";}
#if ($data{'start_ampm'}[$length - 1] eq "") {$data{'start_ampm'}[$length - 1] = " ";}
if ($data{'end_hour'}[$length - 1] eq "") {$data{'end_hour'}[$length - 1] = " ";}
if ($data{'end_min'}[$length - 1] eq "") {$data{'end_min'}[$length - 1] = " ";}
#if ($data{'end_ampm'}[$length - 1] eq "") {$data{'end_ampm'}[$length - 1] = " ";}
if ($data{'description'}[$length - 1] eq "") {$data{'description'}[$length - 1] = " ";}
# print "\n";
# foreach $name (keys %data)
# {
# print "$name \n";
# print "\n";
# foreach $value (@{$data{$name}})
# {
# print "$value \n";
# }
# print " \n";
# }
# print " \n";
}
}
# Main Program
# Get CGI vars
%data = &get_data;
# Start HTML
start_html("title" => "Hello",
"bgcolor" => "#ccccff");
# Set length to the number of colors.
$length = scalar(@{$data{'color'}});
# Parse the previous data
parse_form;
if (exists $data{'done'})
{
# Print the current list of classes
print_current_table;
create_event_list;
# dump_event_list;
convert_event_list;
print_sch;
} else {
# Print the input form
print_input_form;
# Print the current list of classes
print_current_list_with_done;
}
print " \n";
# Stop HTML
stop_html;
# End of class_schedule_maker.pl