[LON-CAPA-cvs] cvs: loncom /interface lonhelper.pm lonselstudent.pm

foxr lon-capa-cvs@mail.lon-capa.org
Thu, 11 May 2006 21:10:22 -0000


This is a MIME encoded message

--foxr1147381822
Content-Type: text/plain

foxr		Thu May 11 17:10:22 2006 EDT

  Added files:                 
    /loncom/interface	lonselstudent.pm 

  Modified files:              
    /loncom/interface	lonhelper.pm 
  Log:
  Separated the stuff to render student selection lists into a separate
  pacakge: lonselstudent.
  
  
--foxr1147381822
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20060511171022.txt"

Index: loncom/interface/lonhelper.pm
diff -u loncom/interface/lonhelper.pm:1.147 loncom/interface/lonhelper.pm:1.148
--- loncom/interface/lonhelper.pm:1.147	Tue May  9 18:43:19 2006
+++ loncom/interface/lonhelper.pm	Thu May 11 17:10:21 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # .helper XML handler to implement the LON-CAPA helper
 #
-# $Id: lonhelper.pm,v 1.147 2006/05/09 22:43:19 foxr Exp $
+# $Id: lonhelper.pm,v 1.148 2006/05/11 21:10:21 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -183,7 +183,7 @@
 use Apache::lonxml;
 use Apache::lonlocal;
 use Apache::lonnet;
-
+use Apache::lonselstudent;
 
 # Register all the tags with the helper, so the helper can 
 # push and pop them
@@ -2274,357 +2274,6 @@
 use strict;
 use Apache::lonlocal;
 use Apache::lonnet;
-#
-#  Utility function used when rendering <student> tags.
-#  This function produces a list references to four
-#  arrays:
-#    (\@course_personel, \@current_members, \@expired_members, \@future_members)
-#  
-# Where:
-#    course_personnel - Each element of this array is itself a reference to an array
-#                      containing information about a member of the course staff.
-#    current_members  - Each element of this array is itself a reference to an
-#                       array that contains information about current students in
-#                       the course.
-#    expired_members  - Each element of this array is itself a reference to an
-#                       array that contains information about students whose 
-#                       status has expired.
-#    future_members   - Each element of this arrya is itself a reference to an
-#                       array that contains information about students who will
-#                       become active at a future date.
-#
-#  Course personnel elements include:
-#       [0]    Last, First of the user.
-#       [1]    Role held by the user.
-#       [2]    Empty.
-#       [3]    Empty
-#       [4]    username:domain of the user.
-#
-#  Student member array elements are:
-#       [0]    Last, First of the user.
-#       [1]    Status of the user one of ("Active", "Future", or "Expired')
-#              depending on which array the user was put in.
-#       [2]    Section the student is in.
-#       [3]    Role of the member (student).
-#       [4]    username:domain of the user.
-#
-sub get_people_in_class {
-    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 $person (@people) {
-		push @course_personnel, [join(':', @$person), $person->[0], '', $_];
-	    }
-	}
-    }
-    #  Students must be split into the three categories:
-
-    my @current_members;
-    my @future_members;
-    my @expired_members;
-
-    #   Indices into the coures data elements.
-
-    my $section    = &Apache::loncoursedata::CL_SECTION();
-    my $fullname   = &Apache::loncoursedata::CL_FULLNAME();
-    my $status     = &Apache::loncoursedata::CL_STATUS();
-    my $start_date = &Apache::loncoursedata::CL_START();
-
-
-    my $classlist = &Apache::loncoursedata::get_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;
- 
-
-
-
-    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.
-	    
-	    my $now = time;
-	    if ($classlist->{$_}->[$start_date] > $now) {
-		push @future_members, [$_, $classlist->{$_}->[$fullname],
-					$classlist->{$_}->[$section],
-					"Future", "Student"];
-	    } else {
-		push @expired_members, [$_, $classlist->{$_}->[$fullname],
-					$classlist->{$_}->[$section],
-					"Expired", "Student"];
-	    }
-
-	}
-    }
-    return (\@course_personnel, 
-	    \@current_members,
-	    \@expired_members,
-	    \@future_members);
-
-}
-
-#
-#  Utility function used when rendering the <student> tag.
-#  This function renders a segment of course personel
-#  Personel are broken up by the helper into past, current and
-#  future...each one gets is own subpage of selection.
-#  This sub renders one of these pages.
-#  Parameters:
-#     $students    - Students in the section. (ref to array of references
-#                    to arrays).
-#     $formprefix  - form path prefix for form element names
-#                    This is used to make each form element
-#                    so that the segments having to do with each
-#                    set of students won't collide.
-#     $defaultusers - reference to a hash containng
-#                     the set of users that should be on or off.
-#     $multiselect  - True if multiselect allowed.
-#     $resultname   - Name of result variable.
-#     $javascript   - If true, the javascript to run this is output
-#                     This should be true for the first call for a page
-#                     and false for all other calls... only matters if
-#                     multiselect is true.
-#  Returns:
-#     HTML  text to add to the rendering of the helper.
-#
-sub render_student_list {
-    my ($students, $formprefix, $defaultusers,
-	$multiselect, $resultname, $javascript) = @_;
-
-    my $result = "";
-
-    if ($javascript && $multiselect) {
-        $result .= <<SCRIPT;
-<script type="text/javascript">
-// <!--
-
-    function findElement(name) {
-	var i;
-	var ele;
-	for(i =0; i < document.forms.helpform.elements.length; i++) {
-	    ele = document.forms.helpform.elements[i];
-	    if(ele.name == name) {
-		return ele;
-	    }
-	}
-	return null;
-    }
-    function isStudent(element) {
-	if(element.value.indexOf(":Student") != -1) {
-	    return 1;
-	}
-	return 0;
-    }
-    function section(element) {
-	var i;
-	var info;
-	if (element.value.indexOf(':') != -1) {
-	    info = element.value.split(':');
-	    return info[2];
-	} else {
-	    return "";
-	}
-    }
-    function rightSubForm(element, which) {
-	if (element.value.indexOf(which) != -1) {
-	    return true;
-	} else {
-	    return false;
-	}
-    }
-
-    function setAllStudents(value, which) {
-	var i;
-	var ele;
-	for (i =0; i < document.forms.helpform.elements.length; i++) {
-	    ele = document.forms.helpform.elements[i];
-	    if(isStudent(ele) && rightSubForm(ele, which)) {
-		ele.checked=value;
-	    }
-	}
-    }
-    function setAllCoursePersonnel(value, which) {
-	var i;
-	var ele;
-	for (i =0; i < document.forms.helpform.elements.length; i++) {
-	    ele = document.forms.helpform.elements[i];
-	    if(!isStudent(ele) && rightSubForm(ele, which)) {
-		ele.checked = value;
-	    }
-	}
-    }
-    function setSection(which, value, subform) {
-	var i;
-	var ele;
-	for (i =0; i < document.forms.helpform.elements.length; i++) {
-	    ele = document.forms.helpform.elements[i];
-	    if (ele.value.indexOf(':') != -1) {
-		if ((section(ele) == which) && rightSubForm(ele, subform)) {
-		    ele.checked = value;
-		}
-	    }
-	}
-    }
-
-    function setCheckboxes(listbox, which, value) {
-	var k;
-	var elem;
-	var what;
-        elem = findElement(listbox);
-	if (elem != null) {
-	    for (k = 0; k < elem.length; k++) {
-		if (elem.options[k].selected) {
-		    what = elem.options[k].text;
-		    if (what == 'All Students') {
-			setAllStudents(value, which);
-		    } else if (what == 'All Course Personnel') {
-			setAllCoursePersonnel(value, which);
-		    } else if (what == 'No Section') {
-			setSection('',value, which);
-		    } else {
-			setSection(what, value, which);
-		    }
-		}
-	    }
-	}
-    }
-    function selectSections(listbox, which) {
-	setCheckboxes(listbox, which, true);
-
-    }
-    function unselectSections(listbox, which) {
-	setCheckboxes(listbox, which, false);
-    }
-
-// -->
-</script>
-SCRIPT
-
-    }
-
-    # If multiple selections are allowed, we have a listbox
-    # at the top which allows quick selections from each section
-    # as well as from categories of personnel.
-
-    if ($multiselect) {
-	#  Make a section hash so we can add sections to the choice:
-
-	my %sections;
-	for my $student (@$students) {
-	    my $sect = $student->[2];
-	    if ($sect ne "") {
-		$sections{$sect} = 1;
-	    }
-	}
-
-	$result .= '<table><tr><td>';
-
-	my $size = scalar(keys(%sections));
-	$size += 3;		# We have allstudents allpersonel nosection too.
-	if ($size > 5) { 
-	    $size = 5; 
-	}
-	$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 .= "\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='
-	    ."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>';
-	$result .= '<td valign="top"><input type="button" name="'.$formprefix
-	    .'.unselect" value="Unselect"  onclick='.
-	    "'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>';
-    }
-
-    #  Now we list the students, but the form element type
-    #  will depend on whether or not multiselect is true.
-    #  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";
-
-    my $input_type;
-    if ($multiselect) {
-	$input_type = "checkbox";
-    } else {
-	$input_type = "radio";
-    }
-
-    my $checked = 0;
-    for my $student (@$students) {
-	$result .= '<tr><td><input type="'.$input_type.'"  name="'.
-	    $resultname.".forminput".'"';
-	my $user    = $student->[0];
-
-	# Figure out which students are checked by default...
-	
-	if(%$defaultusers) {
-	    if (exists ($defaultusers->{$user})) {
-		$result .= ' checked ="checked" ';
-		$checked = 1;
-	    }
-	} elsif (!$multiselect  && !$checked) {
-	    $result .= ' checked="checked" ';
-	    $checked = 1;	# First one for radio if no default specified.
-	}
-	$result .= ' value="'. HTML::Entities::encode($user .          ':'
-						      .$student->[2] . ':'
-						      .$student->[1] . ':'
-						      .$student->[3] . ':'
-						      .$student->[4] . ":"
-						      .$formprefix,   "<>&\"'")
-	    ."\" /></td><td>\n";
-	$result .= HTML::Entities::encode($student->[1], '<>&"')
-	        . '</td><td align="center" >'."\n";
-	$result .= HTML::Entities::encode($student->[2], '<>&"')
-   	        . '</td><td align="center">'."\n";
-	$result .= HTML::Entities::encode($student->[3], '<>&"')
-	        . '</td><td align="center">'."\n";
-	$result .= HTML::Entities::encode($student->[4], '<>&"')
-  	        . '</td><td align="center">'."\n";
-	$result .= HTML::Entities::encode($student->[0], '<>&"')
-	        . '</td></tr>'."\n";
-    }
-    $result .=" </table> <br /> <hr />\n";
-
-    return $result;
-}
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::student',
@@ -2692,7 +2341,7 @@
     my ($course_personnel, 
 	$current_members, 
 	$expired_members, 
-	$future_members) = &get_people_in_class();
+	$future_members) = &Apache::lonselstudent::get_people_in_class();
 
 
 
@@ -2705,7 +2354,7 @@
 
     #   Current personel
 
-    $result .= &render_student_list( $current_members,
+    $result .= &Apache::lonselstudent::render_student_list( $current_members,
 				     "current",
 				     \%defaultUsers,
 				     $self->{'multichoice'},
@@ -2719,7 +2368,7 @@
 
 	# And future.
 
-	$result .= &render_student_list( $future_members,
+	$result .= &Apache::lonselstudent::render_student_list( $future_members,
 					 "future",
 					 \%defaultUsers,
 					 $self->{'multichoice'},
@@ -2727,7 +2376,7 @@
 					 0);
 	# Past 
 
-	$result .= &render_student_list($expired_members,
+	$result .= &Apache::lonselstudent::render_student_list($expired_members,
 					"past",
 					\%defaultUsers,
 					$self->{'multichoice'},

Index: loncom/interface/lonselstudent.pm
+++ loncom/interface/lonselstudent.pm
# The LearningOnline Network with CAPA
# lonselstudent.pm : Reusable subs for student selection.
#
# $Id: lonselstudent.pm,v 1.1 2006/05/11 21:10:21 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#

package Apache::lonselstudent;
use     Apache::lonnet;
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)
#  
# Where:
#    course_personnel - Each element of this array is itself a reference to an array
#                      containing information about a member of the course staff.
#    current_members  - Each element of this array is itself a reference to an
#                       array that contains information about current students in
#                       the course.
#    expired_members  - Each element of this array is itself a reference to an
#                       array that contains information about students whose 
#                       status has expired.
#    future_members   - Each element of this arrya is itself a reference to an
#                       array that contains information about students who will
#                       become active at a future date.
#
#  Course personnel elements include:
#       [0]    Last, First of the user.
#       [1]    Role held by the user.
#       [2]    Empty.
#       [3]    Empty
#       [4]    username:domain of the user.
#
#  Student member array elements are:
#       [0]    Last, First of the user.
#       [1]    Status of the user one of ("Active", "Future", or "Expired')
#              depending on which array the user was put in.
#       [2]    Section the student is in.
#       [3]    Role of the member (student).
#       [4]    username:domain of the user.
#
sub get_people_in_class {
    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 $person (@people) {
		push @course_personnel, [join(':', @$person), $person->[0], '', $_];
	    }
	}
    }
    #  Students must be split into the three categories:

    my @current_members;
    my @future_members;
    my @expired_members;

    #   Indices into the coures data elements.

    my $section    = &Apache::loncoursedata::CL_SECTION();
    my $fullname   = &Apache::loncoursedata::CL_FULLNAME();
    my $status     = &Apache::loncoursedata::CL_STATUS();
    my $start_date = &Apache::loncoursedata::CL_START();


    my $classlist = &Apache::loncoursedata::get_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;
 



    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.
	    
	    my $now = time;
	    if ($classlist->{$_}->[$start_date] > $now) {
		push @future_members, [$_, $classlist->{$_}->[$fullname],
					$classlist->{$_}->[$section],
					"Future", "Student"];
	    } else {
		push @expired_members, [$_, $classlist->{$_}->[$fullname],
					$classlist->{$_}->[$section],
					"Expired", "Student"];
	    }

	}
    }
    return (\@course_personnel, 
	    \@current_members,
	    \@expired_members,
	    \@future_members);

}

#
#  Utility function used when rendering the <student> tag.
#  This function renders a segment of course personel
#  Personel are broken up by the helper into past, current and
#  future...each one gets is own subpage of selection.
#  This sub renders one of these pages.
#  Parameters:
#     $students    - Students in the section. (ref to array of references
#                    to arrays).
#     $formprefix  - form path prefix for form element names
#                    This is used to make each form element
#                    so that the segments having to do with each
#                    set of students won't collide.
#     $defaultusers - reference to a hash containng
#                     the set of users that should be on or off.
#     $multiselect  - True if multiselect allowed.
#     $resultname   - Name of result variable.
#     $javascript   - If true, the javascript to run this is output
#                     This should be true for the first call for a page
#                     and false for all other calls... only matters if
#                     multiselect is true.
#  Returns:
#     HTML  text to add to the rendering of the helper.
#
sub render_student_list {
    my ($students, $formprefix, $defaultusers,
	$multiselect, $resultname, $javascript) = @_;

    my $result = "";

    if ($javascript && $multiselect) {
        $result .= <<SCRIPT;
<script type="text/javascript">
// <!--

    function findElement(name) {
	var i;
	var ele;
	for(i =0; i < document.forms.helpform.elements.length; i++) {
	    ele = document.forms.helpform.elements[i];
	    if(ele.name == name) {
		return ele;
	    }
	}
	return null;
    }
    function isStudent(element) {
	if(element.value.indexOf(":Student") != -1) {
	    return 1;
	}
	return 0;
    }
    function section(element) {
	var i;
	var info;
	if (element.value.indexOf(':') != -1) {
	    info = element.value.split(':');
	    return info[2];
	} else {
	    return "";
	}
    }
    function rightSubForm(element, which) {
	if (element.value.indexOf(which) != -1) {
	    return true;
	} else {
	    return false;
	}
    }

    function setAllStudents(value, which) {
	var i;
	var ele;
	for (i =0; i < document.forms.helpform.elements.length; i++) {
	    ele = document.forms.helpform.elements[i];
	    if(isStudent(ele) && rightSubForm(ele, which)) {
		ele.checked=value;
	    }
	}
    }
    function setAllCoursePersonnel(value, which) {
	var i;
	var ele;
	for (i =0; i < document.forms.helpform.elements.length; i++) {
	    ele = document.forms.helpform.elements[i];
	    if(!isStudent(ele) && rightSubForm(ele, which)) {
		ele.checked = value;
	    }
	}
    }
    function setSection(which, value, subform) {
	var i;
	var ele;
	for (i =0; i < document.forms.helpform.elements.length; i++) {
	    ele = document.forms.helpform.elements[i];
	    if (ele.value.indexOf(':') != -1) {
		if ((section(ele) == which) && rightSubForm(ele, subform)) {
		    ele.checked = value;
		}
	    }
	}
    }

    function setCheckboxes(listbox, which, value) {
	var k;
	var elem;
	var what;
        elem = findElement(listbox);
	if (elem != null) {
	    for (k = 0; k < elem.length; k++) {
		if (elem.options[k].selected) {
		    what = elem.options[k].text;
		    if (what == 'All Students') {
			setAllStudents(value, which);
		    } else if (what == 'All Course Personnel') {
			setAllCoursePersonnel(value, which);
		    } else if (what == 'No Section') {
			setSection('',value, which);
		    } else {
			setSection(what, value, which);
		    }
		}
	    }
	}
    }
    function selectSections(listbox, which) {
	setCheckboxes(listbox, which, true);

    }
    function unselectSections(listbox, which) {
	setCheckboxes(listbox, which, false);
    }

// -->
</script>
SCRIPT

    }

    # If multiple selections are allowed, we have a listbox
    # at the top which allows quick selections from each section
    # as well as from categories of personnel.

    if ($multiselect) {
	#  Make a section hash so we can add sections to the choice:

	my %sections;
	for my $student (@$students) {
	    my $sect = $student->[2];
	    if ($sect ne "") {
		$sections{$sect} = 1;
	    }
	}

	$result .= '<table><tr><td>';

	my $size = scalar(keys(%sections));
	$size += 3;		# We have allstudents allpersonel nosection too.
	if ($size > 5) { 
	    $size = 5; 
	}
	$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 .= "\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='
	    ."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>';
	$result .= '<td valign="top"><input type="button" name="'.$formprefix
	    .'.unselect" value="Unselect"  onclick='.
	    "'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>';
    }

    #  Now we list the students, but the form element type
    #  will depend on whether or not multiselect is true.
    #  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";

    my $input_type;
    if ($multiselect) {
	$input_type = "checkbox";
    } else {
	$input_type = "radio";
    }

    my $checked = 0;
    for my $student (@$students) {
	$result .= '<tr><td><input type="'.$input_type.'"  name="'.
	    $resultname.".forminput".'"';
	my $user    = $student->[0];

	# Figure out which students are checked by default...
	
	if(%$defaultusers) {
	    if (exists ($defaultusers->{$user})) {
		$result .= ' checked ="checked" ';
		$checked = 1;
	    }
	} elsif (!$multiselect  && !$checked) {
	    $result .= ' checked="checked" ';
	    $checked = 1;	# First one for radio if no default specified.
	}
	$result .= ' value="'. HTML::Entities::encode($user .          ':'
						      .$student->[2] . ':'
						      .$student->[1] . ':'
						      .$student->[3] . ':'
						      .$student->[4] . ":"
						      .$formprefix,   "<>&\"'")
	    ."\" /></td><td>\n";
	$result .= HTML::Entities::encode($student->[1], '<>&"')
	        . '</td><td align="center" >'."\n";
	$result .= HTML::Entities::encode($student->[2], '<>&"')
   	        . '</td><td align="center">'."\n";
	$result .= HTML::Entities::encode($student->[3], '<>&"')
	        . '</td><td align="center">'."\n";
	$result .= HTML::Entities::encode($student->[4], '<>&"')
  	        . '</td><td align="center">'."\n";
	$result .= HTML::Entities::encode($student->[0], '<>&"')
	        . '</td></tr>'."\n";
    }
    $result .=" </table> <br /> <hr />\n";

    return $result;
}

1;

--foxr1147381822--