Diff for /loncom/interface/lonhtmlcommon.pm between versions 1.21 and 1.43

version 1.21, 2003/05/12 22:04:41 version 1.43, 2004/01/29 00:51:06
Line 56  html. Line 56  html.
 package Apache::lonhtmlcommon;  package Apache::lonhtmlcommon;
   
 use Time::Local;  use Time::Local;
   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
   
   =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,$value) = @_;
       my $Str = '<input type="checkbox" name="'.$name.'"'.
    ($value?' checked="1"':'').' />';
       return $Str;
   }
   
   
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
Line 65  use strict; Line 178  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 198  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,$includeempty) = @_;
     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)=('','','','','','');
         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 128  sub date_setter { Line 262  sub date_setter {
             document.$formname.$dname\_day.value = 30;              document.$formname.$dname\_day.value = 30;
         }          }
     }      }
   
       function $dname\_opencalendar() {
          var calwin=window.open(
   "/adm/announcements?pickdate=yes&formname=$formname&element=$dname&month="+
   document.$formname.$dname\_month.value+"&year="+
   document.$formname.$dname\_year.value,
                "LONCAPAcal",
                 "height=350,width=350,scrollbars=yes,resizable=yes,menubar=no");
   
       }
 </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/;
     # 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\" ".
             "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";
       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 ($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\" ".      $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 .= "<a href=\"javascript:$dname\_opencalendar()\">".
       &mt('Select Date')."</a></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 217  sub get_date_from_form { Line 370  sub get_date_from_form {
     }      }
     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 239  sub get_date_from_form { Line 392  sub get_date_from_form {
             $year = $tmpyear - 1900;              $year = $tmpyear - 1900;
         }          }
     }      }
     if (eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {      if (($year<70) || ($year>137)) { return undef; }
       if (defined($sec) && defined($min)   && defined($hour) &&
           defined($day) && defined($month) && defined($year) &&
           eval(&timelocal($sec,$min,$hour,$day,$month,$year))) {
         return &timelocal($sec,$min,$hour,$day,$month,$year);          return &timelocal($sec,$min,$hour,$day,$month,$year);
     } else {      } else {
         return undef;          return undef;
Line 327  the selection box is set to document.$fo Line 483  the selection box is set to document.$fo
   
 $size: the size (number of lines) of the selection box.  $size: the size (number of lines) of the selection box.
   
   $onchange: javascript to use when the value is changed.  Enclosed in 
   double quotes, ""s, not single quotes.
   
 Returns: a perl string as described.  Returns: a perl string as described.
   
 =cut  =cut
Line 334  Returns: a perl string as described. Line 493  Returns: a perl string as described.
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub StatusOptions {  sub StatusOptions {
     my ($status, $formName,$size)=@_;      my ($status, $formName,$size,$onchange)=@_;
     $size = 1 if (!defined($size));      $size = 1 if (!defined($size));
     if (! defined($status)) {      if (! defined($status)) {
         $status = 'Active';          $status = 'Active';
Line 351  sub StatusOptions { Line 510  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 .= ' 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";
 }  }
   
Line 565  sub FormatStudentInformation { Line 727  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 574  sub Create_PrgWin { Line 832  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="'.
         &mt('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 594  sub Update_PrgWin { Line 853  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 602  sub Update_PrgWin { Line 861  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.' '.&mt('minutes');
  if ($sec > 1) {          if ($min < 10)  {
     $time_est.= ', '.$sec.' seconds';              if ($sec > 1) {
  } elsif ($sec > 0) {                  $time_est.= ', '.$sec.' '.&mt('seconds');
     $time_est.= ', '.$sec.' second';              } elsif ($sec > 0) {
  }                  $time_est.= ', '.$sec.' '.&mt('second');
               }
           }
       } else {
    $time_est .= ' '.&mt('seconds');
       }
       my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};
       if ($lasttime > 9) {
           $lasttime = int($lasttime);
       } elsif ($lasttime < 0.01) {
           $lasttime = 0;
     } else {      } else {
  $time_est .= ' seconds';          $lasttime = sprintf("%3.2f",$lasttime);
     }      }
     my $lasttime = time-$$prog_state{'laststart'};  
     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_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.' '.&mt('remaining').' '.$lasttime.'";'.'</script>');
     $$prog_state{'laststart'}=time;      $$prog_state{'laststart'}=&Time::HiRes::time();
     $r->rflush();      $r->rflush();
 }  }
   
Line 638  sub Close_PrgWin { Line 917  sub Close_PrgWin {
     $r->rflush();       $r->rflush(); 
 }  }
   
   
   # ------------------------------------------------------- Puts directory header
   
   sub crumbs {
       my ($uri,$target,$prefix,$form)=@_;
       my $output='<br /><tt><b><font size="+2">'.$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 />';
   }
   
   
 1;  1;
   
 __END__  __END__

Removed from v.1.21  
changed lines
  Added in v.1.43


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