version 1.5, 2002/07/26 16:22:09
|
version 1.15, 2003/03/03 22:00:03
|
Line 25
|
Line 25
|
# |
# |
# http://www.lon-capa.org/ |
# 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; |
package Apache::lonhtmlcommon; |
|
|
|
use Time::Local; |
use strict; |
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 .= " "; |
|
$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)=@_; |
|
|
|
my $OpSel1 = ''; |
|
my $OpSel2 = ''; |
|
|
|
if($order eq 'Ascending') { |
|
$OpSel1 = ' selected'; |
|
} else { |
|
$OpSel2 = ' selected'; |
|
} |
|
|
|
my $Str = ''; |
|
$Str .= '<select name="'.(($page)?$page:'').'Ascend"'; |
|
if($formName) { |
|
$Str .= ' onchange="document.'.$formName.'.submit()"'; |
|
} |
|
$Str .= '>'."\n"; |
|
$Str .= '<option'.$OpSel1.'>Ascending</option>'."\n". |
|
'<option'.$OpSel2.'>Descending</option>'."\n"; |
|
$Str .= '</select>'."\n"; |
|
|
|
return $Str; |
|
} |
|
|
sub MapOptions { |
sub MapOptions { |
my ($data, $page)=@_; |
my ($data, $page, $formName)=@_; |
my $Str = ''; |
my $Str = ''; |
$Str .= '<select name="'; |
$Str .= '<select name="'; |
$Str .= (($page)?$page:'').'Map">'."\n"; |
$Str .= (($page)?$page:'').'Maps"'; |
|
if($formName) { |
|
$Str .= ' onchange="document.'.$formName.'.submit()"'; |
|
} |
|
$Str .= '>'."\n"; |
|
|
my $selected = 0; |
my $selected = 0; |
foreach my $sequence (split(':',$data->{'orderedSequences'})) { |
foreach my $sequence (split(':',$data->{'orderedSequences'})) { |
$Str .= '<option'; |
$Str .= '<option'; |
if($data->{$page.'Map'} eq $data->{$sequence.':title'}) { |
if($data->{$page.'Maps'} eq $data->{$sequence.':title'}) { |
$Str .= ' selected'; |
$Str .= ' selected'; |
$selected = 1; |
$selected = 1; |
} |
} |
Line 56 sub MapOptions {
|
Line 304 sub MapOptions {
|
return $Str; |
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 { |
sub StudentOptions { |
my ($cache, $students, $selectedName, $page, $formName)=@_; |
my ($cache, $students, $selectedName, $page, $formName)=@_; |
|
|
Line 120 sub StatusOptions {
|
Line 438 sub StatusOptions {
|
$Str .= '</select>'."\n"; |
$Str .= '</select>'."\n"; |
} |
} |
|
|
|
|
|
######################################################## |
|
######################################################## |
|
|
|
=pod |
|
|
|
=item &MultipleSectionSelect() |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
=item $sections A references to an array containing the names of all the |
|
sections used in a class. |
|
|
|
=item $selectedSections A reference to an array containing the names of the |
|
currently selected sections. |
|
|
|
=back |
|
|
|
Returns: a string containing HTML for a multiple select box for |
|
selecting sections of a course. |
|
|
|
The form element name is 'Section'. @$sections is sorted prior to output. |
|
|
|
=cut |
|
|
|
######################################################## |
|
######################################################## |
sub MultipleSectionSelect { |
sub MultipleSectionSelect { |
my ($sections,$selectedSections)=@_; |
my ($sections,$selectedSections)=@_; |
|
|
my $Str = ''; |
my $Str = ''; |
$Str .= '<select name="Section" multiple="" size="4">'."\n"; |
$Str .= '<select name="Section" multiple="true" size="4">'."\n"; |
|
|
foreach (@$sections) { |
foreach (sort @$sections) { |
$Str .= '<option'; |
$Str .= '<option'; |
foreach my $selected (@$selectedSections) { |
foreach my $selected (@$selectedSections) { |
if($_ eq $selected) { |
if($_ eq $selected) { |
Line 136 sub MultipleSectionSelect {
|
Line 483 sub MultipleSectionSelect {
|
$Str .= '>'.$_.'</option>'."\n"; |
$Str .= '>'.$_.'</option>'."\n"; |
} |
} |
$Str .= '</select>'."\n"; |
$Str .= '</select>'."\n"; |
|
|
return $Str; |
return $Str; |
} |
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
|
=pod |
|
|
|
=item &Title() |
|
|
|
Inputs: $pageName a string containing the name of the page to be sent |
|
to &Apache::loncommon::bodytag. |
|
|
|
Returns: string containing being <html> and complete <head> and <title> |
|
as well as a <script> to focus the current window and change its width |
|
and height to 500. Why? I do not know. If you find out, please update |
|
this documentation. |
|
|
|
=cut |
|
|
|
######################################################## |
|
######################################################## |
sub Title { |
sub Title { |
my ($pageName)=@_; |
my ($pageName)=@_; |
|
|
my $Str = ''; |
my $Str = ''; |
|
|
$Str .= '<html><head><title>'.$pageName.'</title></head>'."\n"; |
$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>window.focus(); window.width=500;window.height=500;'; |
$Str .= '</script>'."\n"; |
$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; |
return $Str; |
} |
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
=pod |
=pod |
|
|
=item &CreateTableHeadings() |
=item &CreateHeadings() |
|
|
This function generates the column headings for the chart. |
This function generates the column headings for the chart. |
|
|
Line 186 $Str: A formatted string of the table co
|
Line 549 $Str: A formatted string of the table co
|
|
|
=cut |
=cut |
|
|
|
######################################################## |
|
######################################################## |
sub CreateHeadings { |
sub CreateHeadings { |
my ($data,$keyID,$headings,$displayString,$format)=@_; |
my ($data,$keyID,$headings,$displayString,$format)=@_; |
my $Str=''; |
my $Str=''; |
Line 212 sub CreateHeadings {
|
Line 577 sub CreateHeadings {
|
return $Str; |
return $Str; |
} |
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
=pod |
=pod |
|
|
=item &FormatStudentInformation() |
=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. |
username, domain, section, full name, and PID. |
|
|
=over 4 |
=over 4 |
Line 241 $Str: Formatted string.
|
Line 609 $Str: Formatted string.
|
|
|
=cut |
=cut |
|
|
|
######################################################## |
|
######################################################## |
sub FormatStudentInformation { |
sub FormatStudentInformation { |
my ($data,$name,$keyID,$displayString,$format)=@_; |
my ($data,$name,$keyID,$displayString,$format)=@_; |
my $Str=''; |
my $Str=''; |
Line 265 sub FormatStudentInformation {
|
Line 635 sub FormatStudentInformation {
|
return $Str; |
return $Str; |
} |
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
|
# Create progress |
|
sub Create_PrgWin { |
|
my ($r, $title, $heading, $number_to_do)=@_; |
|
$r->print('<script>'. |
|
"popwin=open(\'\',\'popwin\',\'width=400,height=100\');". |
|
"popwin.document.writeln(\'<html><head><title>$title</title></head>". |
|
"<body bgcolor=\"#88DDFF\">". |
|
"<h4>$heading</h4>". |
|
"<form name=popremain>". |
|
"<input type=text size=55 name=remaining value=Starting></form>". |
|
"</body></html>\');". |
|
"popwin.document.close();". |
|
"</script>"); |
|
|
|
my %prog_state; |
|
$prog_state{'now'}=0; |
|
$prog_state{'since'}=time; |
|
$prog_state{'started'}=time; |
|
$prog_state{'total'}=$number_to_do; |
|
|
|
$r->rflush(); |
|
return %prog_state; |
|
} |
|
|
|
# update progress |
|
sub Update_PrgWin { |
|
my ($r,$prog_state,$displayString)=@_; |
|
$r->print('<script>popwin.document.popremain.remaining.value="'. |
|
$displayString.'";</script>'); |
|
$$prog_state{'started'}=time; |
|
$r->rflush(); |
|
} |
|
|
|
# increment progress state |
|
sub Increment_PrgWin { |
|
my ($r,$prog_state,$extraInfo)=@_; |
|
$$prog_state{'now'}++; |
|
$r->print('<script>popwin.document.popremain.remaining.value="'. |
|
$$prog_state{'now'}.'/'.$$prog_state{'total'}. |
|
': '.int((time-$$prog_state{'since'})/ |
|
$$prog_state{'now'}*($$prog_state{'total'}-$$prog_state{'now'})). |
|
' secs remaining ('.(time-$$prog_state{'started'}). |
|
' seconds for '.$extraInfo.')";'.'</script>'); |
|
$$prog_state{'started'}=time; |
|
$r->rflush(); |
|
} |
|
|
|
# close Progress Line |
|
sub Close_PrgWin { |
|
my ($r,$prog_state)=@_; |
|
$r->print('<script>popwin.close()</script>'."\n"); |
|
undef(%$prog_state); |
|
$r->rflush(); |
|
} |
|
|
1; |
1; |
__END__ |
__END__ |