--- loncom/interface/Attic/londropadd.pm	2007/08/28 13:00:45	1.167
+++ loncom/interface/Attic/londropadd.pm	2009/02/04 13:21:48	1.178
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to drop and add students in courses 
 #
-# $Id: londropadd.pm,v 1.167 2007/08/28 13:00:45 raeburn Exp $
+# $Id: londropadd.pm,v 1.178 2009/02/04 13:21:48 hauer Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,8 +26,23 @@
 # http://www.lon-capa.org/
 #
 #
-###############################################################
-##############################################################
+
+=head1 NAME
+
+Apache::londropadd.pm
+
+=head1 SYNOPSIS
+
+drop & add students
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 SUBROUTINES
+
+=over
+
+=cut
 
 package Apache::londropadd;
 
@@ -42,8 +57,6 @@ use Apache::lonlocal;
 use Apache::longroup;
 use LONCAPA();
 
-###############################################################
-###############################################################
 sub header {
     my ($jscript,$loaditems) = @_;
     my $start_page;
@@ -59,9 +72,14 @@ $start_page
 ENDHEAD
 }
 
-###############################################################
-###############################################################
-# Drop student from all sections of a course, except optional $csec
+=pod
+
+=item modifystudent()
+
+    Drop student from all sections of a course, except optional $csec
+
+=cut
+
 sub modifystudent {
     my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
     # if $csec is undefined, drop the student from all the courses matching
@@ -104,9 +122,14 @@ sub modifystudent {
     return $result;
 }
 
-###############################################################
-###############################################################
-# build a domain and server selection form
+=pod
+
+=item domain_form()
+    
+    build a domain and server selection form
+
+=cut
+
 sub domain_form {
     my ($defdom) = @_;
     # Set up domain and server selection forms
@@ -135,9 +158,14 @@ sub domain_form {
     return $result;
 }
 
-###############################################################
-###############################################################
-#  Menu Phase One
+=pod
+
+=item print_main_menu()
+
+    Menu Phase One
+
+=cut
+
 sub print_main_menu {
     my ($r,$permission)=@_;
     #
@@ -179,27 +207,27 @@ sub print_main_menu {
           { text => 'Create a new group',
             help => 'Course_Create_Group',
             permission => $permission->{'grp_manage'},
-            url => '/adm/coursegroups?refpage=enrl&action=create',
+            url => '/adm/coursegroups?refpage=enrl&action=create',
             },
           { text => 'Modify an existing group',
             help => 'Course_Modify_Group',
             permission => $permission->{'grp_manage'},
-            url => '/adm/coursegroups?refpage=enrl&action=modify',
+            url => '/adm/coursegroups?refpage=enrl&action=modify',
             },
           { text => 'Delete an existing group',
             help => 'Course_Delete_Group',
             permission => $permission->{'grp_manage'},
-            url => '/adm/coursegroups?refpage=enrl&action=delete',
+            url => '/adm/coursegroups?refpage=enrl&action=delete',
             },
           { text => 'Re-enable a deleted group',
             help => 'Course_Reenable_Group',
             permission => $permission->{'grp_manage'},
-            url => '/adm/coursegroups?refpage=enrl&action=reenable',
+            url => '/adm/coursegroups?refpage=enrl&action=reenable',
             },
           { text => 'Enter an existing group',
             help => 'Course_Display_Group',
             permission => $permission->{'grp_view'},
-            url => '/adm/coursegroups?refpage=enrl&action=view',
+            url => '/adm/coursegroups?refpage=enrl&action=view',
             },
           );
     my $menu_html = '';
@@ -224,13 +252,15 @@ sub print_main_menu {
     return;
 }
 
-###############################################################
-###############################################################
+
+
 sub hidden_input {
     my ($name,$value) = @_;
     return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'."\n";
 }
 
+
+
 sub print_upload_manager_header {
     my ($r,$datatoken,$distotal,$krbdefdom)=@_;
     my $javascript;
@@ -262,8 +292,9 @@ sub print_upload_manager_header {
         $password_choice = 'int';        
     }
     #
-    my $javascript_validations=&javascript_validations('auth',$krbdefdom,
-                                    $password_choice);
+    my $javascript_validations = 
+        &javascript_validations('auth',$krbdefdom,$password_choice,undef,
+                                $env{'request.role.domain'});
     my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');
     $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n".
               "<hr>\n".
@@ -290,10 +321,12 @@ sub print_upload_manager_header {
               $javascript."\n".$javascript_validations.'</script>');
 }
 
-###############################################################
-###############################################################
+
+
+
+
 sub javascript_validations {
-    my ($mode,$krbdefdom,$curr_authtype,$curr_authfield)=@_;
+    my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain)=@_;
     my $authheader;
     if ($mode eq 'auth') {
         my %param = ( formname => 'studentform',
@@ -302,7 +335,7 @@ sub javascript_validations {
         $authheader = &Apache::loncommon::authform_header(%param);
     } elsif ($mode eq 'createcourse') {
         my %param = ( formname => 'ccrs',
-                  kerb_def_dom => $krbdefdom,
+                      kerb_def_dom => $krbdefdom,
                       curr_authtype => $curr_authtype );
         $authheader = &Apache::loncommon::authform_header(%param);
     } elsif ($mode eq 'modifycourse') {
@@ -323,7 +356,7 @@ sub javascript_validations {
          name     => 'The optional name field was not specified.',
          snum     => 'The optional student number field was not specified.',
          section  => 'The optional section field was not specified.', 
-         email    => 'The optional email address field was not specified.',
+         email    => 'The optional e-mail address field was not specified.',
          continue => 'Continue enrollment?',
          );
     
@@ -331,6 +364,7 @@ sub javascript_validations {
     my $function_name =(<<END);
 function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) {
 END
+    my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($domain);
     my $auth_checks;
     if ($mode eq 'createcourse') {
         $auth_checks .= (<<END);
@@ -345,9 +379,13 @@ END
         $auth_checks .= (<<END);
     var foundatype=0;
     if (founduname==0) {
-	alert('$alert{'username'}');
+        alert('$alert{'username'}');
         return;
     }
+
+END
+        if ($authnum > 1) {
+            $auth_checks .= (<<END);
     // alert('current.radiovalue = '+current.radiovalue);
     if (current.radiovalue == null || current.radiovalue == '' || current.radiovalue == 'nochange') {
         // They did not check any of the login radiobuttons.
@@ -355,6 +393,7 @@ END
         return;
     }
 END
+        }
     }
     if ($mode eq 'createcourse') {
         $auth_checks .= "
@@ -416,7 +455,7 @@ END
 }
 END
     } else {
-        $section_checks = &section_check_js();
+        $section_checks = &Apache::lonuserutils::section_check_js();
         $optional_checks = (<<END);
     var message='';
     if (foundname==0) { 
@@ -464,8 +503,9 @@ END
     return $result;
 }
 
-###############################################################
-###############################################################
+
+
+
 sub upload_manager_javascript_forward_associate {
     return(<<ENDPICK);
 function verify(vf,sec_caller) {
@@ -557,8 +597,9 @@ function clearpwd(vf) {
 ENDPICK
 }
 
-###############################################################
-###############################################################
+
+
+
 sub upload_manager_javascript_reverse_associate {
     return(<<ENDPICK);
 function verify(vf,sec_caller) {
@@ -612,8 +653,9 @@ function clearpwd(vf) {
 ENDPICK
 }
 
-###############################################################
-###############################################################
+
+
+
 sub print_upload_manager_footer {
     my ($r,$i,$keyfields,$defdom,$today,$halfyear)=@_;
 
@@ -666,8 +708,9 @@ sub print_upload_manager_footer {
     return;
 }
 
-###############################################################
-###############################################################
+
+
+
 sub print_upload_manager_form {
     my $r=shift;
 
@@ -721,7 +764,7 @@ sub print_upload_manager_form {
              ['id',   &mt('ID/Student Number'),$env{'form.id_choice'}],
              ['sec',  &mt('Section'),          $env{'form.sec_choice'}],
              ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],
-             ['email',&mt('EMail Address'),   $env{'form.email_choice'}]);
+             ['email',&mt('E-mail Address'),   $env{'form.email_choice'}]);
 	if ($env{'form.upfile_associate'} eq 'reverse') {	
 	    &Apache::loncommon::csv_print_samples($r,\@records);
 	    $i=&Apache::loncommon::csv_print_select_table($r,\@records,
@@ -741,8 +784,10 @@ sub print_upload_manager_form {
     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
 }
 
-###############################################################
-###############################################################
+
+
+
+
 sub enroll_single_student {
     my ($r,$srcharray) = @_; 
     # Remove non alphanumeric values from section
@@ -752,9 +797,10 @@ sub enroll_single_student {
     # in the course is entirely separate from the action of enrolling the
     # student.  Also, a failure in setting the dates as default is not fatal
     # to the process of enrolling / modifying a student.
-    my ($startdate,$enddate) = &get_dates_from_form();
+    my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form();
     if ($env{'form.makedatesdefault'}) {
-        $r->print(&make_dates_default($startdate,$enddate));
+        $r->print(&Apache::lonuserutils::make_dates_default($startdate,
+                                                            $enddate));
     }
 
     $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
@@ -799,7 +845,7 @@ sub enroll_single_student {
                                                    $env{'form.lcdomain'});
         if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {
             # Clean out any old roles the student has in this class.
-            &modifystudent($env{'form.lcdomain'},$env{'form.cuname'},
+            &Apache::lonuserutils::modifystudent($env{'form.lcdomain'},$env{'form.cuname'},
                            $env{'request.course.id'},$env{'form.csec'},
                             $desiredhost);
             my $login_result = &Apache::lonnet::modifystudent
@@ -953,9 +999,14 @@ sub make_dates_default {
     return $result;
 }
 
-##
-## Single student enrollment routines (some of them)
-##
+=pod
+
+=item get_student_username_domain_form()
+    
+    Single student enrollment routines (some of them)
+
+=cut
+
 sub get_student_username_domain_form {
     my ($r,$elements,$response,$srch,$forcenewuser) =  @_;
     my $loaditems = {
@@ -984,6 +1035,7 @@ sub get_student_username_domain_form {
 $jscript
 <h3>$lt{'eos'}</h3>
 END
+    $r->print($response);
     $r->print(&single_user_entry_form($defdom,$srch,$forcenewuser));
     return;
 }
@@ -1057,7 +1109,9 @@ sub print_enroll_single_student_form {
         # Set up authentication forms
         my ($krbdef,$krbdefdom) =
             &Apache::loncommon::get_kerberos_defaults($ccdomain);
-        $javascript_validations=&javascript_validations('auth',$krbdefdom);
+        $javascript_validations = 
+            &Apache::lonuserutils::javascript_validations('auth',$krbdefdom,
+                                                      undef,undef,$ccdomain);
         my %param = ( formname => 'document.studentform',
                       kerb_def_dom => $krbdefdom,
                       kerb_def_auth => $krbdef
@@ -1079,15 +1133,15 @@ sub print_enroll_single_student_form {
         #
         #
 	my %lt=&Apache::lonlocal::texthash(
-		       'udf'  => "User Data for",
+		       'udf'  => "Personal Data",
                        'fn'   => "First Name",
                        'mn'   => "Middle Name",
                        'ln'   => "Last Name",
                        'gen'  => "Generation",
                        'hs'   => "Home Server",
-                       'pswd' => "Password",
+                       'pswd' => "Login Data",
 		       'psam' => "Please select an authentication mechanism",
-                       'mail' => "Email Address"
+                       'mail' => "E-mail Address"
 					   );
 	my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options');
         $user_data_html = <<END;
@@ -1108,26 +1162,29 @@ sub print_enroll_single_student_form {
 </table>
 <h3>$lt{'pswd'}</h3>
 $lt{'psam'}$authhelp
-<table>
 <p>
-$krbform
-<br />
-$intform
-<br />
-$locform
-</p>
 END
+        if ($krbform ne '') {
+            $user_data_html .= $krbform.'<br />';
+        }
+        if ($intform ne '') {
+            $user_data_html .= $intform.'<br />';
+        }
+        if ($locform ne '') {
+            $user_data_html .= $locform.'<br />';
+        }
+        $user_data_html .= "\n</p>\n"
     } else {
         # User already exists.  Do not worry about authentication
         my %uenv = &Apache::lonnet::dump('environment',$ccdomain,$ccuname);
-        $javascript_validations = &javascript_validations('noauth');
+        $javascript_validations = &Apache::lonuserutils::javascript_validations('noauth');
 	my %lt=&Apache::lonlocal::texthash(
 		       'udf'  => "User Data for",
                        'fn'   => "First Name",
                        'mn'   => "Middle Name",
                        'ln'   => "Last Name",
                        'gen'  => "Generation",
-                       'mail' => "Email Address",
+                       'mail' => "E-mail Address",
 					   );
         $user_data_html = <<END;
 <h3>$lt{'udf'} $ccuname:$ccdomain</h3>
@@ -1146,7 +1203,7 @@ END
 </table>
 END
     }
-    my $date_table = &date_setting_table();
+    my $date_table = &Apache::lonuserutils::date_setting_table();
         # Print it all out
     my %lt=&Apache::lonlocal::texthash(
 		   'cd'   => "Course Data",
@@ -1235,7 +1292,14 @@ END
     return;
 }
 
-# ========================================================= Menu Phase Two Drop
+=pod
+
+=item print_drop_menu()
+
+    Menu Phase Two Drop
+
+=cut
+
 sub print_drop_menu {
     my $r=shift;
     $r->print("<h3>".&mt('Drop Students')."</h3>");
@@ -1250,7 +1314,15 @@ sub print_drop_menu {
     return;
 }
 
-# ============================================== view classlist
+
+=pod
+
+=item print_html_classlist()
+
+    view classlist
+
+=cut
+
 sub print_html_classlist {
     my ($r,$mode,$permission) = @_;
     if (! exists($env{'form.sortby'})) {
@@ -1340,7 +1412,15 @@ sub print_html_classlist {
     }
 }
 
-# =================================================== Show student list to drop
+
+=pod
+
+=item show_class_list()
+
+    Show student list to drop
+
+=cut
+
 sub show_class_list {
     my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;
     my $cid=$env{'request.course.id'};
@@ -1364,6 +1444,11 @@ sub show_class_list {
     }
     my $displayphotos = $env{'form.displayphotos'};
 
+    if (! exists($env{'form.displayclickers'})) {
+        $env{'form.displayclickers'} = 'off';
+    }
+    my $displayclickers = $env{'form.displayclickers'};
+
     # Print out header 
     unless ($mode eq 'autoenroll') {
         $r->print(<<END);
@@ -1373,6 +1458,7 @@ END
     $r->print(<<END);
 <input type="hidden" name="sortby" value="$sortby" />
 <input type="hidden" name="displayphotos" value="$displayphotos" />
+<input type="hidden" name="displayclickers" value="$displayclickers" />
 END
     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
         if ($linkto eq 'aboutme') {
@@ -1389,7 +1475,8 @@ END
                                            'start'  => "start date",
                                            'end'    => "end date",
                                            'type'   => "enroll type/action",
-					   'email'  => "email address",
+					   'email'  => "e-mail address",
+                                           'clicker'=> "clicker id",
                                            'photo'  => "photo",
 					   );
         unless ($mode eq 'autoenroll') {
@@ -1446,6 +1533,24 @@ function photowindow(photolink) {
        <a href="javascript:document.studentform.sortby.value='email';document.studentform.submit();">$lt{'email'}</a>
     </th>
 END
+
+# Clicker display on or off?
+
+        my %clicker_options = &Apache::lonlocal::texthash(
+                                                          'on' => 'Show',
+                                                          'off' => 'Hide',
+                                                         );
+        my $clickerchg = 'on';
+        if ($displayclickers eq 'on') {
+            $clickerchg = 'off';
+        }
+        $r->print('    <th>'."\n".'     '.
+            '<a href="javascript:document.studentform.displayclickers.value='.
+                      "'".$clickerchg."'".';document.studentform.submit();">'.
+                      $clicker_options{$clickerchg}.'</a>&nbsp;'.$lt{'clicker'}."\n".
+                      '    </th>'."\n");
+
+# Photo display on or off?
         if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
             my %photo_options = &Apache::lonlocal::texthash(
                                                             'on' => 'Show',
@@ -1462,6 +1567,9 @@ END
                       '    </th>'."\n");
         }
         $r->print("  </tr>\n");
+
+# Done with the HTML header line
+
     } elsif ($mode eq 'csv') {
 	#
 	# Open a file
@@ -1470,9 +1578,9 @@ END
             time.'_'.rand(1000000000).'.csv';
 	unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
 	    $r->log_error("Couldn't open $CSVfilename for output $!");
-	    $r->print("Problems occured in writing the csv file.  ".
-		      "This error has been logged.  ".
-		      "Please alert your LON-CAPA administrator.");
+	    $r->print(&mt('Problems occurred in writing the csv file. '
+                         .'This error has been logged. '
+                         .'Please alert your LON-CAPA administrator.'));
 	    $CSVfile = undef;
 	}
 	#
@@ -1514,6 +1622,9 @@ END
                                       "active groups","email address"],
                             $format->{'bold'});
     }
+
+# Done with header lines in all formats
+
     #
     # Sort the students
     my %index;
@@ -1557,12 +1668,8 @@ END
 
 	my %emails   = &Apache::loncommon::getemails($username,$domain);
 	my $email;
-	foreach my $type ('critnotification', 'permanentemail',
-			  'notification') {
-	    if ($emails{$type} =~ /\S/) {
-		$email = $emails{$type};
-		last;
-	    }
+	if ($emails{'permanentemail'} =~ /\S/) {
+	    $email = $emails{'permanentemail'};
 	}
 
         if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
@@ -1626,6 +1733,19 @@ END
     <td>$active_groups</td>
     <td>$email</td>
 END
+
+# Clickers
+            if ($displayclickers eq 'on') {
+               my $clickers =
+               (&Apache::lonnet::userenvironment($domain,$username,'clickers'))[1];
+               if ($clickers!~/\w/) { $clickers='-'; }
+               $r->print('<td>'.$clickers.'</td>');
+            } else {
+                $r->print('    <td>&nbsp;</td>  ');
+            }
+
+# Photos
+
             if ($env{'course.'.$env{'request.course.id'}.
 			 '.internal.showphoto'}) {
                 if ($displayphotos eq 'on') {
@@ -1702,9 +1822,14 @@ END
 }
 
 
-#
-# print out form for modification of a single students data
-#
+=pod
+
+=item print_modify_student_form()
+
+    print out form for modification of a single students data
+
+=cut
+
 sub print_modify_student_form {
     my $r = shift();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
@@ -1715,8 +1840,8 @@ sub print_modify_student_form {
     # determine the students name information
     my %info=&Apache::lonnet::get('environment',
                                   ['firstname','middlename',
-                                   'lastname','generation','id'],
-                                  $sdom, $sname);
+                                   'lastname','generation','id',
+                                   'permanentemail'], $sdom, $sname);
     my ($tmp) = keys(%info);
     if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
         $r->print('<font color="#ff0000" size="+2">'.&mt('Error').'</font>'.
@@ -1755,7 +1880,8 @@ sub print_modify_student_form {
                 &Apache::lonlocal::locallocaltime($endtime)).'<br />';
 
     }
-    my $date_table = &date_setting_table($starttime,$endtime);
+    my $date_table = 
+        &Apache::lonuserutils::date_setting_table($starttime,$endtime);
     #
     if (! exists($env{'form.Status'}) || 
         $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
@@ -1770,13 +1896,14 @@ sub print_modify_student_form {
                    'mn'    => "Middle",
                    'ln'    => "Last",
                    'gen'   => "Generation",
+                   'email' => "E-mail address",
                    'sid'   => "Student ID",
                    'disn'  => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
                    'sec'   => "Section",
                    'sm'    => "Submit Modifications",
 				       );
 # Check if section name is valid
-    my $section_check = &section_check_js();
+    my $section_check = &Apache::lonuserutils::section_check_js();
     $r->print(<<"END");
 <script type="text/javascript">
 $section_check
@@ -1799,8 +1926,8 @@ $lt{'odcc'}
 <input type="hidden" name="state"   value="done" />
 <input type="hidden" name="sortby"  value="$sortby" />
 <input type="hidden" name="Status"  value="$env{'form.Status'}" />
-<h2>$lt{'mef'} $info{'firstname'} $info{'middlename'} 
-$info{'lastname'} $info{'generation'}, $sname:$sdom</h2>
+<h3>$lt{'mef'} $info{'firstname'} $info{'middlename'} 
+$info{'lastname'} $info{'generation'}, $sname:$sdom</h3>
 <p>
 <b>$lt{'sn'}</b>
 <table>
@@ -1812,6 +1939,8 @@ $info{'lastname'} $info{'generation'}, $
 <input type="text" name="generation" value="$info{'generation'}" /></td></tr>
 </table>
 </p><p>
+<b>$lt{'email'}</b>: <input type="text" name="permanentemail" value="$info{'permanentemail'}" size="30" />
+</p><p>
 <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12" />
 </p><p>
 <label>
@@ -1829,9 +1958,15 @@ END
     return;
 }
 
-#
-# modify a single students section 
-#
+
+=pod 
+
+=item modify_single_student()
+
+    modify a single students section 
+
+=cut
+
 sub modify_single_student {
     my ($r) = @_;
     #
@@ -1839,9 +1974,10 @@ sub modify_single_student {
     $env{'form.section'} =~ s/\W//g;
     #
     # Do the date defaults first
-    my ($starttime,$endtime) = &get_dates_from_form();
+    my ($starttime,$endtime) = &Apache::lonuserutils::get_dates_from_form();
     if ($env{'form.makedatesdefault'}) {
-        $r->print(&make_dates_default($starttime,$endtime));
+        $r->print(&Apache::lonuserutils::make_dates_default($starttime,
+                                                            $endtime));
     }
     # Get the 'sortby' and 'Status' variables so the user goes back to their
     # previous screen
@@ -1855,8 +1991,8 @@ sub modify_single_student {
     # Get the old data
     my %old=&Apache::lonnet::get('environment',
                                  ['firstname','middlename',
-                                  'lastname','generation','id'],
-                                 $sdom, $slogin);
+                                  'lastname','generation','id',
+                                  'permanentemail'],$sdom, $slogin);
     $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,
                                                   $env{'request.course.id'});
     my ($tmp) = keys(%old);
@@ -1871,6 +2007,7 @@ sub modify_single_student {
     my $middlename = $env{'form.middlename'};
     my $lastname   = $env{'form.lastname'};
     my $generation = $env{'form.generation'};
+    my $permanentemail = $env{'form.permanentemail'};
     my $section    = $env{'form.section'};
     my $courseid   = $env{'request.course.id'};
     my $sid        = $env{'form.id'};
@@ -1895,65 +2032,111 @@ sub modify_single_student {
                    'mn'    => "Middle name",
                    'ln'    => "Last name",
                    'gen'   => "Generation",
+                   'em'    => "E-mail address",
                    'sec'   => "Section",
                    'ri'    => "Role Information",
                    'st'    => "Start Time",
                    'et'    => "End Time",
 				       );
     $r->print(<<END);
-    <h2>$lt{'mdu'} $slogin : $sdom </h2>
-<h3>$lt{'si'}</h3>
-<table rules="rows" border="1" cellpadding="3" >
-<tr>
-    <th> $lt{'fd'} </th>
-    <th> $lt{'ov'} </th>
-    <th> $lt{'nv'} </th>
-</tr>
-<tr>
-    <td> <b>$lt{'fn'}</b> </td>
-    <td> $old{'firstname'} </td>
-    <td> $firstname </td>
-</tr><tr>
-    <td> <b>$lt{'mn'}</b> </td>
-    <td> $old{'middlename'} </td>
-    <td> $middlename </td>
-</tr><tr>
-    <td> <b>$lt{'ln'}</b> </td>
-    <td> $old{'lastname'} </td>
-    <td> $lastname </td>
-</tr><tr>
-    <td> <b>$lt{'gen'}</b> </td>
-    <td> $old{'generation'} </td>
-    <td> $generation </td>
-</tr><tr>
-    <td> <b>ID</b> </td>
-    <td> $old{'id'} </td>
-    <td> $sid </td>
-</tr><tr>
-    <td> <b>$lt{'sec'}</b> </td>
-    <td> $old{'section'} </td>
-    <td> $section</td>
-</tr>
-</table>
-<h3>$lt{'ri'}</h3>
+    <h3>$lt{'mdu'} $slogin:$sdom </h3>
+END
+    $r->print(<<END);
 <table>
-<tr><td align="right"><b>$lt{'st'}:</b></td><td> $displayable_starttime </td></tr>
-<tr><td align="right"><b>$lt{'et'}:</b></td><td> $displayable_endtime   </td></tr>
+ <tr>
+  <td>
+    <table class="LC_nested_outer">
+     <tr>
+      <th>$lt{si}</th>
+     </tr>
+     <tr>
+      <td>
+       <table class="LC_nested">
+        <tr class="LC_info_row">
+         <td class="LC_left_item"> $lt{'fd'} </td>
+         <td class="LC_left_item"> $lt{'ov'} </td>
+         <td class="LC_left_item"> $lt{'nv'} </td>
+        </tr>
+        <tr class="LC_odd_row">
+         <td class="LC_left_item"> <b>$lt{'fn'}</b> </td>
+         <td class="LC_left_item"> $old{'firstname'} </td>
+         <td class="LC_left_item"> $firstname </td>
+        </tr>
+        <tr>
+         <td class="LC_left_item"> <b>$lt{'mn'}</b> </td>
+         <td class="LC_left_item"> $old{'middlename'} </td>
+         <td class="LC_left_item"> $middlename </td>
+        </tr>
+        <tr class="LC_odd_row">
+         <td class="LC_left_item"> <b>$lt{'ln'}</b> </td>
+         <td class="LC_left_item"> $old{'lastname'} </td>
+         <td class="LC_left_item"> $lastname </td>
+        </tr>
+        <tr>
+         <td class="LC_left_item"> <b>$lt{'gen'}</b> </td>
+         <td class="LC_left_item"> $old{'generation'} </td>
+         <td class="LC_left_item"> $generation </td>
+        </tr>
+        <tr class="LC_odd_row">
+         <td class="LC_left_item"> <b>ID</b> </td>
+         <td class="LC_left_item"> $old{'id'} </td>
+         <td class="LC_left_item"> $sid </td>
+        </tr>
+        <tr>
+         <td class="LC_left_item"> <b>$lt{'em'}</b> </td>
+         <td class="LC_left_item"> $old{'permanentemail'} </td>
+         <td class="LC_left_item"> $permanentemail </td>
+        <tr class="LC_odd_row">
+         <td> <b>$lt{'sec'}</b> </td>
+         <td> $old{'section'} </td>
+         <td> $section</td>
+        </tr>
+       </table>
+      </td>
+     </tr>
+   </table>
+   <br />
+   <table class="LC_nested_outer">
+     <tr>
+      <th>$lt{'ri'}</th>
+     </tr>
+     <tr>
+      <td>
+       <table class="LC_nested">
+        <tr class="LC_odd_row">
+         <td class="LC_left_item"><b>$lt{'st'}:</b></td>
+         <td class="LC_right_item"> $displayable_starttime </td>
+        </tr>
+        <tr>
+         <td class="LC_left_item"><b>$lt{'et'}:</b></td>
+         <td class="LC_right_item"> $displayable_endtime   </td>
+        </tr>
+       </table>
+      </td>
+     </tr>
+    </table>
+  </td>
+ </tr>
 </table>
 <p>
 END
     #
     # Send request(s) to modify data (final undef is for 'desiredhost',
     # which is a moot point because the student already has an account.
-    my $modify_section_results = &modifystudent($sdom,$slogin,
-                                                $env{'request.course.id'},
-                                                $section,undef);
+    my $modify_section_results = 
+        &Apache::lonuserutils::modifystudent($sdom,$slogin,
+                                             $env{'request.course.id'},
+                                             $section,undef);
     if ($modify_section_results !~ /^ok/) {
-        $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");
+        $r->print(&mt('An error occurred during the attempt to change the section for this student.')."<br />");
     }
     my $roleresults = &Apache::lonnet::modifystudent
         ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
-         $generation,$section,$endtime,$starttime,$env{'form.forceid'});
+         $generation,$section,$endtime,$starttime,$env{'form.forceid'},
+         undef,$permanentemail);
+    if ($old{'permanentemail'} ne $permanentemail) {
+        &Apache::loncommon::flush_email_cache($slogin,$sdom);
+    }
     if ($roleresults eq 'refused' ) {
         $r->print(&mt('Your request to change the role information for this student was refused. You do not appear to have sufficient authority to change student information.'));
     } elsif ($roleresults !~ /ok/) {
@@ -2013,12 +2196,10 @@ sub get_enrollment_data {
     return ($start,$end,$section);
 }
 
-#################################################
-#################################################
 
 =pod
 
-=item show_drop_list
+=item show_drop_list()
 
 Display a list of students to drop
 Inputs: 
@@ -2038,8 +2219,6 @@ which describes the order elements are s
 
 =cut
 
-#################################################
-#################################################
 sub show_drop_list {
     my ($r,$classlist,$keylist,$nosort)=@_;
     my $cid=$env{'request.course.id'};
@@ -2199,9 +2378,15 @@ END
     return;
 }
 
-#
-# Print out the initial form to get the courselist file
-#
+
+=pod 
+
+=item print_first_courselist_upload_form()
+
+    Print out the initial form to get the courselist file
+
+=cut
+
 sub print_first_courselist_upload_form {
     my $r=shift;
     my $str;
@@ -2226,7 +2411,15 @@ sub print_first_courselist_upload_form {
     return;
 }
 
-# ================================================= Drop/Add from uploaded file
+
+=pod
+
+=item upfile_drop_add()
+
+    Drop/Add from uploaded file
+
+=cut
+
 sub upfile_drop_add {
     my $r=shift;
     &Apache::loncommon::load_tmp_file($r);
@@ -2403,8 +2596,9 @@ sub upfile_drop_add {
                         $$_ =~ s/(\s+$|^\s+)//g;
                     }
                     if ($password || $env{'form.login'} eq 'loc') {
-                        &modifystudent($domain,$username,$cid,$sec,
-                                       $desiredhost);
+                        &Apache::lonuserutils::modifystudent($domain,
+                                                         $username,$cid,
+                                                         $sec,$desiredhost);
                         my $reply=&Apache::lonnet::modifystudent
                             ($domain,$username,$id,$amode,$password,
                              $fname,$mname,$lname,$gen,$sec,$enddate,
@@ -2431,7 +2625,7 @@ sub upfile_drop_add {
                 }
             }
         } # end of foreach (@studentdata)
-        $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count).
+        $r->print("</p>\n<p>\n".&mt('Processed [quant,_1,student].',$count).
                   "</p>\n");
         $r->print("<p>\n".
                   &mt('If active, the new role will be available when the '.
@@ -2471,7 +2665,8 @@ sub drop_student_list {
     foreach (@droplist) {
         my ($uname,$udom)=split(/\:/,$_);
         # drop student
-        my $result = &modifystudent($udom,$uname,$env{'request.course.id'});
+        my $result = &Apache::lonuserutils::modifystudent($udom,$uname,
+                                                $env{'request.course.id'});
         if ($result eq 'ok' || $result eq 'ok:') {
             $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
             $count++;
@@ -2481,7 +2676,7 @@ sub drop_student_list {
                       '<br />');
         }
     }
-    $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>');
+    $r->print('<p><b>'.&mt('Dropped [quant,_1,student].',$count).'</b></p>');
     $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
 }
 
@@ -2538,12 +2733,9 @@ sub get_permission {
     return (\%permission,$allowed);
 }
 
-###################################################################
-###################################################################
-
 =pod
 
-=item &handler
+=item &handler()
 
 The typical handler you see in all these modules.  Takes $r, the
 http request, as an argument.  
@@ -2570,8 +2762,6 @@ The response to the request is governed
 
 =cut
 
-###################################################################
-###################################################################
 sub handler {
     my $r=shift;
     if ($r->header_only) {
@@ -2656,14 +2846,19 @@ sub handler {
         my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
         my ($jsback,$elements) = &Apache::loncreateuser::crumb_utilities();
         my $jscript = '<script type="text/javascript">'.$jsback.'</script>';
+	&Apache::loncreateuser::restore_prev_selections();
+	my $srch;
+	foreach my $item (@search) {
+	    $srch->{$item} = $env{'form.'.$item};
+	}
+
         if ($env{'form.state'} eq 'gotusername') {
-            my $srch;
-            foreach my $item (@search) {
-                $srch->{$item} = $env{'form.'.$item};
-            }
             if ($env{'form.phase'} eq 'get_user_info') {
                 my ($currstate,$response,$forcenewuser,$results) =
                     &Apache::loncreateuser::user_search_result($srch);
+                if ($env{'form.currstate'} eq 'modify') {
+                    $currstate = $env{'form.currstate'};
+                }
                 if ($currstate eq 'select') {
                     $r->print(&header());
                     &Apache::lonhtmlcommon::add_breadcrumb
@@ -2707,7 +2902,7 @@ sub handler {
                 &print_enroll_single_student_form($r,$jscript,$ccuname,
                                                   $ccdomain,$srch);
             } else {
-                &get_student_username_domain_form($r,$elements);
+                &get_student_username_domain_form($r,$elements,undef,$srch);
             }
         } elsif ($env{'form.state'} eq 'enrolling') {
             $r->print(&header($jscript));
@@ -2728,7 +2923,7 @@ sub handler {
                                                       'Course_Add_Student'));
             &enroll_single_student($r,\@search);
         } else {
-            &get_student_username_domain_form($r,$elements);
+            &get_student_username_domain_form($r,$elements,undef,$srch);
         }
     } elsif ($env{'form.action'} eq 'classlist' && $permission->{'view'}) {
         $r->print(&header());
@@ -2777,10 +2972,12 @@ sub handler {
     return OK;
 }
 
-###################################################################
-###################################################################
 
 1;
 __END__
 
+=pod
+
+=back
 
+=cut