--- loncom/interface/lonhtmlcommon.pm 2002/07/26 16:22:09 1.5 +++ loncom/interface/lonhtmlcommon.pm 2004/02/13 21:12:12 1.47 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.5 2002/07/26 16:22:09 stredwic Exp $ +# $Id: lonhtmlcommon.pm,v 1.47 2004/02/13 21:12:12 sakharuk Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,80 +25,479 @@ # # 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 Time::HiRes; +use Apache::lonlocal; use strict; -sub MapOptions { - my ($data, $page)=@_; - my $Str = ''; - $Str .= '\n"; + foreach (sort keys %recent) { + unless ($_=~/^error\:/) { + $return.="\n'; + } + } + $return.="\n\n"; + return $return; +} - $Str .= ''."\n"; +=pod + +=item textbox + +=cut + +############################################## +############################################## +sub textbox { + my ($name,$value,$size,$special) = @_; + $size = 40 if (! defined($size)); + my $Str = ''; return $Str; } -sub StudentOptions { - my ($cache, $students, $selectedName, $page, $formName)=@_; +############################################## +############################################## - my $Str = ''; - $Str .= '\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'); + if ($includeempty) { $result.=""; } + for(my $m = 1;$m <=$#Months;$m++) { + $result .= " '."\n"; + 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 (($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 .= ''."\n"; + $Str .= ''."\n"; + $Str .= ''."\n"; $Str .= ''."\n"; } -sub MultipleSectionSelect { - my ($sections,$selectedSections)=@_; +######################################################## +######################################################## - my $Str = ''; - $Str .= ''."\n"; +=item Progess Window Handling Routines - return $Str; -} +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. -sub Title { - my ($pageName)=@_; +=over 4 - 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"; +=item &Create_PrgWin - return $Str; -} +Writes javascript to the client to open a progress window and returns a +data structure used for bookkeeping. -=pod +Inputs -=item &CreateTableHeadings() +=over 4 -This function generates the column headings for the chart. +=item $r Apache request -=over 4 +=item $title The title of the progress window -Inputs: $CacheData, $keyID, $headings, $spacePadding +=item $heading A description (usually 1 line) of the process being initiated. -$CacheData: pointer to a hash tied to the cached data database +=item $number_to_do The total number of items being processed. -$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 +=back -$headings: The names of the headings for the student information +Returns a hash containing the progress state data structure. -$spacePadding: The spaces to go between columns -Output: $Str +=item &Update_PrgWin -$Str: A formatted string of the table column headings. +Updates the text in the progress indicator. Does not increment the count. +See &Increment_PrgWin. -=back +Inputs: -=cut +=over 4 -sub CreateHeadings { - my ($data,$keyID,$headings,$displayString,$format)=@_; - my $Str=''; - my $formatting = ''; - - for(my $index=0; $index<(scalar @$headings); $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]; +=item $r Apache request - my $tempString = $displayString; - $tempString =~ s/LINKDATA/$linkdata/; - $tempString =~ s/DISPLAYDATA/$currentHeading/; - $tempString =~ s/FORMATTING/$formatting/; +=item $prog_state Pointer to the data structure returned by &Create_PrgWin - $Str .= $tempString; - } +=item $displaystring The string to write to the status indicator - return $Str; -} +=back + +Returns: none -=pod -=item &FormatStudentInformation() +=item Increment_PrgWin -This function produces a formatted string of the student's information: -username, domain, section, full name, and PID. +Increment the count of items completed for the progress window by 1. + +Inputs: =over 4 -Input: $cache, $name, $keyID, $spacePadding +=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 -$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 +=item Close_PrgWin -$keyID: A pointer to an array holding the names used to +Closes the progress window. -remove data from the hash. They represent the name of the data to be removed. +Inputs: -$spacePadding: Extra spaces that represent the space between columns +=over 4 -Output: $Str +=item $r Apache request + +=item $prog_state Pointer to the data structure returned by Create_PrgWin + +=back -$Str: Formatted string. +Returns: none =back =cut -sub FormatStudentInformation { - my ($data,$name,$keyID,$displayString,$format)=@_; - my $Str=''; - 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)); - } +######################################################## +######################################################## + +# Create progress +sub Create_PrgWin { + my ($r, $title, $heading, $number_to_do)=@_; + #the whole function called through timeout is due to issues + #in mozilla Read BUG #2665 if you want to know the whole story + if ($r ne '') { + $r->print('"); + } else { + print('"); + } - my $tempString = $displayString; - $tempString =~ s/DISPLAYDATA/$currentColumn/; + 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; - $Str .= $tempString; + if ($r ne '') {$r->rflush();} + return %prog_state; +} + +# update progress +sub Update_PrgWin { + my ($r,$prog_state,$displayString)=@_; + if ($r ne '') { + $r->print(''); + } else { + print(''); } + $$prog_state{'laststart'}=&Time::HiRes::time(); + if ($r ne '') {$r->rflush();} +} - return $Str; +# 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 = ''; + } + if ($r ne '') { + $r->print(''); + } else { + print(''); + } + $$prog_state{'laststart'}=&Time::HiRes::time(); + if ($r ne '') {$r->rflush();} +} + +# close Progress Line +sub Close_PrgWin { + my ($r,$prog_state)=@_; + if ($r ne '') { + $r->print(''."\n"); + } else { + print(''."\n"); + } + undef(%$prog_state); + if ($r ne '') {$r->rflush();} +} + + +# ------------------------------------------------------- Puts directory header + +sub crumbs { + my ($uri,$target,$prefix,$form)=@_; + my $output='
'.$prefix.'/'; + if ($ENV{'user.adv'}) { + my $path=$prefix.'/'; + foreach (split('/',$uri)) { + unless ($_) { next; } + $path.=$_; + unless ($path eq $uri) { $path.='/'; } + my $linkpath=$path; + if ($form) { + $linkpath="javascript:$form.action='$path';$form.submit();"; + } + $output.=''.$_.'/'; + } + } else { + $output.=$uri; + } + unless ($uri=~/\/$/) { $output=~s/\/$//; } + return $output.'
'; } + 1; + __END__