Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.48 and 1.106

version 1.48, 2004/02/16 21:49:16 version 1.106, 2005/06/03 15:47:29
Line 55  html. Line 55  html.
   
 package Apache::lonhtmlcommon;  package Apache::lonhtmlcommon;
   
   use strict;
 use Time::Local;  use Time::Local;
 use Time::HiRes;  use Time::HiRes;
 use Apache::lonlocal;  use Apache::lonlocal;
 use strict;  use Apache::lonnet;
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
Line 81  sub authorbombs { Line 81  sub authorbombs {
     foreach (keys %bombs) {      foreach (keys %bombs) {
  if ($_=~/^$udom\/$uname\//) {   if ($_=~/^$udom\/$uname\//) {
     return '<a href="/adm/bombs/'.$url.      return '<a href="/adm/bombs/'.$url.
  '"><img src="/adm/lonMisc/bomb.gif" border="0" /></a>'.   '"><img src="'.&Apache::loncommon::lonhttpdurl('/adm/lonMisc/bomb.gif').'" border="0" /></a>'.
  &Apache::loncommon::help_open_topic('About_Bombs');   &Apache::loncommon::help_open_topic('About_Bombs');
  }   }
     }      }
Line 118  sub store_recent { Line 118  sub store_recent {
  time.'&'.&Apache::lonnet::escape($value) });   time.'&'.&Apache::lonnet::escape($value) });
 }  }
   
   sub remove_recent {
       my ($area,$names)=@_;
       my $file=&recent_filename($area);
       return &Apache::lonnet::del($file,$names);
   }
   
 sub select_recent {  sub select_recent {
     my ($area,$fieldname,$event)=@_;      my ($area,$fieldname,$event)=@_;
     my %recent=&Apache::lonnet::dump(&recent_filename($area));      my %recent=&Apache::lonnet::dump(&recent_filename($area));
     my $return="\n<select name='$fieldname'".      my $return="\n<select name='$fieldname'".
  ($event?" onChange='$event'":'').   ($event?" onchange='$event'":'').
  ">\n<option value=''>--- ".&mt('Recent')." ---</option>";   ">\n<option value=''>--- ".&mt('Recent')." ---</option>";
     foreach (sort keys %recent) {      foreach (sort keys %recent) {
  unless ($_=~/^error\:/) {   unless ($_=~/^error\:/) {
     $return.="\n<option value='$_'>".      my $escaped = &Apache::loncommon::escape_url($_);
       $return.="\n<option value='$escaped'>".
  &Apache::lonnet::unescape((split(/\&/,$recent{$_}))[1]).   &Apache::lonnet::unescape((split(/\&/,$recent{$_}))[1]).
  '</option>';   '</option>';
  }   }
Line 135  sub select_recent { Line 142  sub select_recent {
     return $return;      return $return;
 }  }
   
   sub get_recent {
       my ($area, $n) = @_;
       my %recent=&Apache::lonnet::dump(&recent_filename($area));
   
   # Create hash with key as time and recent as value
       my %time_hash = ();
       foreach (keys %recent) {
           my $thistime=(split(/\&/,$recent{$_}))[0];
           $time_hash{$thistime} = $_;
       }
   
   # Sort by decreasing time and return key value pairs
       my %return_hash = ();
       my $idx = 1;
       foreach (reverse sort keys %time_hash) {
          $return_hash{$time_hash{$_}} =
                     &Apache::lonnet::unescape((split(/\&/,$recent{$_}))[1]);
          if ($n && ($idx++ >= $n)) {last;}
       }
   
       return %return_hash;
   }
   
   
   
 =pod  =pod
   
Line 164  sub textbox { Line 195  sub textbox {
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub checkbox {  sub checkbox {
     my ($name,$value) = @_;      my ($name,$checked,$value) = @_;
     my $Str = '<input type="checkbox" name="'.$name.'"'.      my $Str = '<input type="checkbox" name="'.$name.'" ';
  ($value?' checked="1"':'').' />';      if (defined($value)) {
           $Str .= 'value="'.$value.'"';
       } 
       if ($checked) {
           $Str .= ' checked="1"';
       }
       $Str .= ' />';
     return $Str;      return $Str;
 }  }
   
Line 202  Also, to be explicit, a value of 'now' a Line 239  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 213  The method used to restrict user input w Line 257  The method used to restrict user input w
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub date_setter {  sub date_setter {
     my ($formname,$dname,$currentvalue,$special,$includeempty) = @_;      my ($formname,$dname,$currentvalue,$special,$includeempty,$state,
           $no_hh_mm_ss) = @_;
       if (! defined($state) || $state ne 'disabled') {
           $state = '';
       }
       if (! defined($no_hh_mm_ss)) {
           $no_hh_mm_ss = 0;
       }
     if (! defined($currentvalue) || $currentvalue eq 'now') {      if (! defined($currentvalue) || $currentvalue eq 'now') {
  unless ($includeempty) {   unless ($includeempty) {
     $currentvalue = time;      $currentvalue = time;
Line 222  sub date_setter { Line 273  sub date_setter {
  }   }
     }      }
     # 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)=('','','','','','');      my ($sec,$min,$hour,$mday,$month,$year)=('','',undef,'','','');
     if ($currentvalue) {      if ($currentvalue) {
  ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) =    ($sec,$min,$hour,$mday,$month,$year,undef,undef,undef) = 
     localtime($currentvalue);      localtime($currentvalue);
Line 261  sub date_setter { Line 312  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() {      function $dname\_opencalendar() {
        var calwin=window.open(          if (! document.$formname.$dname\_month.disabled) {
               var calwin=window.open(
 "/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+  "/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+
 document.$formname.$dname\_month.value+"&year="+  document.$formname.$dname\_month.value+"&year="+
 document.$formname.$dname\_year.value,  document.$formname.$dname\_year.value,
              "LONCAPAcal",               "LONCAPAcal",
               "height=350,width=350,scrollbars=yes,resizable=yes,menubar=no");                "height=350,width=350,scrollbars=yes,resizable=yes,menubar=no");
           }
   
     }      }
 </script>  </script>
 ENDJS  ENDJS
     $result .= "  <nobr><select name=\"$dname\_month\" ".$special.' '.      $result .= '  <nobr>';
         "onChange=\"javascript:$dname\_checkday()\" >\n";      my $monthselector = qq{<select name="$dname\_month" $special $state onchange="javascript:$dname\_checkday()" >};
       # Month
     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>"; }      if ($includeempty) { $monthselector.="<option value=''></option>"; }
     for(my $m = 1;$m <=$#Months;$m++) {      for(my $m = 1;$m <=$#Months;$m++) {
         $result .= "      <option value=\"$m\" ";          $monthselector .= qq{      <option value="$m" };
         $result .= "selected " if ($m-1 eq $month);          $monthselector .= "selected " if ($m-1 eq $month);
         $result .= "> ".&mt($Months[$m])." </option>\n";          $monthselector .= '> '.&mt($Months[$m]).' </option>';
     }      }
     $result .= "  </select>\n";      $monthselector.= '  </select>';
     $result .= "  <input type=\"text\" name=\"$dname\_day\" ".      # Day
             "value=\"$mday\" size=\"3\" ".$special.' '.      my $dayselector = qq{<input type="text" name="$dname\_day" $state value="$mday" size="3" $special onchange="javascript:$dname\_checkday()" />};
             "onChange=\"javascript:$dname\_checkday()\" />\n";      # Year
     $result .= "  <input type=\"year\" name=\"$dname\_year\" ".      my $yearselector = qq{<input type="year" name="$dname\_year" $state value="$year" size="5" $special onchange="javascript:$dname\_checkday()" />};
             "value=\"$year\" size=\"5\" ".$special.' '.      #
             "onChange=\"javascript:$dname\_checkday()\" />\n";      my $hourselector = qq{<select name="$dname\_hour" $special $state >};
     $result .= "&nbsp;&nbsp;";      if ($includeempty) { 
     $result .= "  <select name=\"$dname\_hour\" ".$special." >\n";          $hourselector.=qq{<option value=''></option>};
     if ($includeempty) { $result.="<option value=''></option>"; }      }
     for (my $h = 0;$h<24;$h++) {      for (my $h = 0;$h<24;$h++) {
         $result .= "      <option value=\"$h\" ";          $hourselector .= qq{<option value="$h" };
         $result .= "selected " if ($hour == $h);          $hourselector .= "selected " if (defined($hour) && $hour == $h);
         $result .= "> ";          $hourselector .= ">";
  my $timest='';          my $timest='';
         if ($h == 0) {          if ($h == 0) {
             $timest .= "12 am";              $timest .= "12 am";
         } elsif($h == 12) {          } elsif($h == 12) {
Line 309  ENDJS Line 381  ENDJS
         } else {          } else {
             $timest .= $h-12 ." pm";              $timest .= $h-12 ." pm";
         }          }
  $timest=&mt($timest);          $timest=&mt($timest);
         $result .= $timest." </option>\n";          $hourselector .= $timest." </option>\n";
     }       }
     $result .= "  </select>\n";      $hourselector .= "  </select>\n";
     $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".$special.' '.      my $minuteselector = qq{<input type="text" name="$dname\_minute" $special $state value="$min" size="3" />};
         "value=\"$min\" size=\"3\" /> m\n";      my $secondselector= qq{<input type="text" name="$dname\_second" $special $state value="$sec" size="3" />};
     $result .= "  <input type=\"text\" name=\"$dname\_second\" ".$special.' '.      my $cal_link = qq{<a href="javascript:$dname\_opencalendar()">};
         "value=\"$sec\" size=\"3\" /> s\n";      #
     $result .= "<a href=\"javascript:$dname\_opencalendar()\">".      if ($no_hh_mm_ss) {
     &mt('Select Date')."</a></nobr>\n<!-- end $dname date setting form -->\n";          $result .= &mt('[_1] [_2] [_3] [_4]Select Date[_5]',
                          $monthselector,$dayselector,$yearselector,
                          $cal_link,'</a>');
       } else {
           $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s [_7]Select Date[_8]',
                          $monthselector,$dayselector,$yearselector,
                          $hourselector,$minuteselector,$secondselector,
                          $cal_link,'</a>');
       }
       $result .= "</nobr>\n<!-- end $dname date setting form -->\n";
     return $result;      return $result;
 }  }
   
Line 355  sub get_date_from_form { Line 436  sub get_date_from_form {
     my ($dname) = @_;      my ($dname) = @_;
     my ($sec,$min,$hour,$day,$month,$year);      my ($sec,$min,$hour,$day,$month,$year);
     #      #
     if (defined($ENV{'form.'.$dname.'_second'})) {      if (defined($env{'form.'.$dname.'_second'})) {
         my $tmpsec = $ENV{'form.'.$dname.'_second'};          my $tmpsec = $env{'form.'.$dname.'_second'};
         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; }
       } else {
           $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; }
       } else {
           $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 < 24)) {          if (($tmphour =~ /^\d+$/) && ($tmphour >= 0) && ($tmphour < 24)) {
             $hour = $tmphour;              $hour = $tmphour;
         }          }
       } else {
           $hour = 0;
     }      }
     if (defined($ENV{'form.'.$dname.'_day'})) {      if (defined($env{'form.'.$dname.'_day'})) {
         my $tmpday = $ENV{'form.'.$dname.'_day'};          my $tmpday = $env{'form.'.$dname.'_day'};
         if (($tmpday =~ /^\d+$/) && ($tmpday > 0) && ($tmpday < 32)) {          if (($tmpday =~ /^\d+$/) && ($tmpday > 0) && ($tmpday < 32)) {
             $day = $tmpday;              $day = $tmpday;
         }          }
     }      }
     if (defined($ENV{'form.'.$dname.'_month'})) {      if (defined($env{'form.'.$dname.'_month'})) {
         my $tmpmonth = $ENV{'form.'.$dname.'_month'};          my $tmpmonth = $env{'form.'.$dname.'_month'};
         if (($tmpmonth =~ /^\d+$/) && ($tmpmonth > 0) && ($tmpmonth < 13)) {          if (($tmpmonth =~ /^\d+$/) && ($tmpmonth > 0) && ($tmpmonth < 13)) {
             $month = $tmpmonth - 1;              $month = $tmpmonth - 1;
         }          }
     }      }
     if (defined($ENV{'form.'.$dname.'_year'})) {      if (defined($env{'form.'.$dname.'_year'})) {
         my $tmpyear = $ENV{'form.'.$dname.'_year'};          my $tmpyear = $env{'form.'.$dname.'_year'};
         if (($tmpyear =~ /^\d+$/) && ($tmpyear > 1900)) {          if (($tmpyear =~ /^\d+$/) && ($tmpyear > 1900)) {
             $year = $tmpyear - 1900;              $year = $tmpyear - 1900;
         }          }
Line 448  sub javascript_nothing { Line 537  sub javascript_nothing {
     my $nothing = "''";      my $nothing = "''";
     my $user_browser;      my $user_browser;
     my $user_os;      my $user_os;
     $user_browser = $ENV{'browser.type'} if (exists($ENV{'browser.type'}));      $user_browser = $env{'browser.type'} if (exists($env{'browser.type'}));
     $user_os      = $ENV{'browser.os'}   if (exists($ENV{'browser.os'}));      $user_os      = $env{'browser.os'}   if (exists($env{'browser.os'}));
     if (! defined($user_browser) || ! defined($user_os)) {      if (! defined($user_browser) || ! defined($user_os)) {
         (undef,$user_browser,undef,undef,undef,$user_os) =           (undef,$user_browser,undef,undef,undef,$user_os) = 
                            &Apache::loncommon::decode_user_agent();                             &Apache::loncommon::decode_user_agent();
Line 460  sub javascript_nothing { Line 549  sub javascript_nothing {
     return $nothing;      return $nothing;
 }  }
   
   ##############################################
   ##############################################
   sub javascript_docopen {
       # safari does not understand document.open() and loads "text/html"
       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();
       }
       if ($user_browser eq 'safari' && $user_os =~ 'mac') {
           $nothing = "document.clear()";
       } else {
    $nothing = "document.open('text/html','replace')";
       }
       return $nothing;
   }
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
Line 474  enrollment status of students.  The sele Line 584  enrollment status of students.  The sele
 Inputs:  Inputs:
   
 $status: the currently selected status.  If undefined the value of  $status: the currently selected status.  If undefined the value of
 $ENV{'form.Status'} is taken.  If that is undefined, a value of 'Active'  $env{'form.Status'} is taken.  If that is undefined, a value of 'Active'
 is used.  is used.
   
 $formname: The name of the form.  If defined the onchange attribute of  $formname: The name of the form.  If defined the onchange attribute of
Line 496  sub StatusOptions { Line 606  sub StatusOptions {
     $size = 1 if (!defined($size));      $size = 1 if (!defined($size));
     if (! defined($status)) {      if (! defined($status)) {
         $status = 'Active';          $status = 'Active';
         $status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));          $status = $env{'form.Status'} if (exists($env{'form.Status'}));
     }      }
   
     my $OpSel1 = '';      my $OpSel1 = '';
Line 557  Inputs Line 667  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 625  Returns: none Line 744  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,
     #the whole function called through timeout is due to issues   $inputname)=@_;
     #in mozilla Read BUG #2665 if you want to know the whole story      if (!defined($type)) { $type='popup'; }
     &r_print($r,'<script>'.      if (!defined($width)) { $width=55; }
     "var popwin;      my %prog_state;
      function openpopwin () {      $prog_state{'type'}=$type;
      popwin=open(\'\',\'popwin\',\'width=400,height=100\');".      if ($type eq 'popup') {
     "popwin.document.writeln(\'<html><head><title>$title</title></head>".   $prog_state{'window'}='popwin';
    my $html=&Apache::lonxml::xmlbegin();
    #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="'.                '<input type="text" size="'.$width.'" name="remaining" value="'.
       &mt('Starting').'"></form>'.        &mt('Starting').'"></form>'.
               "</body></html>\');".                "</body></html>\');".
     "popwin.document.close();}".          "popwin.document.close();}".
     "\nwindow.setTimeout(openpopwin,0)</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;
       
     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($r,'<script>popwin.document.popremain.remaining.value="'.      &r_print($r,'<script>'.$$prog_state{'window'}.'.document.'.
        $$prog_state{'formname'}.'.'.
        $$prog_state{'inputname'}.'.value="'.
      $displayString.'";</script>');       $displayString.'";</script>');
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
 }  }
Line 669  sub Increment_PrgWin { Line 824  sub Increment_PrgWin {
         $$prog_state{'done'} *          $$prog_state{'done'} *
  ($$prog_state{'max'}-$$prog_state{'done'});   ($$prog_state{'max'}-$$prog_state{'done'});
     $time_est = int($time_est);      $time_est = int($time_est);
     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.' '.&mt('minutes');      # 
         if ($min < 10)  {      my $str;
             if ($sec > 1) {      if ($min == 0 && $sec > 1) {
                 $time_est.= ', '.$sec.' '.&mt('seconds');          $str = '[_2] seconds';
             } elsif ($sec > 0) {      } elsif ($min == 1 && $sec > 1) {
                 $time_est.= ', '.$sec.' '.&mt('second');          $str = '1 minute [_2] seconds';
             }      } elsif ($min == 1 && $sec < 2) {
         }          $str = '1 minute';
     } else {      } elsif ($min < 10 && $sec > 1) {
  $time_est .= ' '.&mt('seconds');          $str = '[_1] minutes, [_2] seconds';
       } elsif ($min >= 10 || $sec < 2) {
           $str = '[_1] minutes';
     }      }
       $time_est = &mt($str,$min,$sec);
       #
     my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};      my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};
     if ($lasttime > 9) {      if ($lasttime > 9) {
         $lasttime = int($lasttime);          $lasttime = int($lasttime);
Line 697  sub Increment_PrgWin { Line 856  sub Increment_PrgWin {
         $lasttime = '('.$lasttime.' '.&mt('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'}));
     my $user_os      = $ENV{'browser.os'}   if (exists($ENV{'browser.os'}));      my $user_os      = $env{'browser.os'}   if (exists($env{'browser.os'}));
     if (! defined($user_browser) || ! defined($user_os)) {      if (! defined($user_browser) || ! defined($user_os)) {
         (undef,$user_browser,undef,undef,undef,$user_os) =           (undef,$user_browser,undef,undef,undef,$user_os) = 
                            &Apache::loncommon::decode_user_agent();                             &Apache::loncommon::decode_user_agent();
Line 706  sub Increment_PrgWin { Line 865  sub Increment_PrgWin {
     if ($user_browser eq 'explorer' && $user_os =~ 'mac') {      if ($user_browser eq 'explorer' && $user_os =~ 'mac') {
         $lasttime = '';          $lasttime = '';
     }      }
     &r_print($r,'<script>popwin.document.popremain.remaining.value="'.      &r_print($r,'<script>'.$$prog_state{'window'}.'.document.'.
        $$prog_state{'formname'}.'.'.
        $$prog_state{'inputname'}.'.value="'.
      $$prog_state{'done'}.'/'.$$prog_state{'max'}.       $$prog_state{'done'}.'/'.$$prog_state{'max'}.
      ': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";'.'</script>');       ': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";'.'</script>');
     $$prog_state{'laststart'}=&Time::HiRes::time();      $$prog_state{'laststart'}=&Time::HiRes::time();
Line 715  sub Increment_PrgWin { Line 876  sub Increment_PrgWin {
 # close Progress Line  # close Progress Line
 sub Close_PrgWin {  sub Close_PrgWin {
     my ($r,$prog_state)=@_;      my ($r,$prog_state)=@_;
     &r_print($r,'<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);
 }  }
   
Line 732  sub r_print { Line 897  sub r_print {
 # ------------------------------------------------------- Puts directory header  # ------------------------------------------------------- Puts directory header
   
 sub crumbs {  sub crumbs {
     my ($uri,$target,$prefix,$form)=@_;      my ($uri,$target,$prefix,$form,$size,$noformat)=@_;
     my $output='<br /><tt><b><font size="+2">'.$prefix.'/';      if (! defined($size)) {
     if ($ENV{'user.adv'}) {          $size = '+2';
       }
       if ($target) {
           $target = ' target="'.
                     &Apache::loncommon::escape_single($target).'"';
       }
       my $output='';
       unless ($noformat) { $output.='<br /><tt><b>'; }
       $output.='<font size="'.$size.'">'.$prefix.'/';
       if ($env{'user.adv'}) {
  my $path=$prefix.'/';   my $path=$prefix.'/';
  foreach (split('/',$uri)) {   foreach my $dir (split('/',$uri)) {
     unless ($_) { next; }              if (! $dir) { next; }
     $path.=$_;              $path .= $dir;
     unless ($path eq $uri) { $path.='/'; }      unless ($path eq $uri) { $path.='/'; }
     my $linkpath=$path;              my $linkpath = &Apache::loncommon::escape_single($path);
     if ($form) {              if ($form) {
  $linkpath="javascript:$form.action='$path';$form.submit();";   $linkpath=
     }                      qq{javascript:$form.action='$linkpath';$form.submit();};
     $output.='<a href="'.$linkpath.'"'.($target?' target="'.$target.'"':'').'>'.$_.'</a>/';              }
       $output.=qq{<a href="$linkpath" $target>$dir</a>/};
  }   }
     } else {      } else {
  $output.=$uri;   $output.=$uri;
     }      }
     unless ($uri=~/\/$/) { $output=~s/\/$//; }      unless ($uri=~/\/$/) { $output=~s/\/$//; }
     return $output.'</font></b></tt><br />';      return $output.'</font>'.($noformat?'':'</b></tt><br />');
 }  }
   
   # --------------------- A function that generates a window for the spellchecker
   
   sub spellheader {
       my $html=&Apache::lonxml::xmlbegin();
       my $nothing=&javascript_nothing();
       return (<<ENDCHECK);
   <script type="text/javascript"> 
   //<!-- BEGIN LON-CAPA Internal
   var checkwin;
   
   function spellcheckerwindow() {
       checkwin=window.open($nothing,'spellcheckwin','height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
       checkwin.document.writeln('$html<head></head><body bgcolor="#DDDDDD"><form name="spellcheckform" action="/adm/spellcheck" method="post"><input type="hidden" name="text" value="" /></form></body></html>');
       checkwin.document.close();
   }
   // END LON-CAPA Internal -->
   </script>
   ENDCHECK
   }
   
   # ---------------------------------- Generate link to spell checker for a field
   
   sub spelllink {
       my ($form,$field)=@_;
       my $linktext=&mt('Check Spelling');
       return (<<ENDLINK);
   <a href="javascript:if (typeof(document.$form.onsubmit)!='undefined') { if (document.$form.onsubmit!=null) { document.$form.onsubmit();}};spellcheckerwindow();checkwin.document.forms.spellcheckform.text.value=this.document.forms.$form.$field.value;checkwin.document.forms.spellcheckform.submit();">$linktext</a>
   ENDLINK
   }
   
   # ------------------------------------------------- Output headers for HTMLArea
   
   sub htmlareaheaders {
       if (&htmlareablocked()) { return ''; }
       unless (&htmlareabrowser()) { return ''; }
       my $lang='en';
       if (&mt('htmlarea_lang') ne 'htmlarea_lang') {
    $lang=&mt('htmlarea_lang');
       }
       return (<<ENDHEADERS);
   <script type="text/javascript">
   _editor_url='/htmlarea/';
   _editor_lang='$lang';
   </script>
   <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>
   ENDHEADERS
   }
   
   # ------------------------------------------------- Activate additional buttons
   
   sub htmlareaaddbuttons {
       if (&htmlareablocked()) { return ''; }
       unless (&htmlareabrowser()) { return ''; }
       return (<<ENDADDBUTTON);
       var config=new HTMLArea.Config();
       config.registerButton('ed_math','LaTeX Inline',
     '/htmlarea/images/ed_math.gif',false,
       function(editor,id) {
         editor.surroundHTML('&nbsp;<m>\$','\$</m>&nbsp;');
       }
     );
       config.registerButton('ed_math_eqn','LaTeX Equation',
     '/htmlarea/images/ed_math_eqn.gif',false,
       function(editor,id) {
         editor.surroundHTML(
        '&nbsp;\\n<center><m>\\\\[','\\\\]</m></center>\\n&nbsp;');
       }
     );
       config.toolbar.push(['ed_math','ed_math_eqn']);
   ENDADDBUTTON
   }
   
   # ----------------------------------------------------------------- Preferences
   
   sub disablelink {
       my @fields=@_;
       if (defined($#fields)) {
    unless ($#fields>=0) { return ''; }
       }
       return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=off&returnurl=','<>&"').&Apache::lonnet::escape($ENV{'REQUEST_URI'}).'">'.&mt('Disable WYSIWYG Editor').'</a>';
   }
   
   sub enablelink {
       my @fields=@_;
       if (defined($#fields)) {
    unless ($#fields>=0) { return ''; }
       }
       return '<a href="'.&HTML::Entities::encode('/adm/preferences?action=set_wysiwyg&wysiwyg=on&returnurl=','<>&"').&Apache::lonnet::escape($ENV{'REQUEST_URI'}).'">'.&mt('Enable WYSIWYG Editor').'</a>';
   }
   
   # ----------------------------------------- Script to activate only some fields
   
   sub htmlareaselectactive {
       my @fields=@_;
       unless (&htmlareabrowser()) { return ''; }
       if (&htmlareablocked()) { return '<br />'.&enablelink(@fields); }
       my $output='<script type="text/javascript" defer="1">'.
    &htmlareaaddbuttons();
       foreach(@fields) {
    $output.="\nHTMLArea.replace('$_',config);";
       }
       $output.="\nwindow.status='Activated Editfields';\n</script><br />".
    &disablelink(@fields);
       return $output;
   }
   
   # --------------------------------------------------------------------- Blocked
   
   sub htmlareablocked {
       unless ($env{'environment.wysiwygeditor'} eq 'on') { return 1; }
       return 0;
   }
   
   # ---------------------------------------- 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,
       $helplink) = @_;
           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 = '';
    my $help='';
           # The last breadcrumb does not have a link, so handle it separately.
           my $last = pop(@Crumbs);
           #
           # The first one should be the course or a menu link
    if (!defined($menulink)) { $menulink=1; }
           if ($menulink) {
               my $description = 'Menu';
               if (exists($env{'request.course.id'}) && 
                   $env{'request.course.id'} ne '') {
                   $description = 
                       $env{'course.'.$env{'request.course.id'}.'.description'};
               }
               unshift(@Crumbs,{
                       href   =>'/adm/menu',
                       title  =>'Go to main menu',
                       target =>'_top',
                       text   =>$description,
                   });
           }
           my $links .= 
               join('-&gt;',
                    map {
                        $faq = $_->{'faq'} if (exists($_->{'faq'}));
                        $bug = $_->{'bug'} if (exists($_->{'bug'}));
                        $help = $_->{'help'} if (exists($_->{'help'}));
                        my $result = '<a href="'.$_->{'href'}.'" ';
                        if (defined($_->{'target'}) && $_->{'target'} ne '') {
                            $result .= 'target="'.$_->{'target'}.'" ';
                        }
                        $result .='title="'.&mt($_->{'title'}).'">'.
                            &mt($_->{'text'}).'</a>';
                        $result;
                        } @Crumbs
                    );
           $links .= '-&gt;' if ($links ne '');
           $links .= '<b>'.&mt($last->{'text'}).'</b>';
           #
           my $icons = '';
           $faq = $last->{'faq'} if (exists($last->{'faq'}));
           $bug = $last->{'bug'} if (exists($last->{'bug'}));
           $help = $last->{'help'} if (exists($last->{'help'}));
           $component_help=($component_help?$component_help:$help);
   #        if ($faq ne '') {
   #            $icons .= &Apache::loncommon::help_open_faq($faq);
   #        }
   #        if ($bug ne '') {
   #            $icons .= &Apache::loncommon::help_open_bug($bug);
   #        }
    if ($helplink ne 'nohelp') {
       $icons .= &Apache::loncommon::help_open_menu($color,$component,$component_help,$function,$faq,$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></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;
   

Removed from v.1.48  
changed lines
  Added in v.1.106


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