--- loncom/interface/lonhelper.pm	2003/09/05 16:15:54	1.45
+++ loncom/interface/lonhelper.pm	2004/08/12 05:44:36	1.85
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # .helper XML handler to implement the LON-CAPA helper
 #
-# $Id: lonhelper.pm,v 1.45 2003/09/05 16:15:54 bowersj2 Exp $
+# $Id: lonhelper.pm,v 1.85 2004/08/12 05:44:36 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -172,12 +172,20 @@ before parsing XML fragments and B<Apach
 when you are done. See lonprintout.pm for examples of this usage in the
 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
 
 package Apache::lonhelper;
 use Apache::Constants qw(:common);
 use Apache::File;
 use Apache::lonxml;
+use Apache::lonlocal;
 
 # Register all the tags with the helper, so the helper can 
 # push and pop them
@@ -222,7 +230,7 @@ my $paramHash;
 # 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->
 # 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->process()" line. Using the debugger, one could actually
 # see the two different $helper variables, as hashes at completely
@@ -255,21 +263,13 @@ sub real_handler {
 
 
     # 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'}) {
-        $r->content_type('text/xml');
+	&Apache::loncommon::content_type($r,'text/xml');
     } else {
-        $r->content_type('text/html');
+	&Apache::loncommon::content_type($r,'text/html');
     }
     $r->send_http_header;
+    return OK if $r->header_only;
     $r->rflush();
 
     # Discard result, we just want the objects that get created by the
@@ -359,9 +359,10 @@ sub end_state {
 package Apache::lonhelper::helper;
 
 use Digest::MD5 qw(md5_hex);
-use HTML::Entities;
+use HTML::Entities();
 use Apache::loncommon;
 use Apache::File;
+use Apache::lonlocal;
 
 sub new {
     my $proto = shift;
@@ -453,11 +454,11 @@ sub _saveVars {
     my $self = shift;
     my $result = "";
     $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="' .
         $self->{TOKEN} . "\" />\n";
     $result .= '<input type="hidden" name="RETURN_PAGE" value="' .
-        HTML::Entities::encode($self->{RETURN_PAGE}) . "\" />\n";
+        HTML::Entities::encode($self->{RETURN_PAGE},'<>&"') . "\" />\n";
 
     return $result;
 }
@@ -523,7 +524,7 @@ sub process {
     # 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 
     # 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}};
         $prevState->postprocess();
     }
@@ -574,13 +575,19 @@ sub display {
     }
 
     # Phase 4: Display.
-    my $stateTitle = $state->title();
-    my $bodytag = &Apache::loncommon::bodytag("$self->{TITLE}",'','');
+    my $stateTitle=&mt($state->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;
 <html>
     <head>
-        <title>LON-CAPA Helper: $self->{TITLE}</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <title>$loncapaHelper: $helperTitle</title>
     </head>
     $bodytag
 HEADER
@@ -607,12 +614,12 @@ HEADER
         }
         if ($self->{DONE}) {
             my $returnPage = $self->{RETURN_PAGE};
-            $result .= "<a href=\"$returnPage\">End Helper</a>";
+            $result .= "<a href=\"$returnPage\">" . &mt("End Helper") . "</a>";
         }
         else {
             $result .= '<nobr><input name="back" type="button" ';
-            $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';
-            $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';
+            $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
+            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
         }
     }
 
@@ -626,12 +633,12 @@ HEADER
         }
         if ($self->{DONE}) {
             my $returnPage = $self->{RETURN_PAGE};
-            $result .= "<a href=\"$returnPage\">End Helper</a>";
+            $result .= "<a href=\"$returnPage\">" . &mt('End Helper') . "</a>";
         }
         else {
             $result .= '<nobr><input name="back" type="button" ';
-            $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';
-            $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';
+            $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
+            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
         }
     }
 
@@ -883,6 +890,7 @@ sub start_defaultvalue {
 
 sub end_defaultvalue { return ''; }
 
+# Validators may need to take language specifications
 sub start_validator {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
 
@@ -926,7 +934,9 @@ package Apache::lonhelper::message;
 
 =pod
 
-=head1 Element: messageX<message, helper element>
+=head1 Elements
+
+=head2 Element: messageX<message, helper element>
 
 Message elements display their contents, and
 transition directly to the state in the <nextstate> attribute. Example:
@@ -950,11 +960,17 @@ within each other.)
 This is also a good template for creating your own new states, as it has
 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
 
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::message',
@@ -974,8 +990,8 @@ sub start_message {
         return '';
     }
 
-    $paramHash->{MESSAGE_TEXT} = &Apache::lonxml::get_all_text('/message',
-                                                               $parser);
+    $paramHash->{MESSAGE_TEXT} = &mtn(&Apache::lonxml::get_all_text('/message',
+                                                               $parser));
 
     if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
@@ -996,7 +1012,7 @@ sub end_message {
 sub render {
     my $self = shift;
 
-    return $self->{MESSAGE_TEXT};
+    return &mtn($self->{MESSAGE_TEXT});
 }
 # If a NEXTSTATE was given, switch to it
 sub postprocess {
@@ -1098,6 +1114,7 @@ tag is stored in the {VARS} hash.
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::choices',
@@ -1144,8 +1161,8 @@ sub start_choice {
     }
 
     my $computer = $token->[2]{'computer'};
-    my $human = &Apache::lonxml::get_all_text('/choice',
-                                              $parser);
+    my $human = &mt(&Apache::lonxml::get_all_text('/choice',
+                                              $parser));
     my $nextstate = $token->[2]{'nextstate'};
     my $evalFlag = $token->[2]{'eval'};
     push @{$paramHash->{CHOICES}}, [$human, $computer, $nextstate, 
@@ -1181,10 +1198,13 @@ SCRIPT
     # Only print "select all" and "unselect all" if there are five or
     # more choices; fewer then that and it looks silly.
     if ($self->{'multichoice'} && scalar(@{$self->{CHOICES}}) > 4) {
+        my %lt=&Apache::lonlocal::texthash(
+			'sa'  => "Select All",
+		        'ua'  => "Unselect All");
         $buttons = <<BUTTONS;
 <br />
-<input type="button" onclick="checkall(true, '$var')" value="Select All" />
-<input type="button" onclick="checkall(false, '$var')" value="Unselect All" />
+<input type="button" onclick="checkall(true, '$var')" value="$lt{'sa'}" />
+<input type="button" onclick="checkall(false, '$var')" value="$lt{'ua'}" />
 <br />&nbsp;
 BUTTONS
     }
@@ -1239,7 +1259,7 @@ BUTTONS
         $result .= "<tr>\n<td width='20'>&nbsp;</td>\n";
         $result .= "<td valign='top'><input type='$type' name='$var.forminput'"
             . "' value='" . 
-            HTML::Entities::encode($choice->[1]) 
+            HTML::Entities::encode($choice->[1],'<>&"') 
             . "'";
         if ($checkedChoices{$choice->[1]}) {
             $result .= " checked ";
@@ -1251,7 +1271,7 @@ BUTTONS
             $choiceLabel = eval($choiceLabel);
             $choiceLabel = &$choiceLabel($helper, $self);
         }
-        $result .= "/></td><td> " . $choiceLabel . "</td></tr>\n";
+        $result .= "/></td><td> " . &mtn($choiceLabel) . "</td></tr>\n";
     }
     $result .= "</table>\n\n\n";
     $result .= $buttons;
@@ -1266,8 +1286,8 @@ sub postprocess {
     my $chosenValue = $ENV{'form.' . $self->{'variable'} . '.forminput'};
 
     if (!defined($chosenValue) && !$self->{'allowempty'}) {
-        $self->{ERROR_MSG} = "You must choose one or more choices to" .
-            " continue.";
+        $self->{ERROR_MSG} = 
+	    &mt("You must choose one or more choices to continue.");
         return 0;
     }
 
@@ -1310,9 +1330,13 @@ the result is stored in.
 
 =cut
 
+# This really ought to be a sibling class to "choice" which is itself
+# a child of some abstract class.... *shrug*
+
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::dropdown',
@@ -1390,7 +1414,7 @@ sub render {
     $result .= "<select name='${var}.forminput'>\n";
     foreach my $choice (@{$self->{CHOICES}}) {
         $result .= "<option value='" . 
-            HTML::Entities::encode($choice->[1]) 
+            HTML::Entities::encode($choice->[1],'<>&"') 
             . "'";
         if ($checkedChoices{$choice->[1]}) {
             $result .= " selected";
@@ -1402,7 +1426,7 @@ sub render {
             $choiceLabel = eval($choiceLabel);
             $choiceLabel = &$choiceLabel($helper, $self);
         }
-        $result .= ">" . $choiceLabel . "\n";
+        $result .= ">" . &mtn($choiceLabel) . "\n";
     }
     $result .= "</select>\n";
 
@@ -1471,6 +1495,7 @@ Example:
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal; # A localization nightmare
 
 use Time::localtime;
 
@@ -1535,7 +1560,7 @@ sub render {
         } else {
             $result .= "<option value='$i'>";
         }
-        $result .= $months[$i] . "</option>\n";
+        $result .= &mt($months[$i]) . "</option>\n";
     }
     $result .= "</select>\n";
 
@@ -1565,25 +1590,28 @@ sub render {
 
     # Display Hours and Minutes if they are called for
     if ($self->{'hoursminutes'}) {
+	# This needs parameterization for times.
+	my $am = &mt('a.m.');
+	my $pm = &mt('p.m.');
         # Build hour
         $result .= "<select name='${var}hour'>\n";
         $result .= "<option " . ($date->hour == 0 ? 'selected ':'') .
-            " value='0'>midnight</option>\n";
+            " value='0'>" . &mt('midnight') . "</option>\n";
         for ($i = 1; $i < 12; $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 {
-                $result .= "<option value='$i'>$i a.m</option>\n";
+                $result .= "<option value='$i'>$i $am</option>\n";
             }
         }
         $result .= "<option " . ($date->hour == 12 ? 'selected ':'') .
-            " value='12'>noon</option>\n";
+            " value='12'>" . &mt('noon') . "</option>\n";
         for ($i = 13; $i < 24; $i++) {
             my $printedHour = $i - 12;
             if ($date->hour == $i) {
-                $result .= "<option selected value='$i'>$printedHour p.m.</option>\n";
+                $result .= "<option selected value='$i'>$printedHour $pm</option>\n";
             } else {
-                $result .= "<option value='$i'>$printedHour p.m.</option>\n";
+                $result .= "<option value='$i'>$printedHour $pm</option>\n";
             }
         }
 
@@ -1622,17 +1650,26 @@ sub postprocess {
         $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 
     # 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
-    # 3, depending on if it's a leapyear
+    # 3, depending on if it's a leap year
     my $checkDate = localtime($chosenDate);
 
-    if ($checkDate->mon != $month || $checkDate->mday != $day ||
+    if ($error || $checkDate->mon != $month || $checkDate->mday != $day ||
         $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 "
             . "date because it doesn't exist. Please enter a valid date.";
+
         return 0;
     }
 
@@ -1667,7 +1704,8 @@ resources in that sequence, or recurses
 to false. The "suppressEmptySequences" attribute reflects the 
 suppressEmptySequences argument to the render routine, which will cause
 folders that have all of their contained resources filtered out to also
-be filtered out.
+be filtered out. The 'addstatus' attribute, if true, will add the icon
+and long status display columns to the display.
 
 =head3 SUB-TAGS
 
@@ -1695,7 +1733,10 @@ be filtered out.
   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
-  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
 
@@ -1730,6 +1771,8 @@ sub start_resource {
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
     $paramHash->{'suppressEmptySequences'} = $token->[2]{'suppressEmptySequences'};
     $paramHash->{'toponly'} = $token->[2]{'toponly'};
+    $paramHash->{'addstatus'} = $token->[2]{'addstatus'};
+    $paramHash->{'closeallpages'} = $token->[2]{'closeallpages'};
     return '';
 }
 
@@ -1806,6 +1849,7 @@ sub start_mapurl {
 
     my $contents = Apache::lonxml::get_all_text('/mapurl',
                                                 $parser);
+    $paramHash->{EVAL_MAP_URL} = $token->[2]{'evaluate'};
     $paramHash->{MAP_URL} = $contents;
 }
 
@@ -1844,10 +1888,14 @@ sub render {
     }
 </script>
 SCRIPT
+        my %lt=&Apache::lonlocal::texthash(
+			'sar'  => "Select All Resources",
+		        'uar'  => "Unselect All Resources");
+
         $buttons = <<BUTTONS;
 <br /> &nbsp;
-<input type="button" onclick="checkall(true, '$var')" value="Select All Resources" />
-<input type="button" onclick="checkall(false, '$var')" value="Unselect All Resources" />
+<input type="button" onclick="checkall(true, '$var')" value="$lt{'sar'}" />
+<input type="button" onclick="checkall(false, '$var')" value="$lt{'uar'}" />
 <br /> &nbsp;
 BUTTONS
     }
@@ -1861,9 +1909,18 @@ BUTTONS
     my $filterFunc = $self->{FILTER_FUNC};
     my $choiceFunc = $self->{CHOICE_FUNC};
     my $valueFunc = $self->{VALUE_FUNC};
-    my $mapUrl = $self->{MAP_URL};
     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
     # have to admit any language that lets me do this can't be all bad
     #  - Jeremy (Pythonista) ;-)
@@ -1888,19 +1945,24 @@ BUTTONS
 		$checked = 1;
 	    }
             $col .= "value='" . 
-                HTML::Entities::encode(&$valueFunc($resource)) 
+                HTML::Entities::encode(&$valueFunc($resource),'<>&"') 
                 . "' /></td>";
             return $col;
         }
     };
 
     $ENV{'form.condition'} = !$self->{'toponly'};
+    my $cols = [$renderColFunc, Apache::lonnavmaps::resource()];
+    if ($self->{'addstatus'}) {
+	push @$cols, (Apache::lonnavmaps::part_status_summary());
+	
+    }
     $result .= 
-        &Apache::lonnavmaps::render( { 'cols' => [$renderColFunc, 
-                                                  Apache::lonnavmaps::resource()],
+        &Apache::lonnavmaps::render( { 'cols' => $cols,
                                        'showParts' => 0,
                                        'filterFunc' => $filterFunc,
                                        'resource_no_folder_link' => 1,
+				       'closeAllPages' => $self->{'closeallpages'},
                                        'suppressEmptySequences' => $self->{'suppressEmptySequences'},
                                        'iterator_map' => $mapUrl }
                                        );
@@ -1936,17 +1998,37 @@ package Apache::lonhelper::student;
 Student elements display a choice of students enrolled in the current
 course. Currently it is primitive; this is expected to evolve later.
 
-Student elements take three attributes: "variable", which means what
-it usually does, "multichoice", which if true allows the user
-to select multiple students, and "coursepersonnel" which if true 
-adds the course personnel to the top of the student selection.
+Student elements take the following attributes: 
+
+=over 4
+
+=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
 
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
-
+use Apache::lonlocal;
 
 
 BEGIN {
@@ -1970,6 +2052,7 @@ sub start_student {
     $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
     $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'};
+    $paramHash->{'sctiveonly'} = $token->[2]{'activeonly'};
     if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
     }
@@ -2002,12 +2085,50 @@ 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) {
+		if (document.forms.helpform.elements[i].value.indexOf(':Active') != -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;
+            } 
+        }
+    }
+    function uncheckexpired() {
+	for (i=0; i<document.forms.helpform.elements.length; i++) {
+            if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) {
+                document.forms.helpform.elements[i].checked=false;
+            } 
+        }
+    }
 </script>
 SCRIPT
+
+        my %lt=&Apache::lonlocal::texthash(
+                    'ocs'  => "Select Only Current Students",
+                    'ues'  => "Unselect Expired Students",
+                    'sas'  => "Select All Students",
+                    'uas'  => "Unselect All Students",
+                    'sfsg' => "Select Current Students for Section/Group",
+		    'ufsg' => "Unselect for Section/Group");
+ 
         $buttons = <<BUTTONS;
 <br />
-<input type="button" onclick="checkall(true, '$var')" value="Select All Students" />
-<input type="button" onclick="checkall(false, '$var')" value="Unselect All Students" />
+<input type="button" onclick="checkactive()" value="$lt{'ocs'}" />
+<input type="button" onclick="uncheckexpired()" value="$lt{'ues'}" /><br />
+<input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" />
+<input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" /><br />
+<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 />
 BUTTONS
     }
@@ -2042,6 +2163,7 @@ BUTTONS
     # Constants
     my $section = Apache::loncoursedata::CL_SECTION();
     my $fullname = Apache::loncoursedata::CL_FULLNAME();
+    my $status = Apache::loncoursedata::CL_STATUS();
 
     # Load up the students
     my $classlist = &Apache::loncoursedata::get_classlist();
@@ -2056,17 +2178,24 @@ BUTTONS
 
     # username, fullname, section, type
     for (@keys) {
-	push @$choices, [$_, $classlist->{$_}->[$fullname], 
-			 $classlist->{$_}->[$section], 'Student'];
+	# Filter out inactive students if we've set "activeonly"
+	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');
     my $type = 'radio';
     if ($self->{'multichoice'}) { $type = 'checkbox'; }
     $result .= "<table cellspacing='2' cellpadding='2' border='0'>\n";
     $result .= "<tr><td></td><td align='center'><b>$name</b></td>".
-        "<td align='center'><b>Section</b></td>" . 
-	"<td align='center'><b>Role</b></td></tr>";
+        "<td align='center'><b>" . &mt('Section') . "</b></td>" . 
+	"<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;
     for my $choice (@$choices) {
@@ -2078,13 +2207,18 @@ BUTTONS
             $checked = 1;
         }
         $result .=
-            " value='" . HTML::Entities::encode($choice->[0] . ':' . $choice->[2])
+            " value='" . HTML::Entities::encode($choice->[0] . ':' . $choice->[2] . ':' . $choice->[1] . ':' . $choice->[3],'<>&"')
             . "' /></td><td>"
-            . HTML::Entities::encode($choice->[1])
+            . HTML::Entities::encode($choice->[1],'<>&"')
             . "</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>" 
-	    . 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";
@@ -2098,8 +2232,8 @@ sub postprocess {
 
     my $result = $ENV{'form.' . $self->{'variable'} . '.forminput'};
     if (!$result) {
-        $self->{ERROR_MSG} = 'You must choose at least one student '.
-            'to continue.';
+        $self->{ERROR_MSG} = 
+	    &mt('You must choose at least one student to continue.');
         return 0;
     }
 
@@ -2165,6 +2299,7 @@ viewing the files.
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 use Apache::lonpubdir; # for getTitleString
 
@@ -2283,16 +2418,22 @@ sub render {
     }
 </script>
 SCRIPT
-        $buttons = <<BUTTONS;
+       my %lt=&Apache::lonlocal::texthash(
+			'saf'  => "Select All Files",
+		        'uaf'  => "Unselect All Files");
+       $buttons = <<BUTTONS;
 <br /> &nbsp;
-<input type="button" onclick="checkall(true, '$var')" value="Select All Files" />
-<input type="button" onclick="checkall(false, '$var')" value="Unselect All Files" />
+<input type="button" onclick="checkall(true, '$var')" value="$lt{'saf'}" />
+<input type="button" onclick="checkall(false, '$var')" value="$lt{'uaf'}" />
 BUTTONS
 
+       %lt=&Apache::lonlocal::texthash(
+			'sap'  => "Select All Published",
+		        'uap'  => "Unselect All Published");
         if ($helper->{VARS}->{'construction'}) {
-            $buttons .= <<BUTTONS;
-<input type="button" onclick="checkallclass(true, 'Published')" value="Select All Published" />
-<input type="button" onclick="checkallclass(false, 'Published')" value="Unselect All Published" />
+       $buttons .= <<BUTTONS;
+<input type="button" onclick="checkallclass(true, 'Published')" value="$lt{'sap'}" />
+<input type="button" onclick="checkallclass(false, 'Published')" value="$lt{'uap'}" />
 <br /> &nbsp;
 BUTTONS
        }
@@ -2302,9 +2443,17 @@ BUTTONS
     my @fileList;
 
     # 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 $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, '');
     } else {
         # local library server resource space
@@ -2312,7 +2461,7 @@ BUTTONS
     }
 
     # Sort the fileList into order
-    @fileList = sort @fileList;
+    @fileList = sort {lc($a) cmp lc($b)} @fileList;
 
     $result .= $buttons;
 
@@ -2343,7 +2492,7 @@ BUTTONS
 	    }
 
             # 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
             # information on the input tag that the file is Published,
@@ -2366,7 +2515,7 @@ BUTTONS
             }
             $result .= '<tr><td align="right"' . " bgcolor='$color'>" .
                 "<input $onclick type='$type' name='" . $var
-            . ".forminput' value='" . HTML::Entities::encode($fileName) .
+            . ".forminput' value='" . HTML::Entities::encode($fileName,'<>&"').
                 "'";
             if (!$self->{'multichoice'} && $choices == 0) {
                 $result .= ' checked';
@@ -2381,7 +2530,7 @@ BUTTONS
     $result .= "</table>\n";
 
     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;
@@ -2531,6 +2680,7 @@ string honors the validation function, i
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::string',
@@ -2649,6 +2799,8 @@ be able to call methods on it.
 
 =cut
 
+use Apache::lonlocal;
+
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::general',
                                  'exec', 'condition', 'clause',
@@ -2775,7 +2927,7 @@ the old values taking effect.
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
-
+use Apache::lonlocal;
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::final',
                                  ('final', 'exitpage'));
@@ -2860,7 +3012,8 @@ sub render {
 	}
 	
 	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>';
@@ -2868,16 +3021,24 @@ sub render {
 
     if ($self->{'restartCourse'}) {
 	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'}) {
 	    $targetURL = '/adm/parmset?overview=1';
 	}
+	my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
+	my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');
         $result .= "<center>\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='selectrole' value='1' />\n" .
             "<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>";
     }
 
@@ -2901,6 +3062,7 @@ package Apache::lonhelper::parmwizfinal;
 no strict;
 @ISA = ('Apache::lonhelper::element');
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::parmwizfinal',
@@ -2931,15 +3093,17 @@ sub render {
     my $vars = $helper->{VARS};
 
     # FIXME: Unify my designators with the standard ones
-    my %dateTypeHash = ('open_date' => "Opening Date",
-                        'due_date' => "Due Date",
-                        'answer_date' => "Answer Date",
-			'tries' => 'Number of Tries'
+    my %dateTypeHash = ('open_date' => "opening date",
+                        'due_date' => "due date",
+                        'answer_date' => "answer date",
+			'tries' => 'number of tries',
+			'weight' => 'problem weight'
 			);
     my %parmTypeHash = ('open_date' => "0_opendate",
                         'due_date' => "0_duedate",
                         'answer_date' => "0_answerdate",
-			'tries' => '0_maxtries' );
+			'tries' => '0_maxtries',
+			'weight' => '0_weight' );
     
     my $affectedResourceId = "";
     my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}};
@@ -2950,7 +3114,7 @@ sub render {
 
     # Print the granularity, depending on the action
     if ($vars->{GRANULARITY} eq 'whole_course') {
-        $resourceString .= '<li>for <b>all resources in the course</b></li>';
+        $resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>';
         $level = 9; # general course, see lonparmset.pm perldoc
         $affectedResourceId = "0.0";
         $symb = 'a';
@@ -2961,7 +3125,7 @@ sub render {
         my $title = $res->compTitle();
         $symb = $res->symb();
         $navmap->untieHashes();
-        $resourceString .= "<li>for the map named <b>$title</b></li>";
+        $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';
         $level = 8;
         $affectedResourceId = $vars->{RESOURCE_ID};
         $paramlevel = 'map';
@@ -2971,19 +3135,29 @@ sub render {
         $symb = $res->symb();
         my $title = $res->compTitle();
         $navmap->untieHashes();
-        $resourceString .= "<li>for the resource named <b>$title</b></li>";
+        $resourceString .= '<li>'.&mt('for the resource named [_1]',"<b>$title</b>").'</li>';
         $level = 7;
         $affectedResourceId = $vars->{RESOURCE_ID};
         $paramlevel = 'full';
     }
 
     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:
-    $result .= '<li>Setting the <b>' . $dateTypeHash{$vars->{ACTION_TYPE}} . '</b>';
+    my $extra;
     if ($vars->{ACTION_TYPE} eq 'tries') {
-	$result .= ' to <b>' . $vars->{TRIES} . '</b>';
+	$extra =  $vars->{TRIES};
+    }
+    if ($vars->{ACTION_TYPE} eq 'weight') {
+	$extra =  $vars->{WEIGHT};
+    }
+    $result .= "<li>";
+    my $what = &mt($dateTypeHash{$vars->{ACTION_TYPE}});
+    if ($extra) {
+	$result .= &mt('Setting the [_1] to [_2]',"<b>$what</b>",$extra);
+    } else {
+	$result .= &mt('Setting the [_1]',"<b>$what</b>");
     }
     $result .= "</li>\n";
     if ($vars->{ACTION_TYPE} eq 'due_date' || 
@@ -3005,19 +3179,22 @@ sub render {
     } elsif ($vars->{ACTION_TYPE} eq 'tries') {
 	$result .= "<input type='hidden' name='pres_value' " .
 	    "value='" . $vars->{TRIES} . "' />\n";
+    } elsif ($vars->{ACTION_TYPE} eq 'weight') {
+	$result .= "<input type='hidden' name='pres_value' " .
+	    "value='" . $vars->{WEIGHT} . "' />\n";
     }
 
     $result .= $resourceString;
     
     # Print targets
     if ($vars->{TARGETS} eq 'course') {
-        $result .= '<li>for <b>all students in course</b></li>';
+        $result .= '<li>'.&mt('for <b>all students in course</b>').'</li>';
     } elsif ($vars->{TARGETS} eq 'section') {
         my $section = $vars->{SECTION_NAME};
-        $result .= "<li>for section <b>$section</b></li>";
+        $result .= '<li>'.&mt('for section [_1]',"<b>$section</b>").'</li>';
         $level -= 3;
         $result .= "<input type='hidden' name='csec' value='" .
-            HTML::Entities::encode($section) . "' />\n";
+            HTML::Entities::encode($section,'<>&"') . "' />\n";
     } else {
         # FIXME: This is probably wasteful! Store the name!
         my $classlist = Apache::loncoursedata::get_classlist();
@@ -3025,20 +3202,18 @@ sub render {
         # Chop off everything after the last colon (section)
         $username = substr($username, 0, rindex($username, ':'));
         my $name = $classlist->{$username}->[6];
-        $result .= "<li>for <b>$name</b></li>";
+        $result .= '<li>'.&mt('for [_1]',"<b>$name</b>").'</li>';
         $level -= 6;
         my ($uname, $udom) = split /:/, $vars->{USER_NAME};
         $result .= "<input type='hidden' name='uname' value='".
-            HTML::Entities::encode($uname) . "' />\n";
+            HTML::Entities::encode($uname,'<>&"') . "' />\n";
         $result .= "<input type='hidden' name='udom' value='".
-            HTML::Entities::encode($udom) . "' />\n";
+            HTML::Entities::encode($udom,'<>&"') . "' />\n";
     }
 
     # Print value
-    if ($vars->{ACTION_TYPE} ne 'tries') {
-	$result .= "<li>to <b>" . ctime($vars->{PARM_DATE}) . "</b> (" .
-	    Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}) 
-	    . ")</li>\n";
+    if ($vars->{ACTION_TYPE} ne 'tries' && $vars->{ACTION_TYPE} ne 'weight') {
+	$result .= '<li>'.&mt('to [_1] ([_2])',"<b>".ctime($vars->{PARM_DATE})."</b>",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."</li>\n";
     }
  
     # print pres_marker
@@ -3051,7 +3226,7 @@ sub render {
     $result .= "\n<input type='hidden' value='$symb' name='pssymb' />";
     $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;
 }