--- loncom/interface/lonselstudent.pm	2006/05/15 22:01:12	1.2
+++ loncom/interface/lonselstudent.pm	2006/07/17 16:26:08	1.9
@@ -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.9 2006/07/17 16:26:08 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,7 +36,14 @@ use     HTML::Entities;
 #  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 +73,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 +109,44 @@ sub get_people_in_class {
 
 
     my $classlist = &Apache::loncoursedata::get_classlist();
-    my @keys = keys %{$classlist};
+    my @keys = keys(%{$classlist});
     # Sort by: Section, name
     @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}[$section])  cmp lc($classlist->{$b}[$section])  ||
+	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, 
@@ -177,6 +187,9 @@ sub render_student_list {
 
     my $result = "";
 
+    # no students so no output
+    return if (!@$students);
+
     if ($javascript && $multiselect) {
         $result .= <<SCRIPT;
 <script type="text/javascript">
@@ -330,12 +343,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>Name</th>'."\n";
+    $result .= '    <th>Section</th>'."\n";
+    $result .= '    <th>Status</th>'."\n";
+    $result .= '    <th>Role</th>'."\n";
+    $result .= '    <th>Username : Domain</th>'."\n";
+    $result .= &Apache::loncommon::end_data_table_header_row();
 
     my $input_type;
     if ($multiselect) {
@@ -346,13 +361,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 +377,27 @@ 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 .=" </table> <br /> <hr />\n";
+    $result .= &Apache::loncommon::end_data_table().
+	" <br /> <hr />\n";
 
     return $result;
 }