--- loncom/interface/lonselstudent.pm	2006/05/15 22:01:12	1.2
+++ loncom/interface/lonselstudent.pm	2008/11/04 03:25:53	1.13
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # lonselstudent.pm : Reusable subs for student selection.
 #
-# $Id: lonselstudent.pm,v 1.2 2006/05/15 22:01:12 foxr Exp $
+# $Id: lonselstudent.pm,v 1.13 2008/11/04 03:25:53 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,15 +28,23 @@
 
 package Apache::lonselstudent;
 use     Apache::lonnet;
-use     Apache::loncoursedata;
-use     HTML::Entities;
+use     Apache::lonlocal;
+use     Apache::loncoursedata();
+use     HTML::Entities();
 
 #
 #  Utility function used when rendering <student> tags.
 #  This function produces a list references to four
 #  arrays:
 #    (\@course_personel, \@current_members, \@expired_members, \@future_members)
-#  
+#
+#
+# Parameters;
+#
+#  restrict           - Optional.. if present and defined should be a section name.
+#                       The *_members arrays will then only contain people
+#                       in that section
+#
 # Where:
 #    course_personnel - Each element of this array is itself a reference to an array
 #                      containing information about a member of the course staff.
@@ -66,25 +74,25 @@ use     HTML::Entities;
 #       [4]    username:domain of the user.
 #
 sub get_people_in_class {
+    my ($section_restriction) = @_;
     my %coursepersonnel = &Apache::lonnet::get_course_adv_roles();
     #
     #  Enumerate the course_personnel.
     #
     my @course_personnel;
-    for (sort keys %coursepersonnel) {
-	for my $role (split /,/, $coursepersonnel{$_}) {
-	    # extract the names so we can sort them
-	    my @people;
-	    
-	    for (split /,/, $role) {
-		push @people, [split /:/, $role];
-	    }
-	    
-	    @people = sort { $a->[0] cmp $b->[0] } @people;
+    for my $role (sort(keys(%coursepersonnel))) {
+	# extract the names so we can sort them
+	my @people;
+	for my $person (split(/,/, $coursepersonnel{$role})) {
+	    my ($uname,$domain) = split(/:/, $person);
+	    push(@people, [&Apache::loncommon::plainname($uname,$domain),
+			   $uname,$domain]);
+	}
+	@people = sort { $a->[0] cmp $b->[0] } (@people);
 	    
-	    for my $person (@people) {
-		push @course_personnel, [join(':', @$person), $person->[0], '', $_];
-	    }
+	for my $person (@people) {
+	    push(@course_personnel, [join(':', $person->[1],$person->[2]), 
+				     $person->[0], '', '', $role]);
 	}
     }
     #  Students must be split into the three categories:
@@ -102,41 +110,43 @@ sub get_people_in_class {
 
 
     my $classlist = &Apache::loncoursedata::get_classlist();
-    my @keys = keys %{$classlist};
-    # Sort by: Section, name
+    my @keys = keys(%{$classlist});
+    # Sort by: fullname, username
     @keys = sort {
-        if ($classlist->{$a}->[$section] ne $classlist->{$b}->[$section]) {
-            return $classlist->{$a}->[$section] cmp $classlist->{$b}->[$section];
-        }
-        return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname];
-    } @keys;
+	lc($classlist->{$a}[$fullname]) cmp lc($classlist->{$b}[$fullname]) ||
+	lc($a) cmp lc($b)
+    } (@keys);
  
 
 
 
-    for (@keys) {
-
-	if ( $classlist->{$_}->[$status] eq
-	    'Active') {
-	    push @current_members, [$_, $classlist->{$_}->[$fullname], 
-			     $classlist->{$_}->[$section],
-			     $classlist->{$_}->[$status], 'Student'];
-	} else {
-	    #  Need to figure out if this user is future or
-	    #  Expired... If the start date is in the future
-	    #  the user is future...else expired.
+    for my $user (@keys) {
+	if (!$section_restriction || 
+	    ($section_restriction eq $classlist->{$user}->[$section])) {
 	    
-	    my $now = time;
-	    if ($classlist->{$_}->[$start_date] > $now) {
-		push @future_members, [$_, $classlist->{$_}->[$fullname],
-					$classlist->{$_}->[$section],
-					"Future", "Student"];
+	    if ( $classlist->{$user}->[$status] eq
+		 'Active') {
+		push(@current_members, [$user, $classlist->{$user}->[$fullname], 
+					$classlist->{$user}->[$section],
+					$classlist->{$user}->[$status], 'Student']);
 	    } else {
-		push @expired_members, [$_, $classlist->{$_}->[$fullname],
-					$classlist->{$_}->[$section],
-					"Expired", "Student"];
+		#  Need to figure out if this user is future or
+		#  Expired... If the start date is in the future
+		#  the user is future...else expired.
+		
+		my $now = time;
+		if ($classlist->{$user}->[$start_date] > $now) {
+		    push(@future_members, [$user, $classlist->{$user}->[$fullname],
+					   $classlist->{$user}->[$section],
+					   "Future", "Student"]);
+		} else {
+		    push(@expired_members, [$user,
+					    $classlist->{$user}->[$fullname],
+					    $classlist->{$user}->[$section],
+					    "Expired", "Student"]);
+		}
+		
 	    }
-
 	}
     }
     return (\@course_personnel, 
@@ -168,15 +178,20 @@ sub get_people_in_class {
 #                     This should be true for the first call for a page
 #                     and false for all other calls... only matters if
 #                     multiselect is true.
+#     $context      - If email, do not include <br /><hr /> tags at the end
+#                     of the data table. 
 #  Returns:
 #     HTML  text to add to the rendering of the helper.
 #
 sub render_student_list {
     my ($students, $formname, $formprefix, $defaultusers,
-	$multiselect, $resultname, $javascript) = @_;
+	$multiselect, $resultname, $javascript, $context) = @_;
 
     my $result = "";
 
+    # no students so no output
+    return if (!@$students);
+
     if ($javascript && $multiselect) {
         $result .= <<SCRIPT;
 <script type="text/javascript">
@@ -258,12 +273,12 @@ sub render_student_list {
 	if (elem != null) {
 	    for (k = 0; k < elem.length; k++) {
 		if (elem.options[k].selected) {
-		    what = elem.options[k].text;
-		    if (what == 'All Students') {
+		    what = elem.options[k].value;
+		    if (what == 'allstudents') {
 			setAllStudents(value, which);
-		    } else if (what == 'All Course Personnel') {
+		    } else if (what == 'allpersonnel') {
 			setAllCoursePersonnel(value, which);
-		    } else if (what == 'No Section') {
+		    } else if (what == 'nosection') {
 			setSection('',value, which);
 		    } else {
 			setSection(what, value, which);
@@ -310,18 +325,18 @@ SCRIPT
 	}
 	$result .= '<select multiple name="'.$formprefix
 	    .'.chosensections" size="'.$size.'">'."\n";
-	$result .= '<option name="allstudents">All Students</option>';
-	$result .= '<option name="allpersonnel">All Course Personnel</option>';
-	$result .= '<option name="nosection">No Section</option>';
+	$result .= '<option value="allstudents">'.&mt('All Students').'</option>';
+	$result .= '<option value="allpersonnel">'.&mt('All Course Personnel').'</option>';
+	$result .= '<option value="nosection">'.&mt('No Section').'</option>';
 	$result .= "\n";
 	foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
 	    $result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n";
 	}
-	$result .= '</td><td valign="top">';
-	$result .= '<input type="button" name="'.$formprefix.'.select" value="Select" onclick='
+	$result .= '</select></td><td valign="top">';
+	$result .= '<input type="button" name="'.$formprefix.'.select" value="'.&mt('Select').'" onclick='
 	    ."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>';
 	$result .= '<td valign="top"><input type="button" name="'.$formprefix
-	    .'.unselect" value="Unselect"  onclick='.
+	    .'.unselect" value="'.&mt('Unselect').'"  onclick='.
 	    "'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>';
     }
 
@@ -330,12 +345,14 @@ SCRIPT
     #  True -> checkboxes.
     #  False -> radiobuttons.
 
-    $result .= "<table border=\"2\">\n";
-    $result .= '<tr><th></th><th align="center">Name</th>'."\n";
-    $result .= '    <th align="center">Section</th>'."\n";
-    $result .= '    <th align="center">Status</th>'."\n";
-    $result .= '    <th align="center">Role</th>'."\n";
-    $result .= '    <th align="center">Username : Domain</th></tr>'."\n";
+    $result .= &Apache::loncommon::start_data_table();
+    $result .= &Apache::loncommon::start_data_table_header_row();
+    $result .= '<th></th><th>'.&mt('Name').'</th>'."\n";
+    $result .= '    <th>'.&mt('Section').'</th>'."\n";
+    $result .= '    <th>'.&mt('Status').'</th>'."\n";
+    $result .= '    <th>'.&mt('Role').'</th>'."\n";
+    $result .= '    <th>'.&mt('Username : Domain').'</th>'."\n";
+    $result .= &Apache::loncommon::end_data_table_header_row();
 
     my $input_type;
     if ($multiselect) {
@@ -346,13 +363,14 @@ SCRIPT
 
     my $checked = 0;
     for my $student (@$students) {
-	$result .= '<tr><td><input type="'.$input_type.'"  name="'.
-	    $resultname.".forminput".'"';
+	$result .= &Apache::loncommon::start_data_table_row().
+	    '<td><input type="'.$input_type.'"  name="'.
+	    $resultname."_forminput".'"';
 	my $user    = $student->[0];
 
 	# Figure out which students are checked by default...
 	
-	if(%$defaultusers) {
+	if (%$defaultusers) {
 	    if (exists ($defaultusers->{$user})) {
 		$result .= ' checked ="checked" ';
 		$checked = 1;
@@ -361,25 +379,29 @@ SCRIPT
 	    $result .= ' checked="checked" ';
 	    $checked = 1;	# First one for radio if no default specified.
 	}
-	$result .= ' value="'. HTML::Entities::encode($user .          ':'
-						      .$student->[2] . ':'
+	$result .= ' value="'.&HTML::Entities::encode($user .          ':'
+				 		      .$student->[2] . ':'
 						      .$student->[1] . ':'
 						      .$student->[3] . ':'
 						      .$student->[4] . ":"
 						      .$formprefix,   "<>&\"'")
 	    ."\" /></td><td>\n";
-	$result .= HTML::Entities::encode($student->[1], '<>&"')
+	$result .= &HTML::Entities::encode($student->[1], '<>&"')
 	        . '</td><td align="center" >'."\n";
-	$result .= HTML::Entities::encode($student->[2], '<>&"')
+	$result .= &HTML::Entities::encode($student->[2], '<>&"')
    	        . '</td><td align="center">'."\n";
-	$result .= HTML::Entities::encode($student->[3], '<>&"')
+	$result .= &HTML::Entities::encode($student->[3], '<>&"')
 	        . '</td><td align="center">'."\n";
-	$result .= HTML::Entities::encode($student->[4], '<>&"')
+	$result .= &HTML::Entities::encode($student->[4], '<>&"')
   	        . '</td><td align="center">'."\n";
-	$result .= HTML::Entities::encode($student->[0], '<>&"')
-	        . '</td></tr>'."\n";
+	$result .= &HTML::Entities::encode($student->[0], '<>&"')
+	        . '</td>'.&Apache::loncommon::end_data_table_row().
+		"\n";
+    }
+    $result .= &Apache::loncommon::end_data_table();
+    if ($context ne 'email') {
+	$result .= "<br /> <hr />\n";
     }
-    $result .=" </table> <br /> <hr />\n";
 
     return $result;
 }