--- loncom/interface/lonhtmlcommon.pm 2002/07/24 14:52:32 1.3
+++ loncom/interface/lonhtmlcommon.pm 2003/12/29 17:11:53 1.35
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common html routines
#
-# $Id: lonhtmlcommon.pm,v 1.3 2002/07/24 14:52:32 stredwic Exp $
+# $Id: lonhtmlcommon.pm,v 1.35 2003/12/29 17:11:53 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,76 +25,398 @@
#
# 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 Apache::lonlocal;
use strict;
-sub MapOptions {
- my ($data, $page)=@_;
- my $Str = '';
- $Str .= ''."\n";
- my $selected = 0;
- foreach my $sequence (split(':',$data->{'orderedSequences'})) {
- $Str .= '{$page.'Map'} eq $data->{$sequence.':title'}) {
- $Str .= ' selected';
- $selected = 1;
- }
- $Str .= '>'.$data->{$sequence.':title'}.' '."\n";
- }
- $Str .= ' ';
return $Str;
}
-sub StudentOptions {
- my ($cache, $students, $selectedName, $page)=@_;
+##############################################
+##############################################
- my $Str = '';
- $Str = ''."\n";
+=pod
+
+=item checkbox
+
+=cut
+
+##############################################
+##############################################
+sub checkbox {
+ my ($name) = @_;
+ my $Str = ' ';
+ return $Str;
+}
- my $selected=0;
- foreach (@$students) {
- $Str .= '\n";
+ $result .= <
+ 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;
}
- $Str .= '>';
- $Str .= $cache->{$_.':fullname'};
- $Str .= ' '."\n";
}
- $Str .= '
+ENDJS
+ $result .= " \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 .= " \n";
+ }
+ $result .= " \n";
+ $result .= " \n";
+ $result .= " \n";
+ $result .= " ";
+ $result .= " \n";
+ for (my $h = 0;$h<24;$h++) {
+ $result .= " \n";
+ }
+ $result .= " \n";
+ $result .= " m\n";
+ $result .= " s\n";
+ $result .= "".
+ &mt('Select Date')." \n\n";
+ return $result;
+}
+
+##############################################
+##############################################
+
+=pod
+
+=item &get_date_from_form
+
+get_date_from_form retrieves the date specified in an &date_setter form.
+
+Inputs:
+
+=over 4
- $Str .= ' = 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 < 24)) {
+ $hour = $tmphour;
+ }
+ }
+ if (defined($ENV{'form.'.$dname.'_day'})) {
+ my $tmpday = $ENV{'form.'.$dname.'_day'};
+ if (($tmpday =~ /^\d+$/) && ($tmpday > 0) && ($tmpday < 32)) {
+ $day = $tmpday;
+ }
}
- $Str .= '>All Students '."\n";
+ 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 (($year<70) || ($year>137)) { return undef; }
+ if (defined($sec) && defined($min) && defined($hour) &&
+ defined($day) && defined($month) && defined($year) &&
+ eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {
+ return &timelocal($sec,$min,$hour,$day,$month,$year);
+ } else {
+ return undef;
+ }
+}
- $Str .= ' '."\n";
+##############################################
+##############################################
+=pod
+
+=item &pjump_javascript_definition()
+
+Returns javascript defining the 'pjump' function, which opens up a
+parameter setting wizard.
+
+=cut
+
+##############################################
+##############################################
+sub pjump_javascript_definition {
+ my $Str = <Active'."\n";
- $Str .= 'Expired '."\n";
- $Str .= 'Any '."\n";
+ $Str .= ''.
+ 'Currently Enrolled '."\n";
+ $Str .= ''.
+ 'Previously Enrolled '."\n";
+ $Str .= ''.
+ 'Any Enrollment Status '."\n";
$Str .= ' '."\n";
}
-sub Title {
- my ($pageName)=@_;
- my $Str = '';
+########################################################
+########################################################
- $Str .= '
'.$pageName.' '."\n";
- $Str .= ''."\n";
- $Str .= ''."\n";
- $Str .= '';
- $Str .= ' Course: ';
- $Str .= $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
- $Str .= ' '."\n";
- $Str .= ' ';
- $Str .= '
'."\n";
-# $Str .= 'Current Time: '.localtime(time).' '."\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 {
+ my ($sections,$selectedSections)=@_;
+
+ my $Str = '';
+ $Str .= ''."\n";
+ foreach (sort @$sections) {
+ $Str .= ''."\n";
+ }
+ $Str .= ' '."\n";
+
return $Str;
}
-sub CreateStatisticsMainMenu {
- my ($status, $reports)=@_;
+########################################################
+########################################################
- my $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 and complete and
+as well as a '."\n";
return $Str;
}
+########################################################
+########################################################
+
=pod
-=item &CreateTableHeadings()
+=item &CreateHeadings()
This function generates the column headings for the chart.
=over 4
-Inputs: $CacheData, $studentInformation, $headings, $spacePadding
+Inputs: $CacheData, $keyID, $headings, $spacePadding
$CacheData: pointer to a hash tied to the cached data database
-$studentInformation: a pointer to an array containing the names of the data
+$keyID: a pointer to an array containing the names of the data
held in a column and is used as part of a key into $CacheData
$headings: The names of the headings for the student information
@@ -201,41 +556,53 @@ $Str: A formatted string of the table co
=cut
-sub CreateStudentInformationHeadings {
- my ($data,$studentInformation,$headings,$displayString)=@_;
+########################################################
+########################################################
+sub CreateHeadings {
+ my ($data,$keyID,$headings,$displayString,$format)=@_;
my $Str='';
+ my $formatting = '';
for(my $index=0; $index<(scalar @$headings); $index++) {
-# if(!&ShouldShowColumn($data, 'ChartHeading'.$index)) {
-# next;
-# }
- my $data=$headings->[$index];
- my $linkdata=$studentInformation->[$index];
+ my $currentHeading=$headings->[$index];
+ if($format eq 'preformatted') {
+ my @dataLength=split(//,$currentHeading);
+ my $length=scalar @dataLength;
+ $formatting = (' 'x
+ ($data->{$keyID->[$index].':columnWidth'}-$length));
+ }
+ my $linkdata=$keyID->[$index];
+
my $tempString = $displayString;
$tempString =~ s/LINKDATA/$linkdata/;
- $tempString =~ s/DISPLAYDATA/$data/;
+ $tempString =~ s/DISPLAYDATA/$currentHeading/;
+ $tempString =~ s/FORMATTING/$formatting/;
+
$Str .= $tempString;
}
return $Str;
}
+########################################################
+########################################################
+
=pod
=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
-Input: $cache, $name, $studentInformation, $spacePadding
+Input: $cache, $name, $keyID, $spacePadding
$cache: This is a pointer to a hash that is tied to the cached data
$name: The name and domain of the current student in name:domain format
-$studentInformation: A pointer to an array holding the names used to
+$keyID: A pointer to an array holding the names used to
remove data from the hash. They represent the name of the data to be removed.
@@ -249,27 +616,245 @@ $Str: Formatted string.
=cut
+########################################################
+########################################################
sub FormatStudentInformation {
- my ($cache,$name,$studentInformation,$spacePadding)=@_;
+ my ($data,$name,$keyID,$displayString,$format)=@_;
my $Str='';
- my $data;
+ my $currentColumn;
+
+ for(my $index=0; $index<(scalar @$keyID); $index++) {
+ $currentColumn=$data->{$name.':'.$keyID->[$index]};
+
+ if($format eq 'preformatted') {
+ my @dataLength=split(//,$currentColumn);
+ my $length=scalar @dataLength;
+ $currentColumn.= (' 'x
+ ($data->{$keyID->[$index].':columnWidth'}-$length));
+ }
+
+ my $tempString = $displayString;
+ $tempString =~ s/DISPLAYDATA/$currentColumn/;
- for(my $index=0; $index<(scalar @$studentInformation); $index++) {
- if(!&ShouldShowColumn($cache, 'ChartHeading'.$index)) {
- next;
- }
- $data=$cache->{$name.':'.$studentInformation->[$index]};
- $Str .= $data;
-
- my @dataLength=split(//,$data);
- my $length=scalar @dataLength;
- $Str .= (' 'x($cache->{$studentInformation->[$index].'Length'}-
- $length));
- $Str .= $spacePadding;
+ $Str .= $tempString;
}
return $Str;
}
+########################################################
+########################################################
+
+=pod
+
+=item Progess Window Handling Routines
+
+These routines handle the creation, update, increment, and closure of
+progress windows. The progress window reports to the user the number
+of items completed and an estimate of the time required to complete the rest.
+
+=over 4
+
+
+=item &Create_PrgWin
+
+Writes javascript to the client to open a progress window and returns a
+data structure used for bookkeeping.
+
+Inputs
+
+=over 4
+
+=item $r Apache request
+
+=item $title The title of the progress window
+
+=item $heading A description (usually 1 line) of the process being initiated.
+
+=item $number_to_do The total number of items being processed.
+
+=back
+
+Returns a hash containing the progress state data structure.
+
+
+=item &Update_PrgWin
+
+Updates the text in the progress indicator. Does not increment the count.
+See &Increment_PrgWin.
+
+Inputs:
+
+=over 4
+
+=item $r Apache request
+
+=item $prog_state Pointer to the data structure returned by &Create_PrgWin
+
+=item $displaystring The string to write to the status indicator
+
+=back
+
+Returns: none
+
+
+=item Increment_PrgWin
+
+Increment the count of items completed for the progress window by 1.
+
+Inputs:
+
+=over 4
+
+=item $r Apache request
+
+=item $prog_state Pointer to the data structure returned by Create_PrgWin
+
+=item $extraInfo A description of the items being iterated over. Typically
+'student'.
+
+=back
+
+Returns: none
+
+
+=item Close_PrgWin
+
+Closes the progress window.
+
+Inputs:
+
+=over 4
+
+=item $r Apache request
+
+=item $prog_state Pointer to the data structure returned by Create_PrgWin
+
+=back
+
+Returns: none
+
+=back
+
+=cut
+
+########################################################
+########################################################
+
+# Create progress
+sub Create_PrgWin {
+ my ($r, $title, $heading, $number_to_do)=@_;
+ $r->print('");
+
+ my %prog_state;
+ $prog_state{'done'}=0;
+ $prog_state{'firststart'}=&Time::HiRes::time();
+ $prog_state{'laststart'}=&Time::HiRes::time();
+ $prog_state{'max'}=$number_to_do;
+
+ $r->rflush();
+ return %prog_state;
+}
+
+# update progress
+sub Update_PrgWin {
+ my ($r,$prog_state,$displayString)=@_;
+ $r->print('');
+ $$prog_state{'laststart'}=&Time::HiRes::time();
+ $r->rflush();
+}
+
+# increment progress state
+sub Increment_PrgWin {
+ my ($r,$prog_state,$extraInfo)=@_;
+ $$prog_state{'done'}++;
+ my $time_est= (&Time::HiRes::time() - $$prog_state{'firststart'})/
+ $$prog_state{'done'} *
+ ($$prog_state{'max'}-$$prog_state{'done'});
+ $time_est = int($time_est);
+ if (int ($time_est/60) > 0) {
+ my $min = int($time_est/60);
+ my $sec = $time_est % 60;
+ $time_est = $min.' '.&mt('minutes');
+ if ($min < 10) {
+ if ($sec > 1) {
+ $time_est.= ', '.$sec.' '.&mt('seconds');
+ } elsif ($sec > 0) {
+ $time_est.= ', '.$sec.' '.&mt('second');
+ }
+ }
+ } else {
+ $time_est .= ' '.&mt('seconds');
+ }
+ my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};
+ if ($lasttime > 9) {
+ $lasttime = int($lasttime);
+ } elsif ($lasttime < 0.01) {
+ $lasttime = 0;
+ } else {
+ $lasttime = sprintf("%3.2f",$lasttime);
+ }
+ if ($lasttime == 1) {
+ $lasttime = '('.$lasttime.' '.&mt('second for').' '.$extraInfo.')';
+ } else {
+ $lasttime = '('.$lasttime.' '.&mt('seconds for').' '.$extraInfo.')';
+ }
+ #
+ my $user_browser = $ENV{'browser.type'} if (exists($ENV{'browser.type'}));
+ my $user_os = $ENV{'browser.os'} if (exists($ENV{'browser.os'}));
+ if (! defined($user_browser) || ! defined($user_os)) {
+ (undef,$user_browser,undef,undef,undef,$user_os) =
+ &Apache::loncommon::decode_user_agent();
+ }
+ if ($user_browser eq 'explorer' && $user_os =~ 'mac') {
+ $lasttime = '';
+ }
+ $r->print('');
+ $$prog_state{'laststart'}=&Time::HiRes::time();
+ $r->rflush();
+}
+
+# close Progress Line
+sub Close_PrgWin {
+ my ($r,$prog_state)=@_;
+ $r->print(''."\n");
+ undef(%$prog_state);
+ $r->rflush();
+}
+
+
+# ------------------------------------------------------- Puts directory header
+
+sub crumbs {
+ my ($uri,$target,$prefix)=@_;
+ my $output=''.$prefix.'/';
+ if ($ENV{'user.adv'}) {
+ my $path=$prefix.'/';
+ foreach (split('/',$uri)) {
+ unless ($_) { next; }
+ $path.=$_.'/';
+ $output.=''.$_.' /';
+ }
+ } else {
+ $output.=$uri;
+ }
+ return $output.' ';
+}
+
+
1;
+
__END__