--- loncom/interface/lonhtmlcommon.pm 2003/02/20 14:34:59 1.13 +++ loncom/interface/lonhtmlcommon.pm 2004/02/12 22:23:30 1.46 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.13 2003/02/20 14:34:59 matthew Exp $ +# $Id: lonhtmlcommon.pm,v 1.46 2004/02/12 22:23:30 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -56,8 +56,119 @@ html. package Apache::lonhtmlcommon; use Time::Local; +use Apache::lonlocal; use strict; + +############################################## +############################################## + +=pod + +=item authorbombs + +=cut + +############################################## +############################################## + +sub authorbombs { + my $url=shift; + $url=&Apache::lonnet::declutter($url); + my ($udom,$uname)=($url=~/^(\w+)\/(\w+)\//); + my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom); + foreach (keys %bombs) { + if ($_=~/^$udom\/$uname\//) { + return ''. + &Apache::loncommon::help_open_topic('About_Bombs'); + } + } + return ''; +} + +############################################## +############################################## + +sub recent_filename { + my $area=shift; + return 'nohist_recent_'.&Apache::lonnet::escape($area); +} + +sub store_recent { + my ($area,$name,$value)=@_; + my $file=&recent_filename($area); + my %recent=&Apache::lonnet::dump($file); + if (scalar(keys(%recent))>10) { +# remove oldest value + my $oldest=time; + my $delkey=''; + foreach (keys %recent) { + my $thistime=(split(/\&/,$recent{$_}))[0]; + if ($thistime<$oldest) { + $oldest=$thistime; + $delkey=$_; + } + } + &Apache::lonnet::del($file,[$delkey]); + } +# store new value + &Apache::lonnet::put($file,{ $name => + time.'&'.&Apache::lonnet::escape($value) }); +} + +sub select_recent { + my ($area,$fieldname,$event)=@_; + my %recent=&Apache::lonnet::dump(&recent_filename($area)); + my $return="\n\n"; + return $return; +} + + +=pod + +=item textbox + +=cut + +############################################## +############################################## +sub textbox { + my ($name,$value,$size,$special) = @_; + $size = 40 if (! defined($size)); + my $Str = ''; + return $Str; +} + +############################################## +############################################## + +=pod + +=item checkbox + +=cut + +############################################## +############################################## +sub checkbox { + my ($name,$value) = @_; + my $Str = ''; + return $Str; +} + ############################################## ############################################## @@ -65,6 +176,9 @@ use strict; =item &date_setter +&date_setter returns html and javascript for a compact date-setting form. +To retrieve values from it, use &get_date_from_form(). + Inputs =over 4 @@ -82,19 +196,37 @@ The current setting for this time parame 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. +=item $special + +Additional html/javascript to be associated with each element in +the date_setter. See lonparmset for example usage. + +=back + +Bugs + +The method used to restrict user input will fail in the year 2400. + =cut ############################################## ############################################## sub date_setter { - my ($formname,$dname,$currentvalue) = @_; + my ($formname,$dname,$currentvalue,$special,$includeempty) = @_; if (! defined($currentvalue) || $currentvalue eq 'now') { - $currentvalue = time; + unless ($includeempty) { + $currentvalue = time; + } else { + $currentvalue = 0; + } } # other potentially useful values: wkday,yrday,is_daylight_savings - my ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) = - localtime($currentvalue); - $year += 1900; + my ($sec,$min,$hour,$mday,$month,$year)=('','','','','',''); + if ($currentvalue) { + ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) = + localtime($currentvalue); + $year += 1900; + } my $result = "\n\n"; $result .= < @@ -128,57 +260,76 @@ sub date_setter { document.$formname.$dname\_day.value = 30; } } + + function $dname\_opencalendar() { + var calwin=window.open( +"/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+ +document.$formname.$dname\_month.value+"&year="+ +document.$formname.$dname\_year.value, + "LONCAPAcal", + "height=350,width=350,scrollbars=yes,resizable=yes,menubar=no"); + + } ENDJS - $result .= " \n"; $result .= " \n"; $result .= " \n"; $result .= "  "; - $result .= " \n"; + if ($includeempty) { $result.=""; } for (my $h = 0;$h<24;$h++) { $result .= " '."\n"; - } - $Str .= '{'orderedSequences'})) { - if($data->{$sequence.':title'} eq $map || $map eq 'All Maps') { - foreach my $problem (split(':', $data->{$sequence.':problems'})) { - $Str .= '{$page.'ProblemSelect'} eq - $data->{$problem.':title'}) { - $Str .= ' selected'; - $selected = 1; - } - $Str .= '>'.$data->{$problem.':title'}.''."\n"; - } - } +############################################## +############################################## +sub javascript_nothing { + # mozilla and other browsers work with "''", but IE on mac does not. + my $nothing = "''"; + my $user_browser; + my $user_os; + $user_browser = $ENV{'browser.type'} if (exists($ENV{'browser.type'})); + $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(); } - $Str .= '{$page.'PartSelect'} eq $part) { - $Str .= ' selected'; - $selected = 1; - } - $Str .= '>'.$part.''."\n"; - } - $Str .= '{$_.':fullname'}; - $Str .= ''."\n"; - } +$formname: The name of the form. If defined the onchange attribute of +the selection box is set to document.$formname.submit(). - $Str .= 'Active'."\n"; - $Str .= 'Expired'."\n"; - $Str .= 'Any'."\n"; + $Str .= ''."\n"; + $Str .= ''."\n"; + $Str .= ''."\n"; $Str .= ''."\n"; } - ######################################################## ######################################################## =pod -=item &MultipleSectionSelect() +=item Progess Window Handling Routines -Inputs: +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 $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. +=item &Create_PrgWin -The form element name is 'Section'. @$sections is sorted prior to output. +Writes javascript to the client to open a progress window and returns a +data structure used for bookkeeping. -=cut - -######################################################## -######################################################## -sub MultipleSectionSelect { - my ($sections,$selectedSections)=@_; - - my $Str = ''; - $Str .= ''."\n"; - - return $Str; -} - -######################################################## -######################################################## - -=pod +Inputs -=item &Title() +=over 4 -Inputs: $pageName a string containing the name of the page to be sent -to &Apache::loncommon::bodytag. +=item $r Apache request -Returns: string containing being and complete and -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. +=item $title The title of the progress window -=cut - -######################################################## -######################################################## -sub Title { - my ($pageName)=@_; +=item $heading A description (usually 1 line) of the process being initiated. - my $Str = ''; +=item $number_to_do The total number of items being processed. - $Str .= '<html><head><title>'.$pageName.''."\n"; - $Str .= &Apache::loncommon::bodytag($pageName)."\n"; - $Str .= ''."\n"; +=back - return $Str; -} +Returns a hash containing the progress state data structure. -######################################################## -######################################################## -=pod +=item &Update_PrgWin -=item &CreateHeadings() +Updates the text in the progress indicator. Does not increment the count. +See &Increment_PrgWin. -This function generates the column headings for the chart. +Inputs: =over 4 -Inputs: $CacheData, $keyID, $headings, $spacePadding - -$CacheData: pointer to a hash tied to the cached data database - -$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 +=item $r Apache request -$spacePadding: The spaces to go between columns +=item $prog_state Pointer to the data structure returned by &Create_PrgWin -Output: $Str - -$Str: A formatted string of the table column headings. +=item $displaystring The string to write to the status indicator =back -=cut +Returns: none -######################################################## -######################################################## -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]; - my $tempString = $displayString; - $tempString =~ s/LINKDATA/$linkdata/; - $tempString =~ s/DISPLAYDATA/$currentHeading/; - $tempString =~ s/FORMATTING/$formatting/; +=item Increment_PrgWin - $Str .= $tempString; - } +Increment the count of items completed for the progress window by 1. - return $Str; -} +Inputs: -######################################################## -######################################################## +=over 4 -=pod +=item $r Apache request -=item &FormatStudentInformation() +=item $prog_state Pointer to the data structure returned by Create_PrgWin -This function produces a formatted string of the student\'s information: -username, domain, section, full name, and PID. +=item $extraInfo A description of the items being iterated over. Typically +'student'. -=over 4 +=back -Input: $cache, $name, $keyID, $spacePadding +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 -$Str: Formatted string. +=item $prog_state Pointer to the data structure returned by Create_PrgWin =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)); - } - - my $tempString = $displayString; - $tempString =~ s/DISPLAYDATA/$currentColumn/; +Returns: none - $Str .= $tempString; - } +=back - return $Str; -} +=cut ######################################################## ######################################################## # Create progress sub Create_PrgWin { - my ($r, $title, $heading)=@_; + 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 $r->print('"); + "popwin.document.close();}". + "\nwindow.setTimeout(openpopwin,0)"); + + 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 ($displayString,$r)=@_; + 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)=@_; + my ($r,$prog_state)=@_; $r->print(''."\n"); + undef(%$prog_state); $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__