Diff for /loncom/interface/lonhelper.pm between versions 1.46 and 1.71

version 1.46, 2003/09/16 20:00:57 version 1.71, 2004/04/21 17:29:57
Line 172  before parsing XML fragments and B<Apach Line 172  before parsing XML fragments and B<Apach
 when you are done. See lonprintout.pm for examples of this usage in the  when you are done. See lonprintout.pm for examples of this usage in the
 printHelper subroutine.  printHelper subroutine.
   
   =head2 Localization
   
   The helper framework tries to handle as much localization as
   possible. The text is always run through
   Apache::lonlocal::normalize_string, so be sure to run the keys through
   that function for maximum usefulness and robustness.
   
 =cut  =cut
   
 package Apache::lonhelper;  package Apache::lonhelper;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::File;  use Apache::File;
 use Apache::lonxml;  use Apache::lonxml;
   use Apache::lonlocal;
   
 # Register all the tags with the helper, so the helper can   # Register all the tags with the helper, so the helper can 
 # push and pop them  # push and pop them
Line 222  my $paramHash; Line 230  my $paramHash;
 # In the debugger, this means that breakpoints are ignored until you step into  # In the debugger, this means that breakpoints are ignored until you step into
 # a function and get out of what must be a "faked up scope" in the Apache->  # a function and get out of what must be a "faked up scope" in the Apache->
 # mod_perl connection. In this code, it was manifesting itself in the existence  # mod_perl connection. In this code, it was manifesting itself in the existence
 # of two seperate file-scoped $helper variables, one set to the value of the  # of two separate file-scoped $helper variables, one set to the value of the
 # helper in the helper constructor, and one referenced by the handler on the  # helper in the helper constructor, and one referenced by the handler on the
 # "$helper->process()" line. Using the debugger, one could actually  # "$helper->process()" line. Using the debugger, one could actually
 # see the two different $helper variables, as hashes at completely  # see the two different $helper variables, as hashes at completely
Line 255  sub real_handler { Line 263  sub real_handler {
   
   
     # Send header, don't cache this page      # Send header, don't cache this page
     if ($r->header_only) {  
         if ($ENV{'browser.mathml'}) {  
             $r->content_type('text/xml');  
         } else {  
             $r->content_type('text/html');  
         }  
         $r->send_http_header;  
         return OK;  
     }  
     if ($ENV{'browser.mathml'}) {      if ($ENV{'browser.mathml'}) {
         $r->content_type('text/xml');   &Apache::loncommon::content_type($r,'text/xml');
     } else {      } else {
         $r->content_type('text/html');   &Apache::loncommon::content_type($r,'text/html');
     }      }
     $r->send_http_header;      $r->send_http_header;
       return OK if $r->header_only;
     $r->rflush();      $r->rflush();
   
     # Discard result, we just want the objects that get created by the      # Discard result, we just want the objects that get created by the
Line 359  sub end_state { Line 359  sub end_state {
 package Apache::lonhelper::helper;  package Apache::lonhelper::helper;
   
 use Digest::MD5 qw(md5_hex);  use Digest::MD5 qw(md5_hex);
 use HTML::Entities;  use HTML::Entities();
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::File;  use Apache::File;
   use Apache::lonlocal;
   
 sub new {  sub new {
     my $proto = shift;      my $proto = shift;
Line 453  sub _saveVars { Line 454  sub _saveVars {
     my $self = shift;      my $self = shift;
     my $result = "";      my $result = "";
     $result .= '<input type="hidden" name="CURRENT_STATE" value="' .      $result .= '<input type="hidden" name="CURRENT_STATE" value="' .
         HTML::Entities::encode($self->{STATE}) . "\" />\n";          HTML::Entities::encode($self->{STATE},'<>&"') . "\" />\n";
     $result .= '<input type="hidden" name="TOKEN" value="' .      $result .= '<input type="hidden" name="TOKEN" value="' .
         $self->{TOKEN} . "\" />\n";          $self->{TOKEN} . "\" />\n";
     $result .= '<input type="hidden" name="RETURN_PAGE" value="' .      $result .= '<input type="hidden" name="RETURN_PAGE" value="' .
         HTML::Entities::encode($self->{RETURN_PAGE}) . "\" />\n";          HTML::Entities::encode($self->{RETURN_PAGE},'<>&"') . "\" />\n";
   
     return $result;      return $result;
 }  }
Line 523  sub process { Line 524  sub process {
     # Phase 1: Post processing for state of previous screen (which is actually      # Phase 1: Post processing for state of previous screen (which is actually
     # the "current state" in terms of the helper variables), if it wasn't the       # the "current state" in terms of the helper variables), if it wasn't the 
     # beginning state.      # beginning state.
     if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq "Next ->") {      if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq &mt("Next ->")) {
  my $prevState = $self->{STATES}{$self->{STATE}};   my $prevState = $self->{STATES}{$self->{STATE}};
         $prevState->postprocess();          $prevState->postprocess();
     }      }
Line 574  sub display { Line 575  sub display {
     }      }
   
     # Phase 4: Display.      # Phase 4: Display.
     my $stateTitle = $state->title();      my $stateTitle=&mt($state->title());
     my $bodytag = &Apache::loncommon::bodytag("$self->{TITLE}",'','');      my $helperTitle = &mt($self->{TITLE});
       my $bodytag = &Apache::loncommon::bodytag($helperTitle,'','');
       my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
       my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');
       # FIXME: This should be parameterized, not concatenated - Jeremy
       my $loncapaHelper = &mt("LON-CAPA Helper:");
   
     $result .= <<HEADER;      $result .= <<HEADER;
 <html>  <html>
   <script type="text/javascript" language="Javascript" >
       var editbrowser;
       function openbrowser(formname,elementname,only,omit) {
           var url = '/res/?';
           if (editbrowser == null) {
               url += 'launch=1&';
           }
           url += 'catalogmode=interactive&';
           url += 'mode=parmset&';
           url += 'form=' + formname + '&';
           if (only != null) {
               url += 'only=' + only + '&';
           } 
           if (omit != null) {
               url += 'omit=' + omit + '&';
           }
           url += 'element=' + elementname + '';
           var title = 'Browser';
           var options = 'scrollbars=1,resizable=1,menubar=0';
           options += ',width=700,height=600';
           editbrowser = open(url,title,options,'1');
           editbrowser.focus();
       }
   </script>
     <head>      <head>
         <title>LON-CAPA Helper: $self->{TITLE}</title>          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
           <title>$loncapaHelper: $helperTitle</title>
     </head>      </head>
     $bodytag      $bodytag
 HEADER  HEADER
Line 607  HEADER Line 638  HEADER
         }          }
         if ($self->{DONE}) {          if ($self->{DONE}) {
             my $returnPage = $self->{RETURN_PAGE};              my $returnPage = $self->{RETURN_PAGE};
             $result .= "<a href=\"$returnPage\">End Helper</a>";              $result .= "<a href=\"$returnPage\">" . &mt("End Helper") . "</a>";
         }          }
         else {          else {
             $result .= '<nobr><input name="back" type="button" ';              $result .= '<nobr><input name="back" type="button" ';
             $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';              $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
             $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';              $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
         }          }
     }      }
   
Line 626  HEADER Line 657  HEADER
         }          }
         if ($self->{DONE}) {          if ($self->{DONE}) {
             my $returnPage = $self->{RETURN_PAGE};              my $returnPage = $self->{RETURN_PAGE};
             $result .= "<a href=\"$returnPage\">End Helper</a>";              $result .= "<a href=\"$returnPage\">" . &mt('End Helper') . "</a>";
         }          }
         else {          else {
             $result .= '<nobr><input name="back" type="button" ';              $result .= '<nobr><input name="back" type="button" ';
             $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';              $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
             $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';              $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
         }          }
     }      }
   
Line 883  sub start_defaultvalue { Line 914  sub start_defaultvalue {
   
 sub end_defaultvalue { return ''; }  sub end_defaultvalue { return ''; }
   
   # Validators may need to take language specifications
 sub start_validator {  sub start_validator {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
Line 926  package Apache::lonhelper::message; Line 958  package Apache::lonhelper::message;
   
 =pod  =pod
   
 =head1 Element: messageX<message, helper element>  =head1 Elements
   
   =head2 Element: messageX<message, helper element>
   
 Message elements display their contents, and  Message elements display their contents, and
 transition directly to the state in the <nextstate> attribute. Example:  transition directly to the state in the <nextstate> attribute. Example:
Line 950  within each other.) Line 984  within each other.)
 This is also a good template for creating your own new states, as it has  This is also a good template for creating your own new states, as it has
 very little code beyond the state template.  very little code beyond the state template.
   
   =head3 Localization
   
   The contents of the message tag will be run through the
   normalize_string function and that will be used as a call to &mt.
   
 =cut  =cut
   
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::message',      &Apache::lonhelper::register('Apache::lonhelper::message',
Line 974  sub start_message { Line 1014  sub start_message {
         return '';          return '';
     }      }
   
     $paramHash->{MESSAGE_TEXT} = &Apache::lonxml::get_all_text('/message',      $paramHash->{MESSAGE_TEXT} = &mtn(&Apache::lonxml::get_all_text('/message',
                                                                $parser);                                                                 $parser));
   
     if (defined($token->[2]{'nextstate'})) {      if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};          $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
Line 996  sub end_message { Line 1036  sub end_message {
 sub render {  sub render {
     my $self = shift;      my $self = shift;
   
     return $self->{MESSAGE_TEXT};      return &mtn($self->{MESSAGE_TEXT});
 }  }
 # If a NEXTSTATE was given, switch to it  # If a NEXTSTATE was given, switch to it
 sub postprocess {  sub postprocess {
Line 1098  tag is stored in the {VARS} hash. Line 1138  tag is stored in the {VARS} hash.
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::choices',      &Apache::lonhelper::register('Apache::lonhelper::choices',
Line 1144  sub start_choice { Line 1185  sub start_choice {
     }      }
   
     my $computer = $token->[2]{'computer'};      my $computer = $token->[2]{'computer'};
     my $human = &Apache::lonxml::get_all_text('/choice',      my $human = &mt(&Apache::lonxml::get_all_text('/choice',
                                               $parser);                                                $parser));
     my $nextstate = $token->[2]{'nextstate'};      my $nextstate = $token->[2]{'nextstate'};
     my $evalFlag = $token->[2]{'eval'};      my $evalFlag = $token->[2]{'eval'};
     push @{$paramHash->{CHOICES}}, [$human, $computer, $nextstate,       push @{$paramHash->{CHOICES}}, [$human, $computer, $nextstate, 
Line 1181  SCRIPT Line 1222  SCRIPT
     # Only print "select all" and "unselect all" if there are five or      # Only print "select all" and "unselect all" if there are five or
     # more choices; fewer then that and it looks silly.      # more choices; fewer then that and it looks silly.
     if ($self->{'multichoice'} && scalar(@{$self->{CHOICES}}) > 4) {      if ($self->{'multichoice'} && scalar(@{$self->{CHOICES}}) > 4) {
           my %lt=&Apache::lonlocal::texthash(
    'sa'  => "Select All",
           'ua'  => "Unselect All");
         $buttons = <<BUTTONS;          $buttons = <<BUTTONS;
 <br />  <br />
 <input type="button" onclick="checkall(true, '$var')" value="Select All" />  <input type="button" onclick="checkall(true, '$var')" value="$lt{'sa'}" />
 <input type="button" onclick="checkall(false, '$var')" value="Unselect All" />  <input type="button" onclick="checkall(false, '$var')" value="$lt{'ua'}" />
 <br />&nbsp;  <br />&nbsp;
 BUTTONS  BUTTONS
     }      }
Line 1239  BUTTONS Line 1283  BUTTONS
         $result .= "<tr>\n<td width='20'>&nbsp;</td>\n";          $result .= "<tr>\n<td width='20'>&nbsp;</td>\n";
         $result .= "<td valign='top'><input type='$type' name='$var.forminput'"          $result .= "<td valign='top'><input type='$type' name='$var.forminput'"
             . "' value='" .               . "' value='" . 
             HTML::Entities::encode($choice->[1])               HTML::Entities::encode($choice->[1],'<>&"') 
             . "'";              . "'";
         if ($checkedChoices{$choice->[1]}) {          if ($checkedChoices{$choice->[1]}) {
             $result .= " checked ";              $result .= " checked ";
Line 1251  BUTTONS Line 1295  BUTTONS
             $choiceLabel = eval($choiceLabel);              $choiceLabel = eval($choiceLabel);
             $choiceLabel = &$choiceLabel($helper, $self);              $choiceLabel = &$choiceLabel($helper, $self);
         }          }
         $result .= "/></td><td> " . $choiceLabel . "</td></tr>\n";   &Apache::lonnet::logthis("TITLE TRANSLATION >$choiceLabel<");
           $result .= "/></td><td> " . &mtn($choiceLabel) . "</td></tr>\n";
     }      }
     $result .= "</table>\n\n\n";      $result .= "</table>\n\n\n";
     $result .= $buttons;      $result .= $buttons;
Line 1266  sub postprocess { Line 1311  sub postprocess {
     my $chosenValue = $ENV{'form.' . $self->{'variable'} . '.forminput'};      my $chosenValue = $ENV{'form.' . $self->{'variable'} . '.forminput'};
   
     if (!defined($chosenValue) && !$self->{'allowempty'}) {      if (!defined($chosenValue) && !$self->{'allowempty'}) {
         $self->{ERROR_MSG} = "You must choose one or more choices to" .          $self->{ERROR_MSG} = 
             " continue.";      &mt("You must choose one or more choices to continue.");
         return 0;          return 0;
     }      }
   
Line 1310  the result is stored in. Line 1355  the result is stored in.
   
 =cut  =cut
   
   # This really ought to be a sibling class to "choice" which is itself
   # a child of some abstract class.... *shrug*
   
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::dropdown',      &Apache::lonhelper::register('Apache::lonhelper::dropdown',
Line 1390  sub render { Line 1439  sub render {
     $result .= "<select name='${var}.forminput'>\n";      $result .= "<select name='${var}.forminput'>\n";
     foreach my $choice (@{$self->{CHOICES}}) {      foreach my $choice (@{$self->{CHOICES}}) {
         $result .= "<option value='" .           $result .= "<option value='" . 
             HTML::Entities::encode($choice->[1])               HTML::Entities::encode($choice->[1],'<>&"') 
             . "'";              . "'";
         if ($checkedChoices{$choice->[1]}) {          if ($checkedChoices{$choice->[1]}) {
             $result .= " selected";              $result .= " selected";
Line 1402  sub render { Line 1451  sub render {
             $choiceLabel = eval($choiceLabel);              $choiceLabel = eval($choiceLabel);
             $choiceLabel = &$choiceLabel($helper, $self);              $choiceLabel = &$choiceLabel($helper, $self);
         }          }
         $result .= ">" . $choiceLabel . "\n";          $result .= ">" . &mtn($choiceLabel) . "\n";
     }      }
     $result .= "</select>\n";      $result .= "</select>\n";
   
Line 1471  Example: Line 1520  Example:
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal; # A localization nightmare
   
 use Time::localtime;  use Time::localtime;
   
Line 1535  sub render { Line 1585  sub render {
         } else {          } else {
             $result .= "<option value='$i'>";              $result .= "<option value='$i'>";
         }          }
         $result .= $months[$i] . "</option>\n";          $result .= &mt($months[$i]) . "</option>\n";
     }      }
     $result .= "</select>\n";      $result .= "</select>\n";
   
Line 1565  sub render { Line 1615  sub render {
   
     # Display Hours and Minutes if they are called for      # Display Hours and Minutes if they are called for
     if ($self->{'hoursminutes'}) {      if ($self->{'hoursminutes'}) {
    # This needs parameterization for times.
    my $am = &mt('a.m.');
    my $pm = &mt('p.m.');
         # Build hour          # Build hour
         $result .= "<select name='${var}hour'>\n";          $result .= "<select name='${var}hour'>\n";
         $result .= "<option " . ($date->hour == 0 ? 'selected ':'') .          $result .= "<option " . ($date->hour == 0 ? 'selected ':'') .
             " value='0'>midnight</option>\n";              " value='0'>" . &mt('midnight') . "</option>\n";
         for ($i = 1; $i < 12; $i++) {          for ($i = 1; $i < 12; $i++) {
             if ($date->hour == $i) {              if ($date->hour == $i) {
                 $result .= "<option selected value='$i'>$i a.m.</option>\n";                  $result .= "<option selected value='$i'>$i $am</option>\n";
             } else {              } else {
                 $result .= "<option value='$i'>$i a.m</option>\n";                  $result .= "<option value='$i'>$i $am</option>\n";
             }              }
         }          }
         $result .= "<option " . ($date->hour == 12 ? 'selected ':'') .          $result .= "<option " . ($date->hour == 12 ? 'selected ':'') .
             " value='12'>noon</option>\n";              " value='12'>" . &mt('noon') . "</option>\n";
         for ($i = 13; $i < 24; $i++) {          for ($i = 13; $i < 24; $i++) {
             my $printedHour = $i - 12;              my $printedHour = $i - 12;
             if ($date->hour == $i) {              if ($date->hour == $i) {
                 $result .= "<option selected value='$i'>$printedHour p.m.</option>\n";                  $result .= "<option selected value='$i'>$printedHour $pm</option>\n";
             } else {              } else {
                 $result .= "<option value='$i'>$printedHour p.m.</option>\n";                  $result .= "<option value='$i'>$printedHour $pm</option>\n";
             }              }
         }          }
   
Line 1622  sub postprocess { Line 1675  sub postprocess {
         $hour = $ENV{'form.' . $var . 'hour'};          $hour = $ENV{'form.' . $var . 'hour'};
     }      }
   
     my $chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);      my $chosenDate;
       eval {$chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);};
       my $error = $@;
   
     # Check to make sure that the date was not automatically co-erced into a       # Check to make sure that the date was not automatically co-erced into a 
     # valid date, as we want to flag that as an error      # valid date, as we want to flag that as an error
     # This happens for "Feb. 31", for instance, which is coerced to March 2 or      # This happens for "Feb. 31", for instance, which is coerced to March 2 or
     # 3, depending on if it's a leapyear      # 3, depending on if it's a leap year
     my $checkDate = localtime($chosenDate);      my $checkDate = localtime($chosenDate);
   
     if ($checkDate->mon != $month || $checkDate->mday != $day ||      if ($error || $checkDate->mon != $month || $checkDate->mday != $day ||
         $checkDate->year + 1900 != $year) {          $checkDate->year + 1900 != $year) {
    unless (Apache::lonlocal::current_language()== ~/^en/) {
       $self->{ERROR_MSG} = &mt("Invalid date entry");
       return 0;
    }
    # LOCALIZATION FIXME: Needs to be parameterized
         $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a "          $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a "
             . "date because it doesn't exist. Please enter a valid date.";              . "date because it doesn't exist. Please enter a valid date.";
   
         return 0;          return 0;
     }      }
   
Line 1696  and long status display columns to the d Line 1758  and long status display columns to the d
   default, the value will be the resource ID of the object ($res->{ID}).    default, the value will be the resource ID of the object ($res->{ID}).
   
 =item * <mapurl>X<mapurl>: If the URL of a map is given here, only that map  =item * <mapurl>X<mapurl>: If the URL of a map is given here, only that map
   will be displayed, instead of the whole course.    will be displayed, instead of the whole course. If the attribute
     "evaluate" is given and is true, the contents of the mapurl will be
     evaluated with "sub { my $helper = shift; my $state = shift;" and
     "}", with the return value used as the mapurl.
   
 =back  =back
   
Line 1732  sub start_resource { Line 1797  sub start_resource {
     $paramHash->{'suppressEmptySequences'} = $token->[2]{'suppressEmptySequences'};      $paramHash->{'suppressEmptySequences'} = $token->[2]{'suppressEmptySequences'};
     $paramHash->{'toponly'} = $token->[2]{'toponly'};      $paramHash->{'toponly'} = $token->[2]{'toponly'};
     $paramHash->{'addstatus'} = $token->[2]{'addstatus'};      $paramHash->{'addstatus'} = $token->[2]{'addstatus'};
       $paramHash->{'closeallpages'} = $token->[2]{'closeallpages'};
     return '';      return '';
 }  }
   
Line 1808  sub start_mapurl { Line 1874  sub start_mapurl {
   
     my $contents = Apache::lonxml::get_all_text('/mapurl',      my $contents = Apache::lonxml::get_all_text('/mapurl',
                                                 $parser);                                                  $parser);
       $paramHash->{EVAL_MAP_URL} = $token->[2]{'evaluate'};
     $paramHash->{MAP_URL} = $contents;      $paramHash->{MAP_URL} = $contents;
 }  }
   
Line 1846  sub render { Line 1913  sub render {
     }      }
 </script>  </script>
 SCRIPT  SCRIPT
           my %lt=&Apache::lonlocal::texthash(
    'sar'  => "Select All Resources",
           'uar'  => "Unselect All Resources");
   
         $buttons = <<BUTTONS;          $buttons = <<BUTTONS;
 <br /> &nbsp;  <br /> &nbsp;
 <input type="button" onclick="checkall(true, '$var')" value="Select All Resources" />  <input type="button" onclick="checkall(true, '$var')" value="$lt{'sar'}" />
 <input type="button" onclick="checkall(false, '$var')" value="Unselect All Resources" />  <input type="button" onclick="checkall(false, '$var')" value="$lt{'uar'}" />
 <br /> &nbsp;  <br /> &nbsp;
 BUTTONS  BUTTONS
     }      }
Line 1863  BUTTONS Line 1934  BUTTONS
     my $filterFunc = $self->{FILTER_FUNC};      my $filterFunc = $self->{FILTER_FUNC};
     my $choiceFunc = $self->{CHOICE_FUNC};      my $choiceFunc = $self->{CHOICE_FUNC};
     my $valueFunc = $self->{VALUE_FUNC};      my $valueFunc = $self->{VALUE_FUNC};
     my $mapUrl = $self->{MAP_URL};  
     my $multichoice = $self->{'multichoice'};      my $multichoice = $self->{'multichoice'};
   
       # Evaluate the map url as needed
       my $mapUrl;
       if ($self->{EVAL_MAP_URL}) {
    my $mapUrlFunc = eval('sub { my $helper = shift; my $state = shift; ' . 
       $self->{MAP_URL} . '}');
    $mapUrl = &$mapUrlFunc($helper, $self);
       } else {
    $mapUrl = $self->{MAP_URL};
       }
   
     # Create the composite function that renders the column on the nav map      # Create the composite function that renders the column on the nav map
     # have to admit any language that lets me do this can't be all bad      # have to admit any language that lets me do this can't be all bad
     #  - Jeremy (Pythonista) ;-)      #  - Jeremy (Pythonista) ;-)
Line 1890  BUTTONS Line 1970  BUTTONS
  $checked = 1;   $checked = 1;
     }      }
             $col .= "value='" .               $col .= "value='" . 
                 HTML::Entities::encode(&$valueFunc($resource))                   HTML::Entities::encode(&$valueFunc($resource),'<>&"') 
                 . "' /></td>";                  . "' /></td>";
             return $col;              return $col;
         }          }
Line 1907  BUTTONS Line 1987  BUTTONS
                                        'showParts' => 0,                                         'showParts' => 0,
                                        'filterFunc' => $filterFunc,                                         'filterFunc' => $filterFunc,
                                        'resource_no_folder_link' => 1,                                         'resource_no_folder_link' => 1,
          'closeAllPages' => $self->{'closeallpages'},
                                        'suppressEmptySequences' => $self->{'suppressEmptySequences'},                                         'suppressEmptySequences' => $self->{'suppressEmptySequences'},
                                        'iterator_map' => $mapUrl }                                         'iterator_map' => $mapUrl }
                                        );                                         );
Line 1942  package Apache::lonhelper::student; Line 2023  package Apache::lonhelper::student;
 Student elements display a choice of students enrolled in the current  Student elements display a choice of students enrolled in the current
 course. Currently it is primitive; this is expected to evolve later.  course. Currently it is primitive; this is expected to evolve later.
   
 Student elements take three attributes: "variable", which means what  Student elements take the following attributes: 
 it usually does, "multichoice", which if true allows the user  
 to select multiple students, and "coursepersonnel" which if true   =over 4
 adds the course personnel to the top of the student selection.  
   =item * B<variable>: 
   
   Does what it usually does: declare which helper variable to put the
   result in.
   
   =item * B<multichoice>: 
   
   If true allows the user to select multiple students. Defaults to false.
   
   =item * B<coursepersonnel>: 
   
   If true adds the course personnel to the top of the student
   selection. Defaults to false.
   
   =item * B<activeonly>:
   
   If true, only active students and course personnel will be
   shown. Defaults to false.
   
   =back
   
 =cut  =cut
   
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal;
   
   
 BEGIN {  BEGIN {
Line 1976  sub start_student { Line 2077  sub start_student {
     $helper->declareVar($paramHash->{'variable'});      $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};      $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
     $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'};      $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'};
       $paramHash->{'sctiveonly'} = $token->[2]{'activeonly'};
     if (defined($token->[2]{'nextstate'})) {      if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};          $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
     }      }
Line 2008  sub render { Line 2110  sub render {
             }              }
         }          }
     }      }
       function checksec(value) {
    for (i=0; i<document.forms.helpform.elements.length; i++) {
       comp = document.forms.helpform.elements.chksec.value;
               if (document.forms.helpform.elements[i].value.indexOf(':'+comp+':') != -1) {
                   document.forms.helpform.elements[i].checked=value;
               }
           }
       }
       function checkactive() {
    for (i=0; i<document.forms.helpform.elements.length; i++) {
               if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) {
                   document.forms.helpform.elements[i].checked=true;
               }
           }
       }
 </script>  </script>
 SCRIPT  SCRIPT
   
           my %lt=&Apache::lonlocal::texthash(
                       'ocs'  => "Select Only Current Students",
                       'sas'  => "Select All Students",
                       'uas'  => "Unselect All Students",
                       'sfsg' => "Select for Section/Group",
       'ufsg' => "Unselect for Section/Group");
    
         $buttons = <<BUTTONS;          $buttons = <<BUTTONS;
 <br />  <br />
 <input type="button" onclick="checkall(true, '$var')" value="Select All Students" />  <input type="button" onclick="checkactive()" value="$lt{'ocs'}" />
 <input type="button" onclick="checkall(false, '$var')" value="Unselect All Students" />  <input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" />
   <input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" />
   <input type="button" onclick="checksec(true)" value="$lt{'sfsg'}">
   <input type="text" size="5" name="chksec">&nbsp;
   <input type="button" onclick="checksec(false)" value="$lt{'ufsg'}">
 <br />  <br />
 BUTTONS  BUTTONS
     }      }
Line 2048  BUTTONS Line 2177  BUTTONS
     # Constants      # Constants
     my $section = Apache::loncoursedata::CL_SECTION();      my $section = Apache::loncoursedata::CL_SECTION();
     my $fullname = Apache::loncoursedata::CL_FULLNAME();      my $fullname = Apache::loncoursedata::CL_FULLNAME();
       my $status = Apache::loncoursedata::CL_STATUS();
   
     # Load up the students      # Load up the students
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
Line 2062  BUTTONS Line 2192  BUTTONS
   
     # username, fullname, section, type      # username, fullname, section, type
     for (@keys) {      for (@keys) {
  push @$choices, [$_, $classlist->{$_}->[$fullname],    # Filter out inactive students if we've set "activeonly"
  $classlist->{$_}->[$section], 'Student'];   if (!$self->{'activeonly'} || $classlist->{$_}->[$status] eq
       'Active') {
       push @$choices, [$_, $classlist->{$_}->[$fullname], 
        $classlist->{$_}->[$section],
        $classlist->{$_}->[$status], 'Student'];
    }
     }      }
   
     my $name = $self->{'coursepersonnel'} ? 'Name' : 'Student Name';      my $name = $self->{'coursepersonnel'} ? &mt('Name') : &mt('Student Name');
       &Apache::lonnet::logthis("THE NAME IS >$name<");
     my $type = 'radio';      my $type = 'radio';
     if ($self->{'multichoice'}) { $type = 'checkbox'; }      if ($self->{'multichoice'}) { $type = 'checkbox'; }
     $result .= "<table cellspacing='2' cellpadding='2' border='0'>\n";      $result .= "<table cellspacing='2' cellpadding='2' border='0'>\n";
     $result .= "<tr><td></td><td align='center'><b>$name</b></td>".      $result .= "<tr><td></td><td align='center'><b>$name</b></td>".
         "<td align='center'><b>Section</b></td>" .           "<td align='center'><b>" . &mt('Section') . "</b></td>" . 
  "<td align='center'><b>Role</b></td></tr>";   "<td align='center'><b>".&mt('Status')."</b></td>" . 
    "<td align='center'><b>" . &mt("Role") . "</b></td>" .
    "<td align='center'><b>".&mt('Username').":".&mt('Domain')."</b></td></tr>";
   
     my $checked = 0;      my $checked = 0;
     for my $choice (@$choices) {      for my $choice (@$choices) {
Line 2084  BUTTONS Line 2222  BUTTONS
             $checked = 1;              $checked = 1;
         }          }
         $result .=          $result .=
             " value='" . HTML::Entities::encode($choice->[0] . ':' . $choice->[2])              " value='" . HTML::Entities::encode($choice->[0] . ':' . $choice->[2] . ':' . $choice->[1] . ':' . $choice->[3],'<>&"')
             . "' /></td><td>"              . "' /></td><td>"
             . HTML::Entities::encode($choice->[1])              . HTML::Entities::encode($choice->[1],'<>&"')
             . "</td><td align='center'>"               . "</td><td align='center'>" 
             . HTML::Entities::encode($choice->[2])              . HTML::Entities::encode($choice->[2],'<>&"')
               . "</td>\n<td>" 
       . HTML::Entities::encode($choice->[3],'<>&"')
             . "</td>\n<td>"               . "</td>\n<td>" 
     . HTML::Entities::encode($choice->[3]) . "</td></tr>\n";      . HTML::Entities::encode($choice->[4],'<>&"')
               . "</td>\n<td>" 
       . HTML::Entities::encode($choice->[0],'<>&"')
       . "</td></tr>\n";
     }      }
   
     $result .= "</table>\n\n";      $result .= "</table>\n\n";
Line 2104  sub postprocess { Line 2247  sub postprocess {
   
     my $result = $ENV{'form.' . $self->{'variable'} . '.forminput'};      my $result = $ENV{'form.' . $self->{'variable'} . '.forminput'};
     if (!$result) {      if (!$result) {
         $self->{ERROR_MSG} = 'You must choose at least one student '.          $self->{ERROR_MSG} = 
             'to continue.';      &mt('You must choose at least one student to continue.');
         return 0;          return 0;
     }      }
   
Line 2171  viewing the files. Line 2314  viewing the files.
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal;
   
 use Apache::lonpubdir; # for getTitleString  use Apache::lonpubdir; # for getTitleString
   
Line 2289  sub render { Line 2433  sub render {
     }      }
 </script>  </script>
 SCRIPT  SCRIPT
         $buttons = <<BUTTONS;         my %lt=&Apache::lonlocal::texthash(
    'saf'  => "Select All Files",
           'uaf'  => "Unselect All Files");
          $buttons = <<BUTTONS;
 <br /> &nbsp;  <br /> &nbsp;
 <input type="button" onclick="checkall(true, '$var')" value="Select All Files" />  <input type="button" onclick="checkall(true, '$var')" value="$lt{'saf'}" />
 <input type="button" onclick="checkall(false, '$var')" value="Unselect All Files" />  <input type="button" onclick="checkall(false, '$var')" value="$lt{'uaf'}" />
 BUTTONS  BUTTONS
   
          %lt=&Apache::lonlocal::texthash(
    'sap'  => "Select All Published",
           'uap'  => "Unselect All Published");
         if ($helper->{VARS}->{'construction'}) {          if ($helper->{VARS}->{'construction'}) {
             $buttons .= <<BUTTONS;         $buttons .= <<BUTTONS;
 <input type="button" onclick="checkallclass(true, 'Published')" value="Select All Published" />  <input type="button" onclick="checkallclass(true, 'Published')" value="$lt{'sap'}" />
 <input type="button" onclick="checkallclass(false, 'Published')" value="Unselect All Published" />  <input type="button" onclick="checkallclass(false, 'Published')" value="$lt{'uap'}" />
 <br /> &nbsp;  <br /> &nbsp;
 BUTTONS  BUTTONS
        }         }
Line 2308  BUTTONS Line 2458  BUTTONS
     my @fileList;      my @fileList;
   
     # If the subdirectory is in local CSTR space      # If the subdirectory is in local CSTR space
     if ($subdir =~ m|/home/([^/]+)/public_html|) {      my $metadir;
       if ($subdir =~ m|/home/([^/]+)/public_html/(.*)|) {
         my $user = $1;          my $user = $1;
         my $domain = $Apache::lonnet::perlvar{'lonDefDomain'};          my $domain = $Apache::lonnet::perlvar{'lonDefDomain'};
    $metadir='/res/'.$domain.'/'.$user.'/'.$2;
           @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, '');
       } elsif ($subdir =~ m|^~([^/]+)/(.*)$|) {
    $subdir='/home/'.$1.'/public_html/'.$2;
           my $user = $1;
           my $domain = $Apache::lonnet::perlvar{'lonDefDomain'};
    $metadir='/res/'.$domain.'/'.$user.'/'.$2;
         @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, '');          @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, '');
     } else {      } else {
         # local library server resource space          # local library server resource space
Line 2349  BUTTONS Line 2507  BUTTONS
     }      }
   
             # Get the title              # Get the title
             my $title = Apache::lonpubdir::getTitleString($fileName);              my $title = Apache::lonpubdir::getTitleString(($metadir?$metadir:$subdir) .'/'. $file);
   
             # Netscape 4 is stupid and there's nowhere to put the              # Netscape 4 is stupid and there's nowhere to put the
             # information on the input tag that the file is Published,              # information on the input tag that the file is Published,
Line 2372  BUTTONS Line 2530  BUTTONS
             }              }
             $result .= '<tr><td align="right"' . " bgcolor='$color'>" .              $result .= '<tr><td align="right"' . " bgcolor='$color'>" .
                 "<input $onclick type='$type' name='" . $var                  "<input $onclick type='$type' name='" . $var
             . ".forminput' value='" . HTML::Entities::encode($fileName) .              . ".forminput' value='" . HTML::Entities::encode($fileName,'<>&"').
                 "'";                  "'";
             if (!$self->{'multichoice'} && $choices == 0) {              if (!$self->{'multichoice'} && $choices == 0) {
                 $result .= ' checked';                  $result .= ' checked';
Line 2387  BUTTONS Line 2545  BUTTONS
     $result .= "</table>\n";      $result .= "</table>\n";
   
     if (!$choices) {      if (!$choices) {
         $result .= '<font color="#FF0000">There are no files available to select in this directory. Please go back and select another option.</font><br /><br />';          $result .= '<font color="#FF0000">There are no files available to select in this directory ('.$subdir.'). Please go back and select another option.</font><br /><br />';
     }      }
   
     $result .= $buttons;      $result .= $buttons;
Line 2781  the old values taking effect. Line 2939  the old values taking effect.
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   use Apache::lonlocal;
 BEGIN {  BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::final',      &Apache::lonhelper::register('Apache::lonhelper::final',
                                  ('final', 'exitpage'));                                   ('final', 'exitpage'));
Line 2866  sub render { Line 3024  sub render {
  }   }
   
  if (!@results) {   if (!@results) {
     $result .= '    <li>No changes were made to current settings.</li>';      $result .= '    <li>' . 
    &mt('No changes were made to current settings.') . '</li>';
  }   }
   
  $result .= '</ul>';   $result .= '</ul>';
Line 2874  sub render { Line 3033  sub render {
   
     if ($self->{'restartCourse'}) {      if ($self->{'restartCourse'}) {
  my $targetURL = '/adm/menu';   my $targetURL = '/adm/menu';
    if ($ENV{'course.'.$ENV{'request.course.id'}.'.url'}=~/^uploaded/) {
       $targetURL = '/adm/coursedocs';
    } else {
       $targetURL = '/adm/navmaps';
    }
  if ($ENV{'course.'.$ENV{'request.course.id'}.'.clonedfrom'}) {   if ($ENV{'course.'.$ENV{'request.course.id'}.'.clonedfrom'}) {
     $targetURL = '/adm/parmset?overview=1';      $targetURL = '/adm/parmset?overview=1';
  }   }
    my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
    my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');
         $result .= "<center>\n" .          $result .= "<center>\n" .
             "<form action='/adm/roles' method='post' target='loncapaclient'>\n" .              "<form action='/adm/roles' method='post' target='loncapaclient'>\n" .
             "<input type='button' onclick='history.go(-1)' value='&lt;- Previous' />" .              "<input type='button' onclick='history.go(-1)' value='$previous' />" .
             "<input type='hidden' name='orgurl' value='$targetURL' />" .              "<input type='hidden' name='orgurl' value='$targetURL' />" .
             "<input type='hidden' name='selectrole' value='1' />\n" .              "<input type='hidden' name='selectrole' value='1' />\n" .
             "<input type='hidden' name='" . $ENV{'request.role'} .               "<input type='hidden' name='" . $ENV{'request.role'} . 
             "' value='1' />\n<input type='submit' value='Finish Course Initialization' />\n" .              "' value='1' />\n<input type='submit' value='" .
       &mt('Finish Course Initialization') . "' />\n" .
             "</form></center>";              "</form></center>";
     }      }
   
Line 2907  package Apache::lonhelper::parmwizfinal; Line 3074  package Apache::lonhelper::parmwizfinal;
 no strict;  no strict;
 @ISA = ('Apache::lonhelper::element');  @ISA = ('Apache::lonhelper::element');
 use strict;  use strict;
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::parmwizfinal',      &Apache::lonhelper::register('Apache::lonhelper::parmwizfinal',
Line 2937  sub render { Line 3105  sub render {
     my $vars = $helper->{VARS};      my $vars = $helper->{VARS};
   
     # FIXME: Unify my designators with the standard ones      # FIXME: Unify my designators with the standard ones
     my %dateTypeHash = ('open_date' => "Opening Date",      my %dateTypeHash = ('open_date' => "opening date",
                         'due_date' => "Due Date",                          'due_date' => "due date",
                         'answer_date' => "Answer Date",                          'answer_date' => "answer date",
  'tries' => 'Number of Tries'   'tries' => 'number of tries',
    'weight' => 'problem weight'
  );   );
     my %parmTypeHash = ('open_date' => "0_opendate",      my %parmTypeHash = ('open_date' => "0_opendate",
                         'due_date' => "0_duedate",                          'due_date' => "0_duedate",
                         'answer_date' => "0_answerdate",                          'answer_date' => "0_answerdate",
  'tries' => '0_maxtries' );   'tries' => '0_maxtries',
    'weight' => '0_weight' );
           
     my $affectedResourceId = "";      my $affectedResourceId = "";
     my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}};      my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}};
Line 2984  sub render { Line 3154  sub render {
     }      }
   
     my $result = "<form name='helpform' method='get' action='/adm/parmset#$affectedResourceId&$parm_name&$level'>\n";      my $result = "<form name='helpform' method='get' action='/adm/parmset#$affectedResourceId&$parm_name&$level'>\n";
     $result .= '<p>Confirm that this information is correct, then click &quot;Finish Wizard&quot; to complete setting the parameter.<ul>';      $result .= '<p>'.&mt('Confirm that this information is correct, then click &quot;Finish Helper&quot; to complete setting the parameter.').'<ul>';
           
     # Print the type of manipulation:      # Print the type of manipulation:
     $result .= '<li>Setting the <b>' . $dateTypeHash{$vars->{ACTION_TYPE}} . '</b>';      $result .= '<li>'.&mt('Setting the').' <b>' . &mt($dateTypeHash{$vars->{ACTION_TYPE}}) . '</b>';
     if ($vars->{ACTION_TYPE} eq 'tries') {      if ($vars->{ACTION_TYPE} eq 'tries') {
  $result .= ' to <b>' . $vars->{TRIES} . '</b>';   $result .= ' '.&mt('to').' <b>' . $vars->{TRIES} . '</b>';
       }
       if ($vars->{ACTION_TYPE} eq 'weight') {
    $result .= ' '.&mt('to').' <b>' . $vars->{WEIGHT} . '</b>';
     }      }
     $result .= "</li>\n";      $result .= "</li>\n";
     if ($vars->{ACTION_TYPE} eq 'due_date' ||       if ($vars->{ACTION_TYPE} eq 'due_date' || 
Line 3011  sub render { Line 3184  sub render {
     } elsif ($vars->{ACTION_TYPE} eq 'tries') {      } elsif ($vars->{ACTION_TYPE} eq 'tries') {
  $result .= "<input type='hidden' name='pres_value' " .   $result .= "<input type='hidden' name='pres_value' " .
     "value='" . $vars->{TRIES} . "' />\n";      "value='" . $vars->{TRIES} . "' />\n";
       } elsif ($vars->{ACTION_TYPE} eq 'weight') {
    $result .= "<input type='hidden' name='pres_value' " .
       "value='" . $vars->{WEIGHT} . "' />\n";
     }      }
   
     $result .= $resourceString;      $result .= $resourceString;
           
     # Print targets      # Print targets
     if ($vars->{TARGETS} eq 'course') {      if ($vars->{TARGETS} eq 'course') {
         $result .= '<li>for <b>all students in course</b></li>';          $result .= '<li>'.&mt('for').' <b>'.&mt('all students in course').'</b></li>';
     } elsif ($vars->{TARGETS} eq 'section') {      } elsif ($vars->{TARGETS} eq 'section') {
         my $section = $vars->{SECTION_NAME};          my $section = $vars->{SECTION_NAME};
         $result .= "<li>for section <b>$section</b></li>";          $result .= "<li>for section <b>$section</b></li>";
         $level -= 3;          $level -= 3;
         $result .= "<input type='hidden' name='csec' value='" .          $result .= "<input type='hidden' name='csec' value='" .
             HTML::Entities::encode($section) . "' />\n";              HTML::Entities::encode($section,'<>&"') . "' />\n";
     } else {      } else {
         # FIXME: This is probably wasteful! Store the name!          # FIXME: This is probably wasteful! Store the name!
         my $classlist = Apache::loncoursedata::get_classlist();          my $classlist = Apache::loncoursedata::get_classlist();
Line 3035  sub render { Line 3211  sub render {
         $level -= 6;          $level -= 6;
         my ($uname, $udom) = split /:/, $vars->{USER_NAME};          my ($uname, $udom) = split /:/, $vars->{USER_NAME};
         $result .= "<input type='hidden' name='uname' value='".          $result .= "<input type='hidden' name='uname' value='".
             HTML::Entities::encode($uname) . "' />\n";              HTML::Entities::encode($uname,'<>&"') . "' />\n";
         $result .= "<input type='hidden' name='udom' value='".          $result .= "<input type='hidden' name='udom' value='".
             HTML::Entities::encode($udom) . "' />\n";              HTML::Entities::encode($udom,'<>&"') . "' />\n";
     }      }
   
     # Print value      # Print value
     if ($vars->{ACTION_TYPE} ne 'tries') {      if ($vars->{ACTION_TYPE} ne 'tries' && $vars->{ACTION_TYPE} ne 'weight') {
  $result .= "<li>to <b>" . ctime($vars->{PARM_DATE}) . "</b> (" .   $result .= "<li>to <b>" . ctime($vars->{PARM_DATE}) . "</b> (" .
     Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE})       Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}) 
     . ")</li>\n";      . ")</li>\n";
Line 3057  sub render { Line 3233  sub render {
     $result .= "\n<input type='hidden' value='$symb' name='pssymb' />";      $result .= "\n<input type='hidden' value='$symb' name='pssymb' />";
     $result .= "\n<input type='hidden' value='$paramlevel' name='parmlev' />";      $result .= "\n<input type='hidden' value='$paramlevel' name='parmlev' />";
   
     $result .= "<br /><br /><center><input type='submit' value='Finish Helper' /></center></form>\n";      $result .= "<br /><br /><center><input type='submit' value='".&mt('Finish Helper')."' /></center></form>\n";
   
     return $result;      return $result;
 }  }

Removed from v.1.46  
changed lines
  Added in v.1.71


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