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

version 1.20, 2003/04/30 15:49:45 version 1.28, 2003/07/25 19:56:37
Line 58  package Apache::lonhtmlcommon; Line 58  package Apache::lonhtmlcommon;
 use Time::Local;  use Time::Local;
 use strict;  use strict;
   
   
   ##############################################
   ##############################################
   
   =pod
   
   =item textbox
   
   =cut
   
   ##############################################
   ##############################################
   sub textbox {
       my ($name,$value,$size,$special) = @_;
       $size = 40 if (! defined($size));
       my $Str = '<input type="text" name="'.$name.'" size="'.$size.'" '.
           'value="'.$value.'" '.$special.' />';
       return $Str;
   }
   
   ##############################################
   ##############################################
   
   =pod
   
   =item checkbox
   
   =cut
   
   ##############################################
   ##############################################
   sub checkbox {
       my ($name) = @_;
       my $Str = '<input type="checkbox" name="'.$name.'" />';
       return $Str;
   }
   
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 65  use strict; Line 104  use strict;
   
 =item &date_setter  =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  Inputs
   
 =over 4  =over 4
Line 82  The current setting for this time parame Line 124  The current setting for this time parame
 An undefined value is taken to indicate the value is the current time.  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.  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  =cut
   
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub date_setter {  sub date_setter {
     my ($formname,$dname,$currentvalue) = @_;      my ($formname,$dname,$currentvalue,$special) = @_;
     if (! defined($currentvalue) || $currentvalue eq 'now') {      if (! defined($currentvalue) || $currentvalue eq 'now') {
         $currentvalue = time;          $currentvalue = time;
     }      }
Line 130  sub date_setter { Line 183  sub date_setter {
     }      }
 </script>  </script>
 ENDJS  ENDJS
     $result .= "  <select name=\"$dname\_month\" ".      $result .= "  <nobr><select name=\"$dname\_month\" ".$special.' '.
         "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/;
Line 143  ENDJS Line 196  ENDJS
     }      }
     $result .= "  </select>\n";      $result .= "  </select>\n";
     $result .= "  <input type=\"text\" name=\"$dname\_day\" ".      $result .= "  <input type=\"text\" name=\"$dname\_day\" ".
             "value=\"$mday\" size=\"3\" ".              "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\" ".
             "value=\"$year\" size=\"5\" ".              "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\" >\n";      $result .= "  <select name=\"$dname\_hour\" ".$special." >\n";
     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 ($hour == $h);
Line 166  ENDJS Line 219  ENDJS
         $result .= " </option>\n";          $result .= " </option>\n";
     }       } 
     $result .= "  </select>\n";      $result .= "  </select>\n";
     $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".      $result .= "  <input type=\"text\" name=\"$dname\_minute\" ".$special.' '.
         "value=\"$min\" size=\"3\" /> m\n";          "value=\"$min\" size=\"3\" /> m\n";
     $result .= "  <input type=\"text\" name=\"$dname\_second\" ".      $result .= "  <input type=\"text\" name=\"$dname\_second\" ".$special.' '.
         "value=\"$sec\" size=\"3\" /> s\n";          "value=\"$sec\" size=\"3\" /> s\n";
     $result .= "<!-- end $dname date setting form -->\n";      $result .= "</nobr>\n<!-- end $dname date setting form -->\n";
     return $result;      return $result;
 }  }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
   =pod
   
 =item &get_date_from_form  =item &get_date_from_form
   
   get_date_from_form retrieves the date specified in an &date_setter form.
   
 Inputs:  Inputs:
   
 =over 4  =over 4
Line 239  sub get_date_from_form { Line 296  sub get_date_from_form {
             $year = $tmpyear - 1900;              $year = $tmpyear - 1900;
         }          }
     }      }
       if (($year<70) || ($year>137)) { return undef; }
     if (eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {      if (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 {
Line 305  sub javascript_nothing { Line 363  sub javascript_nothing {
     return $nothing;      return $nothing;
 }  }
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
   =pod
   
   =item &StatusOptions()
   
 sub AscendOrderOptions {  Returns html for a selection box which allows the user to choose the
     my ($order, $page, $formName)=@_;  enrollment status of students.  The selection box name is 'Status'.
   
     my $OpSel1 = '';  
     my $OpSel2 = '';  
   
     if($order eq 'Ascending') {  
         $OpSel1 = ' selected';  
     } else {  
         $OpSel2 = ' selected';  
     }  
   
     my $Str = '';  
     $Str .= '<select name="'.(($page)?$page:'').'Ascend"';  
     if($formName) {  
         $Str .= ' onchange="document.'.$formName.'.submit()"';  
     }  
     $Str .= '>'."\n";  
     $Str .= '<option'.$OpSel1.'>Ascending</option>'."\n".  
     '<option'.$OpSel2.'>Descending</option>'."\n";  
     $Str .= '</select>'."\n";  
   
     return $Str;  
 }  
   
 sub MapOptions {  
     my ($data, $page, $formName)=@_;  
     my $Str = '';  
     $Str .= '<select name="';  
     $Str .= (($page)?$page:'').'Maps"';  
     if($formName) {  
         $Str .= ' onchange="document.'.$formName.'.submit()"';  
     }  
     $Str .= '>'."\n";  
   
     my $selected = 0;  
     foreach my $sequence (split(':',$data->{'orderedSequences'})) {  
  $Str .= '<option';  
         if($data->{$page.'Maps'} eq $data->{$sequence.':title'}) {  
             $Str .= ' selected';  
             $selected = 1;  
         }  
  $Str .= '>'.$data->{$sequence.':title'}.'</option>'."\n";       
     }  
     $Str .= '<option';  
     if(!$selected) {  
         $Str .= ' selected';  
     }  
     $Str .= '>All Maps</option>'."\n";  
   
     $Str .= '</select>'."\n";  
   
     return $Str;  
 }  
   
 sub ProblemOptions {  
     my ($data, $page, $map, $formName)=@_;  
     my $Str = '';  
     $Str .= '<select name="';  
     $Str .= (($page)?$page:'').'ProblemSelect"';  
     if($formName) {  
         $Str .= ' onchange="document.'.$formName.'.submit()"';  
     }  
     $Str .= '>'."\n";  
   
     my $selected = 0;  
     foreach my $sequence (split(':',$data->{'orderedSequences'})) {  
  if($data->{$sequence.':title'} eq $map || $map eq 'All Maps') {  
     foreach my $problem (split(':', $data->{$sequence.':problems'})) {  
  $Str .= '<option';  
  if($data->{$page.'ProblemSelect'} eq   
    $data->{$problem.':title'}) {  
     $Str .= ' selected';  
     $selected = 1;  
  }  
  $Str .= '>'.$data->{$problem.':title'}.'</option>'."\n";  
     }  
  }  
     }  
     $Str .= '<option';  
     if(!$selected) {  
         $Str .= ' selected';  
     }  
     $Str .= '>All Problems</option>'."\n";  
   
     $Str .= '</select>'."\n";  
   
     return $Str;  
 }  
   
 sub PartOptions {  
     my ($data, $page, $parts, $formName)=@_;  
     my $Str = '';  
   
     if(!defined($parts)) {  
  return '';  
     }  
   
     $Str .= '<select name="';  
     $Str .= (($page)?$page:'').'PartSelect"';  
     if($formName) {  
         $Str .= ' onchange="document.'.$formName.'.submit()"';  
     }  
     $Str .= '>'."\n";  
   
     my $selected = 0;  
     foreach my $part (@$parts) {  
  $Str .= '<option';  
  if($data->{$page.'PartSelect'} eq $part) {  
     $Str .= ' selected';  
     $selected = 1;  
  }  
  $Str .= '>'.$part.'</option>'."\n";       
     }  
     $Str .= '<option';  
     if(!$selected) {  
         $Str .= ' selected';  
     }  
     $Str .= '>All Parts</option>'."\n";  
   
     $Str .= '</select>'."\n";  
   
     return $Str;  
 }  
   
 sub StudentOptions {  Inputs:
     my ($cache, $students, $selectedName, $page, $formName)=@_;  
   
     my $Str = '';  
     $Str .= '<select name="'.(($page)?$page:'').'Student"';  
     if($formName) {  
         $Str .= ' onchange="document.'.$formName.'.submit()"';  
     }  
     $Str .= '>'."\n";  
   
     my $selected=0;  $status: the currently selected status.  If undefined the value of
   $ENV{'form.Status'} is taken.  If that is undefined, a value of 'Active'
   is used.
   
     foreach (@$students) {  $formname: The name of the form.  If defined the onchange attribute of
  $Str .= '<option';  the selection box is set to document.$formname.submit().
  if($selectedName eq $_) {  
             $Str .= ' selected';  
             $selected = 1;  
         }  
         $Str .= '>';  
         $Str .= $cache->{$_.':fullname'};  
         $Str .= '</option>'."\n";       
     }  
   
     $Str .= '<option';  $size: the size (number of lines) of the selection box.
     if($selectedName eq 'No Student Selected') {  
         $Str .= ' selected';  
         $selected = 1;  
     }  
     $Str .= '>No Student Selected</option>'."\n";  
   
     $Str .= '<option';  $onchange: javascript to use when the value is changed.  Enclosed in 
     if(!$selected) {  double quotes, ""s, not single quotes.
         $Str .= ' selected';  
     }  
     $Str .= '>All Students</option>'."\n";  
   
     $Str .= '</select>'."\n";  Returns: a perl string as described.
   
     return $Str;  =cut
 }  
   
   ##############################################
   ##############################################
 sub StatusOptions {  sub StatusOptions {
     my ($status, $formName)=@_;      my ($status, $formName,$size,$onchange)=@_;
       $size = 1 if (!defined($size));
       if (! defined($status)) {
           $status = 'Active';
           $status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));
       }
   
     my $OpSel1 = '';      my $OpSel1 = '';
     my $OpSel2 = '';      my $OpSel2 = '';
Line 489  sub StatusOptions { Line 412  sub StatusOptions {
   
     my $Str = '';      my $Str = '';
     $Str .= '<select name="Status"';      $Str .= '<select name="Status"';
     if(defined($formName) && $formName ne '') {      if(defined($formName) && $formName ne '' && ! defined($onchange)) {
         $Str .= ' onchange="document.'.$formName.'.submit()"';          $Str .= ' onchange="document.'.$formName.'.submit()"';
     }      }
       if (defined($onchange)) {
           $Str .= ' onchange="'.$onchange.'"';
       }
       $Str .= ' size="'.$size.'" ';
     $Str .= '>'."\n";      $Str .= '>'."\n";
     $Str .= '<option'.$OpSel1.'>Active</option>'."\n";      $Str .= '<option value="Active" '.$OpSel1.'>'.
     $Str .= '<option'.$OpSel2.'>Expired</option>'."\n";          'Currently Enrolled</option>'."\n";
     $Str .= '<option'.$OpSel3.'>Any</option>'."\n";      $Str .= '<option value="Expired" '.$OpSel2.'>'.
           'Previously Enrolled</option>'."\n";
       $Str .= '<option value="Any" '.$OpSel3.'>'.
           'Any Enrollment Status</option>'."\n";
     $Str .= '</select>'."\n";      $Str .= '</select>'."\n";
 }  }
   
Line 699  sub FormatStudentInformation { Line 629  sub FormatStudentInformation {
 ########################################################  ########################################################
 ########################################################  ########################################################
   
   =pod
   
   =item Progess Window Handling Routines
   
   These routines handle the creation, update, increment, and closure of 
   progress windows.  The progress window reports to the user the number
   of items completed and an estimate of the time required to complete the rest.
   
   =over 4
   
   
   =item &Create_PrgWin
   
   Writes javascript to the client to open a progress window and returns a
   data structure used for bookkeeping.
   
   Inputs
   
   =over 4
   
   =item $r Apache request
   
   =item $title The title of the progress window
   
   =item $heading A description (usually 1 line) of the process being initiated.
   
   =item $number_to_do The total number of items being processed.
   
   =back
   
   Returns a hash containing the progress state data structure.
   
   
   =item &Update_PrgWin
   
   Updates the text in the progress indicator.  Does not increment the count.
   See &Increment_PrgWin.
   
   Inputs:
   
   =over 4
   
   =item $r Apache request
   
   =item $prog_state Pointer to the data structure returned by &Create_PrgWin
   
   =item $displaystring The string to write to the status indicator
   
   =back
   
   Returns: none
   
   
   =item Increment_PrgWin
   
   Increment the count of items completed for the progress window by 1.  
   
   Inputs:
   
   =over 4
   
   =item $r Apache request
   
   =item $prog_state Pointer to the data structure returned by Create_PrgWin
   
   =item $extraInfo A description of the items being iterated over.  Typically
   'student'.
   
   =back
   
   Returns: none
   
   
   =item Close_PrgWin
   
   Closes the progress window.
   
   Inputs:
   
   =over 4 
   
   =item $r Apache request
   
   =item $prog_state Pointer to the data structure returned by Create_PrgWin
   
   =back
   
   Returns: none
   
   =back
   
   =cut
   
   ########################################################
   ########################################################
   
 # Create progress  # Create progress
 sub Create_PrgWin {  sub Create_PrgWin {
     my ($r, $title, $heading, $number_to_do)=@_;      my ($r, $title, $heading, $number_to_do)=@_;
Line 708  sub Create_PrgWin { Line 734  sub Create_PrgWin {
       "<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="55" name="remaining" value="Starting"></form>'.
               "</body></html>\');".                "</body></html>\');".
     "popwin.document.close();".      "popwin.document.close();".
     "</script>");      "</script>");
   
     my %prog_state;      my %prog_state;
     $prog_state{'done'}=0;      $prog_state{'done'}=0;
     $prog_state{'firststart'}=time;      $prog_state{'firststart'}=&Time::HiRes::time();
     $prog_state{'laststart'}=time;      $prog_state{'laststart'}=&Time::HiRes::time();
     $prog_state{'max'}=$number_to_do;      $prog_state{'max'}=$number_to_do;
   
     $r->rflush();      $r->rflush();
Line 728  sub Update_PrgWin { Line 754  sub Update_PrgWin {
     my ($r,$prog_state,$displayString)=@_;      my ($r,$prog_state,$displayString)=@_;
     $r->print('<script>popwin.document.popremain.remaining.value="'.      $r->print('<script>popwin.document.popremain.remaining.value="'.
               $displayString.'";</script>');                $displayString.'";</script>');
     $$prog_state{'laststart'}=time;      $$prog_state{'laststart'}=&Time::HiRes::time();
     $r->rflush();      $r->rflush();
 }  }
   
Line 736  sub Update_PrgWin { Line 762  sub Update_PrgWin {
 sub Increment_PrgWin {  sub Increment_PrgWin {
     my ($r,$prog_state,$extraInfo)=@_;      my ($r,$prog_state,$extraInfo)=@_;
     $$prog_state{'done'}++;      $$prog_state{'done'}++;
     my $time_est= (time - $$prog_state{'firststart'})/$$prog_state{'done'} *      my $time_est= (&Time::HiRes::time() - $$prog_state{'firststart'})/
           $$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) {      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.' minutes';
  if ($sec > 1) {          if ($min < 10)  {
     $time_est.= ', '.$sec.' seconds';              if ($sec > 1) {
  } elsif ($sec > 0) {                  $time_est.= ', '.$sec.' seconds';
     $time_est.= ', '.$sec.' second';              } elsif ($sec > 0) {
  }                  $time_est.= ', '.$sec.' second';
               }
           }
     } else {      } else {
  $time_est .= ' seconds';   $time_est .= ' seconds';
     }      }
     my $lasttime = time-$$prog_state{'laststart'};      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) {      if ($lasttime == 1) {
         $lasttime = '('.$lasttime.' second for '.$extraInfo.')';          $lasttime = '('.$lasttime.' second for '.$extraInfo.')';
     } else {      } else {
         $lasttime = '('.$lasttime.' seconds for '.$extraInfo.')';          $lasttime = '('.$lasttime.' 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('<script>popwin.document.popremain.remaining.value="'.      $r->print('<script>popwin.document.popremain.remaining.value="'.
       $$prog_state{'done'}.'/'.$$prog_state{'max'}.        $$prog_state{'done'}.'/'.$$prog_state{'max'}.
       ': '.$time_est.' remaining '.$lasttime.'";'.'</script>');        ': '.$time_est.' remaining '.$lasttime.'";'.'</script>');
     $$prog_state{'laststart'}=time;      $$prog_state{'laststart'}=&Time::HiRes::time();
     $r->rflush();      $r->rflush();
 }  }
   
Line 773  sub Close_PrgWin { Line 819  sub Close_PrgWin {
 }  }
   
 1;  1;
   
 __END__  __END__

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


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