Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.28 and 1.66

version 1.28, 2003/07/25 19:56:37 version 1.66, 2004/04/19 16:43:03
Line 56  html. Line 56  html.
 package Apache::lonhtmlcommon;  package Apache::lonhtmlcommon;
   
 use Time::Local;  use Time::Local;
   use Time::HiRes;
   use Apache::lonlocal;
 use strict;  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 '<a href="/adm/bombs/'.$url.
    '"><img src="/adm/lonMisc/bomb.gif" border="0" /></a>'.
    &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<select name='$fieldname'".
    ($event?" onChange='$event'":'').
    ">\n<option value=''>--- ".&mt('Recent')." ---</option>";
       foreach (sort keys %recent) {
    unless ($_=~/^error\:/) {
       $return.="\n<option value='$_'>".
    &Apache::lonnet::unescape((split(/\&/,$recent{$_}))[1]).
    '</option>';
    }
       }
       $return.="\n</select>\n";
       return $return;
   }
   
   
 =pod  =pod
   
 =item textbox  =item textbox
Line 90  sub textbox { Line 163  sub textbox {
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub checkbox {  sub checkbox {
     my ($name) = @_;      my ($name,$value) = @_;
     my $Str = '<input type="checkbox" name="'.$name.'" />';      my $Str = '<input type="checkbox" name="'.$name.'"'.
    ($value?' checked="1"':'').' />';
     return $Str;      return $Str;
 }  }
   
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 129  Also, to be explicit, a value of 'now' a Line 201  Also, to be explicit, a value of 'now' a
 Additional html/javascript to be associated with each element in  Additional html/javascript to be associated with each element in
 the date_setter.  See lonparmset for example usage.  the date_setter.  See lonparmset for example usage.
   
   =item $includeempty 
   
   =item $state
   
   Specifies the initial state of the form elements.  Either 'disabled' or empty.
   Defaults to empty, which indiciates the form elements are not disabled. 
   
 =back  =back
   
 Bugs  Bugs
Line 140  The method used to restrict user input w Line 219  The method used to restrict user input w
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub date_setter {  sub date_setter {
     my ($formname,$dname,$currentvalue,$special) = @_;      my ($formname,$dname,$currentvalue,$special,$includeempty,$state) = @_;
       if (! defined($state) || $state ne 'disabled') {
           $state = '';
       }
     if (! defined($currentvalue) || $currentvalue eq 'now') {      if (! defined($currentvalue) || $currentvalue eq 'now') {
         $currentvalue = time;   unless ($includeempty) {
       $currentvalue = time;
    } else {
       $currentvalue = 0;
    }
     }      }
     # other potentially useful values:     wkday,yrday,is_daylight_savings      # other potentially useful values:     wkday,yrday,is_daylight_savings
     my ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) =       my ($sec,$min,$hour,$mday,$month,$year)=('','',undef,'','','');
         localtime($currentvalue);      if ($currentvalue) {
     $year += 1900;   ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) = 
       localtime($currentvalue);
    $year += 1900;
       }
     my $result = "\n<!-- $dname date setting form -->\n";      my $result = "\n<!-- $dname date setting form -->\n";
     $result .= <<ENDJS;      $result .= <<ENDJS;
 <script language="Javascript">  <script language="Javascript">
Line 181  sub date_setter { Line 270  sub date_setter {
             document.$formname.$dname\_day.value = 30;              document.$formname.$dname\_day.value = 30;
         }          }
     }      }
   
       function $dname\_disable() {
           document.$formname.$dname\_month.disabled=true;
           document.$formname.$dname\_day.disabled=true;
           document.$formname.$dname\_year.disabled=true;
           document.$formname.$dname\_hour.disabled=true;
           document.$formname.$dname\_minute.disabled=true;
           document.$formname.$dname\_second.disabled=true;
       }
   
       function $dname\_enable() {
           document.$formname.$dname\_month.disabled=false;
           document.$formname.$dname\_day.disabled=false;
           document.$formname.$dname\_year.disabled=false;
           document.$formname.$dname\_hour.disabled=false;
           document.$formname.$dname\_minute.disabled=false;
           document.$formname.$dname\_second.disabled=false;        
       }
   
       function $dname\_opencalendar() {
           if (! document.$formname.$dname\_month.disabled) {
               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");
           }
   
       }
 </script>  </script>
 ENDJS  ENDJS
     $result .= "  <nobr><select name=\"$dname\_month\" ".$special.' '.      $result .= "  <nobr><select name=\"$dname\_month\" ".$special.' '.
           $state.' '.
         "onChange=\"javascript:$dname\_checkday()\" >\n";          "onChange=\"javascript:$dname\_checkday()\" >\n";
     my @Months = qw/January February  March     April   May      June       my @Months = qw/January February  March     April   May      June 
                     July    August    September October November December/;                      July    August    September October November December/;
     # Pad @Months with a bogus value to make indexing easier      # Pad @Months with a bogus value to make indexing easier
     unshift(@Months,'If you can read this an error occurred');      unshift(@Months,'If you can read this an error occurred');
       if ($includeempty) { $result.="<option value=''></option>"; }
     for(my $m = 1;$m <=$#Months;$m++) {      for(my $m = 1;$m <=$#Months;$m++) {
         $result .= "      <option value=\"$m\" ";          $result .= "      <option value=\"$m\" ";
         $result .= "selected " if ($m-1 == $month);          $result .= "selected " if ($m-1 eq $month);
         $result .= "> $Months[$m] </option>\n";          $result .= "> ".&mt($Months[$m])." </option>\n";
     }      }
     $result .= "  </select>\n";      $result .= "  </select>\n";
     $result .= "  <input type=\"text\" name=\"$dname\_day\" ".      $result .= "  <input type=\"text\" name=\"$dname\_day\" ".$state.' '.
             "value=\"$mday\" size=\"3\" ".$special.' '.              "value=\"$mday\" size=\"3\" ".$special.' '.
             "onChange=\"javascript:$dname\_checkday()\" />\n";              "onChange=\"javascript:$dname\_checkday()\" />\n";
     $result .= "  <input type=\"year\" name=\"$dname\_year\" ".      $result .= "  <input type=\"year\" name=\"$dname\_year\" ".$state.' '.
             "value=\"$year\" size=\"5\" ".$special.' '.              "value=\"$year\" size=\"5\" ".$special.' '.
             "onChange=\"javascript:$dname\_checkday()\" />\n";              "onChange=\"javascript:$dname\_checkday()\" />\n";
     $result .= "&nbsp;&nbsp;";      $result .= "&nbsp;&nbsp;";
     $result .= "  <select name=\"$dname\_hour\" ".$special." >\n";      $result .= "  <select name=\"$dname\_hour\" ".$special." ".$state.' '.">\n";
       if ($includeempty) { $result.="<option value=''></option>"; }
     for (my $h = 0;$h<24;$h++) {      for (my $h = 0;$h<24;$h++) {
         $result .= "      <option value=\"$h\" ";          $result .= "      <option value=\"$h\" ";
         $result .= "selected " if ($hour == $h);          $result .= "selected " if (defined($hour) && $hour == $h);
         $result .= "> ";          $result .= "> ";
    my $timest='';
         if ($h == 0) {          if ($h == 0) {
             $result .= "12 am";              $timest .= "12 am";
         } elsif($h == 12) {          } elsif($h == 12) {
             $result .= "12 noon";              $timest .= "12 noon";
         } elsif($h < 12) {          } elsif($h < 12) {
             $result .= "$h am";              $timest .= "$h am";
         } else {          } else {
             $result .= $h-12 ." pm";              $timest .= $h-12 ." pm";
         }          }
         $result .= " </option>\n";   $timest=&mt($timest);
           $result .= $timest." </option>\n";
     }       } 
     $result .= "  </select>\n";      $result .= "  </select>\n";
     $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".$special.' '.      $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".$special.' '.
           $state.' '.
         "value=\"$min\" size=\"3\" /> m\n";          "value=\"$min\" size=\"3\" /> m\n";
     $result .= "  <input type=\"text\" name=\"$dname\_second\" ".$special.' '.      $result .= "  <input type=\"text\" name=\"$dname\_second\" ".$special.' '.
           $state.' '.
         "value=\"$sec\" size=\"3\" /> s\n";          "value=\"$sec\" size=\"3\" /> s\n";
     $result .= "</nobr>\n<!-- end $dname date setting form -->\n";      $result .= "<a href=\"javascript:$dname\_opencalendar()\">".
       &mt('Select Date')."</a></nobr>\n<!-- end $dname date setting form -->\n";
     return $result;      return $result;
 }  }
   
Line 265  sub get_date_from_form { Line 392  sub get_date_from_form {
         if (($tmpsec =~ /^\d+$/) && ($tmpsec >= 0) && ($tmpsec < 60)) {          if (($tmpsec =~ /^\d+$/) && ($tmpsec >= 0) && ($tmpsec < 60)) {
             $sec = $tmpsec;              $sec = $tmpsec;
         }          }
    if (!defined($tmpsec) || $tmpsec eq '') { $sec = 0; }
     }      }
     if (defined($ENV{'form.'.$dname.'_minute'})) {      if (defined($ENV{'form.'.$dname.'_minute'})) {
         my $tmpmin = $ENV{'form.'.$dname.'_minute'};          my $tmpmin = $ENV{'form.'.$dname.'_minute'};
         if (($tmpmin =~ /^\d+$/) && ($tmpmin >= 0) && ($tmpmin < 60)) {          if (($tmpmin =~ /^\d+$/) && ($tmpmin >= 0) && ($tmpmin < 60)) {
             $min = $tmpmin;              $min = $tmpmin;
         }          }
    if (!defined($tmpmin) || $tmpmin eq '') { $min = 0; }
     }      }
     if (defined($ENV{'form.'.$dname.'_hour'})) {      if (defined($ENV{'form.'.$dname.'_hour'})) {
         my $tmphour = $ENV{'form.'.$dname.'_hour'};          my $tmphour = $ENV{'form.'.$dname.'_hour'};
         if (($tmphour =~ /^\d+$/) && ($tmphour > 0) && ($tmphour < 32)) {          if (($tmphour =~ /^\d+$/) && ($tmphour >= 0) && ($tmphour < 24)) {
             $hour = $tmphour;              $hour = $tmphour;
         }          }
     }      }
Line 297  sub get_date_from_form { Line 426  sub get_date_from_form {
         }          }
     }      }
     if (($year<70) || ($year>137)) { return undef; }      if (($year<70) || ($year>137)) { return undef; }
     if (eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {      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);          return &timelocal($sec,$min,$hour,$day,$month,$year);
     } else {      } else {
         return undef;          return undef;
Line 421  sub StatusOptions { Line 552  sub StatusOptions {
     $Str .= ' size="'.$size.'" ';      $Str .= ' size="'.$size.'" ';
     $Str .= '>'."\n";      $Str .= '>'."\n";
     $Str .= '<option value="Active" '.$OpSel1.'>'.      $Str .= '<option value="Active" '.$OpSel1.'>'.
         'Currently Enrolled</option>'."\n";          &mt('Currently Enrolled').'</option>'."\n";
     $Str .= '<option value="Expired" '.$OpSel2.'>'.      $Str .= '<option value="Expired" '.$OpSel2.'>'.
         'Previously Enrolled</option>'."\n";          &mt('Previously Enrolled').'</option>'."\n";
     $Str .= '<option value="Any" '.$OpSel3.'>'.      $Str .= '<option value="Any" '.$OpSel3.'>'.
         'Any Enrollment Status</option>'."\n";          &mt('Any Enrollment Status').'</option>'."\n";
     $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 {  
     my ($sections,$selectedSections)=@_;  
   
     my $Str = '';  
     $Str .= '<select name="Section" multiple="true" size="4">'."\n";  
   
     foreach (sort @$sections) {  
         $Str .= '<option';  
         foreach my $selected (@$selectedSections) {  
             if($_ eq $selected) {  
                 $Str .= ' selected=""';  
             }  
         }  
         $Str .= '>'.$_.'</option>'."\n";  
     }  
     $Str .= '</select>'."\n";  
       
     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 {  
     my ($pageName)=@_;  
   
     my $Str = '';  
   
     $Str .= '<html><head><title>'.$pageName.'</title></head>'."\n";  
     $Str .= &Apache::loncommon::bodytag($pageName)."\n";  
     $Str .= '<script>window.focus(); window.width=500;window.height=500;';  
     $Str .= '</script>'."\n";  
   
     return $Str;  
 }  
   
 ########################################################  
 ########################################################  
   
 =pod  
   
 =item &CreateHeadings()  
   
 This function generates the column headings for the chart.  
   
 =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  
   
 $spacePadding: The spaces to go between columns  
   
 Output: $Str  
   
 $Str: A formatted string of the table column headings.  
   
 =back  
   
 =cut  
   
 ########################################################  
 ########################################################  
 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/;  
   
         $Str .= $tempString;  
     }  
   
     return $Str;  
 }  
   
 ########################################################  
 ########################################################  
   
 =pod  
   
 =item &FormatStudentInformation()  
   
 This function produces a formatted string of the student\'s information:  
 username, domain, section, full name, and PID.  
   
 =over 4  
   
 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  
   
 $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.  
   
 $spacePadding: Extra spaces that represent the space between columns  
   
 Output: $Str  
   
 $Str: Formatted string.  
   
 =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/;  
   
         $Str .= $tempString;  
     }  
   
     return $Str;  
 }  
   
 ########################################################  ########################################################
 ########################################################  ########################################################
   
Line 657  Inputs Line 591  Inputs
   
 =item $number_to_do The total number of items being processed.  =item $number_to_do The total number of items being processed.
   
   =item $type Either 'popup' or 'inline' (popup is assumed if nothing is
          specified)
   
   =item $width Specify the width in charaters of the input field.
   
   =item $formname Only useful in the inline case, if a form already exists, this needs to be used and specfiy the name of the form, otherwise the Progress line will be created in a new form of it's own
   
   =item $inputname Only useful in the inline case, if a form and an input of type text exists, use this to specify the name of the input field 
   
 =back  =back
   
 Returns a hash containing the progress state data structure.  Returns a hash containing the progress state data structure.
Line 725  Returns: none Line 668  Returns: none
 ########################################################  ########################################################
 ########################################################  ########################################################
   
   my $uniq=0;
   sub get_uniq_name {
       $uniq++;
       return 'uniquename'.$uniq;
   }
   
 # Create progress  # Create progress
 sub Create_PrgWin {  sub Create_PrgWin {
     my ($r, $title, $heading, $number_to_do)=@_;      my ($r, $title, $heading, $number_to_do,$type,$width,$formname,
     $r->print('<script>'.   $inputname)=@_;
     "popwin=open(\'\',\'popwin\',\'width=400,height=100\');".      if (!defined($type)) { $type='popup'; }
     "popwin.document.writeln(\'<html><head><title>$title</title></head>".      if (!defined($width)) { $width=55; }
       my %prog_state;
       $prog_state{'type'}=$type;
       if ($type eq 'popup') {
    $prog_state{'window'}='popwin';
    #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($r,'<script>'.
           "var popwin;
            function openpopwin () {
            popwin=open(\'\',\'popwin\',\'width=400,height=100\');".
           "popwin.document.writeln(\'<html><head><title>$title</title></head>".
       "<body bgcolor=\"#88DDFF\">".        "<body bgcolor=\"#88DDFF\">".
               "<h4>$heading</h4>".                "<h4>$heading</h4>".
               "<form name=popremain>".                "<form name=popremain>".
               '<input type="text" size="55" name="remaining" value="Starting"></form>'.                '<input type="text" size="'.$width.'" name="remaining" value="'.
         &mt('Starting').'"></form>'.
               "</body></html>\');".                "</body></html>\');".
     "popwin.document.close();".          "popwin.document.close();}".
     "</script>");          "\nwindow.setTimeout(openpopwin,0)</script>");
    $prog_state{'formname'}='popremain';
    $prog_state{'inputname'}="remaining";
       } elsif ($type eq 'inline') {
    $prog_state{'window'}='window';
    if (!$formname) {
       $prog_state{'formname'}=&get_uniq_name();
       &r_print($r,'<form name="'.$prog_state{'formname'}.'">');
    } else {
       $prog_state{'formname'}=$formname;
    }
    if (!$inputname) {
       $prog_state{'inputname'}=&get_uniq_name();
       &r_print($r,$heading.' <input type="text" name="'.$prog_state{'inputname'}.
        '" size="'.$width.'" />');
    } else {
       $prog_state{'inputname'}=$inputname;
       
    }
    if (!$formname) { &r_print($r,'</form>'); }
    &Update_PrgWin($r,\%prog_state,&mt('Starting'));
       }
   
     my %prog_state;  
     $prog_state{'done'}=0;      $prog_state{'done'}=0;
     $prog_state{'firststart'}=&Time::HiRes::time();      $prog_state{'firststart'}=&Time::HiRes::time();
     $prog_state{'laststart'}=&Time::HiRes::time();      $prog_state{'laststart'}=&Time::HiRes::time();
     $prog_state{'max'}=$number_to_do;      $prog_state{'max'}=$number_to_do;
       
     $r->rflush();  
     return %prog_state;      return %prog_state;
 }  }
   
 # update progress  # update progress
 sub Update_PrgWin {  sub Update_PrgWin {
     my ($r,$prog_state,$displayString)=@_;      my ($r,$prog_state,$displayString)=@_;
     $r->print('<script>popwin.document.popremain.remaining.value="'.      &r_print($r,'<script>'.$$prog_state{'window'}.'.document.'.
               $displayString.'";</script>');       $$prog_state{'formname'}.'.'.
        $$prog_state{'inputname'}.'.value="'.
        $displayString.'";</script>');
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
     $r->rflush();  
 }  }
   
 # increment progress state  # increment progress state
Line 769  sub Increment_PrgWin { Line 750  sub Increment_PrgWin {
     if (int ($time_est/60) > 0) {      if (int ($time_est/60) > 0) {
  my $min = int($time_est/60);   my $min = int($time_est/60);
  my $sec = $time_est % 60;   my $sec = $time_est % 60;
  $time_est = $min.' minutes';   $time_est = $min.' '.&mt('minutes');
         if ($min < 10)  {          if ($min < 10)  {
             if ($sec > 1) {              if ($sec > 1) {
                 $time_est.= ', '.$sec.' seconds';                  $time_est.= ', '.$sec.' '.&mt('seconds');
             } elsif ($sec > 0) {              } elsif ($sec > 0) {
                 $time_est.= ', '.$sec.' second';                  $time_est.= ', '.$sec.' '.&mt('second');
             }              }
         }          }
     } else {      } else {
  $time_est .= ' seconds';   $time_est .= ' '.&mt('seconds');
     }      }
     my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};      my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};
     if ($lasttime > 9) {      if ($lasttime > 9) {
Line 789  sub Increment_PrgWin { Line 770  sub Increment_PrgWin {
         $lasttime = sprintf("%3.2f",$lasttime);          $lasttime = sprintf("%3.2f",$lasttime);
     }      }
     if ($lasttime == 1) {      if ($lasttime == 1) {
         $lasttime = '('.$lasttime.' second for '.$extraInfo.')';          $lasttime = '('.$lasttime.' '.&mt('second for').' '.$extraInfo.')';
     } else {      } else {
         $lasttime = '('.$lasttime.' seconds for '.$extraInfo.')';          $lasttime = '('.$lasttime.' '.&mt('seconds for').' '.$extraInfo.')';
     }      }
     #      #
     my $user_browser = $ENV{'browser.type'} if (exists($ENV{'browser.type'}));      my $user_browser = $ENV{'browser.type'} if (exists($ENV{'browser.type'}));
Line 803  sub Increment_PrgWin { Line 784  sub Increment_PrgWin {
     if ($user_browser eq 'explorer' && $user_os =~ 'mac') {      if ($user_browser eq 'explorer' && $user_os =~ 'mac') {
         $lasttime = '';          $lasttime = '';
     }      }
     $r->print('<script>popwin.document.popremain.remaining.value="'.      &r_print($r,'<script>'.$$prog_state{'window'}.'.document.'.
       $$prog_state{'done'}.'/'.$$prog_state{'max'}.       $$prog_state{'formname'}.'.'.
       ': '.$time_est.' remaining '.$lasttime.'";'.'</script>');       $$prog_state{'inputname'}.'.value="'.
        $$prog_state{'done'}.'/'.$$prog_state{'max'}.
        ': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";'.'</script>');
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
     $r->rflush();  
 }  }
   
 # close Progress Line  # close Progress Line
 sub Close_PrgWin {  sub Close_PrgWin {
     my ($r,$prog_state)=@_;      my ($r,$prog_state)=@_;
     $r->print('<script>popwin.close()</script>'."\n");      if ($$prog_state{'type'} eq 'popup') {
    &r_print($r,'<script>popwin.close()</script>'."\n");
       } elsif ($$prog_state{'type'} eq 'inline') {
    &Update_PrgWin($r,$prog_state,&mt('Done'));
       }
     undef(%$prog_state);      undef(%$prog_state);
     $r->rflush();   
 }  }
   
   sub r_print {
       my ($r,$to_print)=@_;
       if ($r) {
    $r->print($to_print);
    $r->rflush();
       } else {
    print($to_print);
       }
   }
   
   # ------------------------------------------------------- Puts directory header
   
   sub crumbs {
       my ($uri,$target,$prefix,$form,$size)=@_;
       if (! defined($size)) {
           $size = '+2';
       }
       my $output='<br /><tt><b><font size="'.$size.'">'.$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.='<a href="'.$linkpath.'"'.($target?' target="'.$target.'"':'').'>'.$_.'</a>/';
    }
       } else {
    $output.=$uri;
       }
       unless ($uri=~/\/$/) { $output=~s/\/$//; }
       return $output.'</font></b></tt><br />';
   }
   
   # ------------------------------------------------- Output headers for HTMLArea
   
   sub htmlareaheaders {
       unless (&htmlareablocked()) { return ''; }
       my $lang='en';
       return (<<ENDHEADERS);
   <script type="text/javascript">
       _editor_url="/htmlarea/";
   </script>
   <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>
   <script type="text/javascript" src="/htmlarea/lang/$lang.js"></script>
   <script type="text/javascript" src="/htmlarea/dialog.js"></script>
   <style type="text/css">
   \@import url(/htmlarea/htmlarea.css);
   </style>
   ENDHEADERS
   }
   
   # ---------------------------------------------------------- Script to activate
   
   sub htmlareaactive {
       unless (&htmlareablocked()) { return ''; }
       return (<<ENDSCRIPT);
   <script type="text/javascript" defer="1">
       HTMLArea.replaceAll();
   </script>
   ENDSCRIPT
   }
   
   # --------------------------------------------------------------------- Blocked
   
   sub htmlareablocked {
       unless (&htmlareabrowser()) { return ''; }
       return 1;
   }
   
   # ---------------------------------------- Browser capable of running HTMLArea?
   
   sub htmlareabrowser {
       return 1;
   }
   
   ############################################################
   ############################################################
   
   =pod
   
   =item breadcrumbs
   
   Compiles the previously registered breadcrumbs into an series of links.
   FAQ and BUG links will be placed on the left side of the table if they
   are defined for the last registered breadcrumb.  
   Additionally supports a 'component', which will be displayed on the
   right side of the table (without a link).
   A link to help for the component will be included if one is specified.
   
   All inputs can be undef without problems.
   
   Inputs: $color (the background color of the table returned),
           $component (the large text on the right side of the table),
           $component_help
           $function (role to get colors from)
           $domain   (domian of role)
           $menulink (boolean, controls whether to include a link to /adm/menu)
   
   Returns a string containing breadcrumbs for the current page.
   
   =item clear_breadcrumbs
   
   Clears the previously stored breadcrumbs.
   
   =item add_breadcrumb
   
   Pushes a breadcrumb on the stack of crumbs.
   
   input: $breadcrumb, a hash reference.  The keys 'href','title', and 'text'
   are required.  If present the keys 'faq' and 'bug' will be used to provide
   links to the FAQ and bug sites.
   
   returns: nothing    
   
   =cut
   
   ############################################################
   ############################################################
   {
       my @Crumbs;
       
       sub breadcrumbs {
           my ($color,$component,$component_help,$function,$domain,$menulink) =
       @_;
           if (! defined($color)) {
               if (! defined($function)) {
                   $function = &Apache::loncommon::get_users_function();
               }
               $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                       $domain);
           }
           #
           my $Str = "\n".
               '<table width="100%" border="0" cellpadding="0" cellspacing="0">'.
               '<tr><td bgcolor="'.$color.'">'.
               '<font size="-1">';
           #
           # Make the faq and bug data cascade
           my $faq = '';
           my $bug = '';
           # The last breadcrumb does not have a link, so handle it separately.
           my $last = pop(@Crumbs);
           #
           # The first one should be the course, I guess.
    if (!defined($menulink)) { $menulink=1; }
           if ($menulink && exists($ENV{'request.course.id'}) && $ENV{'request.course.id'} ne '') {
               my $cid = $ENV{'request.course.id'};
               unshift(@Crumbs,{
                                href=>'/adm/menu',
                                title=>'Go to main menu',
                                text=>$ENV{'course.'.$cid.'.description'},
                               });
           }
           my $links .= 
               join('-&gt;',
                    map {
                        $faq = $_->{'faq'} if (exists($_->{'faq'}));
                        $bug = $_->{'bug'} if (exists($_->{'bug'}));
                        '<a href="'.$_->{'href'}.'" title="'.&mt($_->{'title'}).'">'.
                            &mt($_->{'text'}).'</a>' 
                        } @Crumbs
                    );
           $links .= '-&gt;' if ($links ne '');
           $links .= '<b>'.$last->{'text'}.'</b>';
           #
           my $icons = '';
           $faq = $last->{'faq'} if (exists($last->{'faq'}));
           $bug = $last->{'bug'} if (exists($last->{'bug'}));
           if ($faq ne '') {
               $icons .= &Apache::loncommon::help_open_faq($faq);
           }
           if ($bug ne '') {
               $icons .= &Apache::loncommon::help_open_bug($bug);
           }
           if ($icons ne '') {
               $Str .= $icons.'&nbsp;';
           }
           #
           $Str .= $links.'</font></td>';
           #
           if (defined($component)) {
               $Str .= '<td align="right" bgcolor="'.$color.'">'.
                   '<font size="+1">'.&mt($component).'</font>';
               if (defined($component_help)) {
                   $Str .= 
                       &Apache::loncommon::help_open_topic($component_help);
               }
               $Str.= '</td>';
           }
           $Str .= '</tr></table>'."\n";
           #
           # Return the @Crumbs stack to what we started with
           push(@Crumbs,$last);
           shift(@Crumbs);
           #
           return $Str;
       }
   
       sub clear_breadcrumbs {
           undef(@Crumbs);
       }
   
       sub add_breadcrumb {
           push (@Crumbs,@_);
       }
   
   } # End of scope for @Crumbs
   
   ############################################################
   ############################################################
   
   
 1;  1;
   
 __END__  __END__

Removed from v.1.28  
changed lines
  Added in v.1.66


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>