--- loncom/interface/lonhtmlcommon.pm	2002/08/13 00:37:18	1.7
+++ loncom/interface/lonhtmlcommon.pm	2002/09/17 15:32:46	1.10
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common html routines
 #
-# $Id: lonhtmlcommon.pm,v 1.7 2002/08/13 00:37:18 stredwic Exp $
+# $Id: lonhtmlcommon.pm,v 1.10 2002/09/17 15:32:46 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -25,11 +25,230 @@
 #
 # http://www.lon-capa.org/
 #
+######################################################################
+######################################################################
+
+=pod
+
+=head1 NAME
+
+Apache::lonhtmlcommon - routines to do common html things
+
+=head1 SYNOPSIS
+
+Referenced by other mod_perl Apache modules.
+
+=head1 INTRODUCTION
+
+lonhtmlcommon is a collection of subroutines used to present information
+in a consistent html format, or provide other functionality related to
+html.
+
+=head2 General Subroutines
+
+=over 4
+
+=cut 
+
+######################################################################
+######################################################################
 
 package Apache::lonhtmlcommon;
 
+use Time::Local;
 use strict;
 
+##############################################
+##############################################
+
+=pod
+
+=item &date_setter
+
+Inputs
+
+=over 4
+
+=item $dname 
+
+The name to prepend to the form elements.  
+The form elements defined will be dname_year, dname_month, dname_day,
+dname_hour, dname_min, and dname_sec.
+
+=item $currentvalue
+
+The current setting for this time parameter.  A unix format time
+(time in seconds since the beginning of Jan 1st, 1970, GMT.  
+An undefined value is taken to indicate the value is the current time.
+Also, to be explicit, a value of 'now' also indicates the current time.
+
+=cut
+
+##############################################
+##############################################
+sub date_setter {
+    my ($formname,$dname,$currentvalue) = @_;
+    if (! defined($currentvalue) || $currentvalue eq 'now') {
+        $currentvalue = time;
+    }
+    # other potentially useful values:     wkday,yrday,is_daylight_savings
+    my ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) = 
+        localtime($currentvalue);
+    $year += 1900;
+    my $result = "\n<!-- $dname date setting form -->\n";
+    $result .= <<ENDJS;
+<script language="Javascript">
+    function $dname\_checkday() {
+        var day   = document.$formname.$dname\_day.value;
+        var month = document.$formname.$dname\_month.value;
+        var year  = document.$formname.$dname\_year.value;
+        var valid = true;
+        if (day < 1) {
+            document.$formname.$dname\_day.value = 1;
+        } 
+        if (day > 31) {
+            document.$formname.$dname\_day.value = 31;
+        }
+        if ((month == 1)  || (month == 3)  || (month == 5)  ||
+            (month == 7)  || (month == 8)  || (month == 10) ||
+            (month == 12)) {
+            if (day > 31) {
+                document.$formname.$dname\_day.value = 31;
+                day = 31;
+            }
+        } else if (month == 2 ) {
+            if ((year % 4 == 0) && (year % 100 != 0)) {
+                if (day > 29) {
+                    document.$formname.$dname\_day.value = 29;
+                }
+            } else if (day > 29) {
+                document.$formname.$dname\_day.value = 28;
+            }
+        } else if (day > 30) {
+            document.$formname.$dname\_day.value = 30;
+        }
+    }
+</script>
+ENDJS
+    $result .= "  <select name=\"$dname\_month\" ".
+        "onChange=\"javascript:$dname\_checkday()\" >\n";
+    my @Months = qw/January February  March     April   May      June 
+                    July    August    September October November December/;
+    # Pad @Months with a bogus value to make indexing easier
+    unshift(@Months,'If you can read this an error occurred');
+    for(my $m = 1;$m <=$#Months;$m++) {
+        $result .= "      <option value=\"$m\" ";
+        $result .= "selected " if ($m-1 == $month);
+        $result .= "> $Months[$m] </option>\n";
+    }
+    $result .= "  </select>\n";
+    $result .= "  <input type=\"text\" name=\"$dname\_day\" ".
+            "value=\"$mday\" size=\"3\" ".
+            "onChange=\"javascript:$dname\_checkday()\" />\n";
+    $result .= "  <input type=\"year\" name=\"$dname\_year\" ".
+            "value=\"$year\" size=\"5\" ".
+            "onChange=\"javascript:$dname\_checkday()\" />\n";
+    $result .= "&nbsp;&nbsp;";
+    $result .= "  <select name=\"$dname\_hour\" >\n";
+    for (my $h = 0;$h<24;$h++) {
+        $result .= "      <option value=\"$h\" ";
+        $result .= "selected " if ($hour == $h);
+        $result .= "> ";
+        if ($h == 0) {
+            $result .= "12 am";
+        } elsif($h == 12) {
+            $result .= "12 noon";
+        } elsif($h < 12) {
+            $result .= "$h am";
+        } else {
+            $result .= $h-12 ." pm";
+        }
+        $result .= " </option>\n";
+    } 
+    $result .= "  </select>\n";
+    $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".
+        "value=\"$min\" size=\"3\" /> m\n";
+    $result .= "  <input type=\"text\" name=\"$dname\_second\" ".
+        "value=\"$sec\" size=\"3\" /> s\n";
+    $result .= "<!-- end $dname date setting form -->\n";
+    return $result;
+}
+
+##############################################
+##############################################
+
+=item &get_date_from_form
+
+Inputs:
+
+=over 4
+
+=item $dname
+
+The name passed to &datesetter, which prefixes the form elements.
+
+=item $defaulttime
+
+The unix time to use as the default in case of poor inputs.
+
+=back
+
+Returns: Unix time represented in the form.
+
+=cut
+
+##############################################
+##############################################
+sub get_date_from_form {
+    my ($dname) = @_;
+    my ($sec,$min,$hour,$day,$month,$year);
+    #
+    if (defined($ENV{'form.'.$dname.'_second'})) {
+        my $tmpsec = $ENV{'form.'.$dname.'_second'};
+        if (($tmpsec =~ /^\d+$/) && ($tmpsec >= 0) && ($tmpsec < 60)) {
+            $sec = $tmpsec;
+        }
+    }
+    if (defined($ENV{'form.'.$dname.'_minute'})) {
+        my $tmpmin = $ENV{'form.'.$dname.'_minute'};
+        if (($tmpmin =~ /^\d+$/) && ($tmpmin >= 0) && ($tmpmin < 60)) {
+            $min = $tmpmin;
+        }
+    }
+    if (defined($ENV{'form.'.$dname.'_hour'})) {
+        my $tmphour = $ENV{'form.'.$dname.'_hour'};
+        if (($tmphour =~ /^\d+$/) && ($tmphour > 0) && ($tmphour < 32)) {
+            $hour = $tmphour;
+        }
+    }
+    if (defined($ENV{'form.'.$dname.'_day'})) {
+        my $tmpday = $ENV{'form.'.$dname.'_day'};
+        if (($tmpday =~ /^\d+$/) && ($tmpday > 0) && ($tmpday < 32)) {
+            $day = $tmpday;
+        }
+    }
+    if (defined($ENV{'form.'.$dname.'_month'})) {
+        my $tmpmonth = $ENV{'form.'.$dname.'_month'};
+        if (($tmpmonth =~ /^\d+$/) && ($tmpmonth > 0) && ($tmpmonth < 13)) {
+            $month = $tmpmonth - 1;
+        }
+    }
+    if (defined($ENV{'form.'.$dname.'_year'})) {
+        my $tmpyear = $ENV{'form.'.$dname.'_year'};
+        if (($tmpyear =~ /^\d+$/) && ($tmpyear > 1900)) {
+            $year = $tmpyear - 1900;
+        }
+    }
+    if (eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {
+        return &timelocal($sec,$min,$hour,$day,$month,$year);
+    } else {
+        return undef;
+    }
+}
+
+##############################################
+##############################################
+
 sub AscendOrderOptions {
     my ($order, $page, $formName)=@_;
 
@@ -85,6 +304,76 @@ sub MapOptions {
     return $Str;
 }
 
+sub ProblemOptions {
+    my ($data, $page, $map, $formName)=@_;
+    my $Str = '';
+    $Str .= '<select name="';
+    $Str .= (($page)?$page:'').'ProblemSelect"';
+    if($formName) {
+        $Str .= ' onchange="document.'.$formName.'.submit()"';
+    }
+    $Str .= '>'."\n";
+
+    my $selected = 0;
+    foreach my $sequence (split(':',$data->{'orderedSequences'})) {
+	if($data->{$sequence.':title'} eq $map || $map eq 'All Maps') {
+	    foreach my $problem (split(':', $data->{$sequence.':problems'})) {
+		$Str .= '<option';
+		if($data->{$page.'ProblemSelect'} eq 
+		   $data->{$problem.':title'}) {
+		    $Str .= ' selected';
+		    $selected = 1;
+		}
+		$Str .= '>'.$data->{$problem.':title'}.'</option>'."\n";
+	    }
+	}
+    }
+    $Str .= '<option';
+    if(!$selected) {
+        $Str .= ' selected';
+    }
+    $Str .= '>All Problems</option>'."\n";
+
+    $Str .= '</select>'."\n";
+
+    return $Str;
+}
+
+sub PartOptions {
+    my ($data, $page, $parts, $formName)=@_;
+    my $Str = '';
+
+    if(!defined($parts)) {
+	return '';
+    }
+
+    $Str .= '<select name="';
+    $Str .= (($page)?$page:'').'PartSelect"';
+    if($formName) {
+        $Str .= ' onchange="document.'.$formName.'.submit()"';
+    }
+    $Str .= '>'."\n";
+
+    my $selected = 0;
+    foreach my $part (@$parts) {
+	$Str .= '<option';
+	if($data->{$page.'PartSelect'} eq $part) {
+	    $Str .= ' selected';
+	    $selected = 1;
+	}
+	$Str .= '>'.$part.'</option>'."\n";	     
+    }
+    $Str .= '<option';
+    if(!$selected) {
+        $Str .= ' selected';
+    }
+    $Str .= '>All Parts</option>'."\n";
+
+    $Str .= '</select>'."\n";
+
+    return $Str;
+}
+
 sub StudentOptions {
     my ($cache, $students, $selectedName, $page, $formName)=@_;
 
@@ -175,15 +464,9 @@ sub Title {
     my $Str = '';
 
     $Str .= '<html><head><title>'.$pageName.'</title></head>'."\n";
-    $Str .= '<body bgcolor="#FFFFFF">'."\n";
+    $Str .= &Apache::loncommon::bodytag($pageName)."\n";
     $Str .= '<script>window.focus(); window.width=500;window.height=500;';
     $Str .= '</script>'."\n";
-    $Str .= '<table width="100%"><tr><td valign="top">';
-    $Str .= '<h1> Course: ';
-    $Str .= $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
-    $Str .= '</h1></td><td align="right">'."\n";
-    $Str .= '<img align="right" src=/adm/lonIcons/lonlogos.gif>';
-    $Str .= '</td></tr></table>'."\n";
 
     return $Str;
 }
@@ -245,7 +528,7 @@ sub CreateHeadings {
 
 =item &FormatStudentInformation()
 
-This function produces a formatted string of the student's information:
+This function produces a formatted string of the student\'s information:
 username, domain, section, full name, and PID.
 
 =over 4