--- loncom/interface/Attic/londropadd.pm	2003/07/02 15:25:46	1.70
+++ loncom/interface/Attic/londropadd.pm	2003/12/08 23:13:17	1.93
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to drop and add students in courses 
 #
-# $Id: londropadd.pm,v 1.70 2003/07/02 15:25:46 matthew Exp $
+# $Id: londropadd.pm,v 1.93 2003/12/08 23:13:17 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,7 +32,7 @@
 # (TeX Content Handler
 #
 ###############################################################
-###############################################################
+##############################################################
 
 package Apache::londropadd;
 
@@ -42,15 +42,17 @@ use Apache::loncommon();
 use Apache::lonhtmlcommon();
 use Apache::Constants qw(:common :http REDIRECT);
 use Spreadsheet::WriteExcel;
+use Apache::lonlocal;
 
 ###############################################################
 ###############################################################
 sub header {
     my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');
+    my $title = &mt('LON-CAPA Enrollment Manager');
     return(<<ENDHEAD);
 <html>
 <head>
-<title>LON-CAPA Enrollment Manager</title>
+<title>$title</title>
 </head>
 $bodytag
 <form method="post" enctype="multipart/form-data"  
@@ -79,7 +81,9 @@ sub modifystudent {
             # We are in this course
             my $section=$1;
             $section='' if ($course eq $courseid.'_st');
-            if ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
+            if (defined($csec) && $section eq $csec) {
+                $result .= 'ok:';
+            } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
                 my (undef,$end,$start)=split(/\_/,$roles{$course});
                 my $now=time;
                 # if this is an active role 
@@ -137,33 +141,49 @@ sub domain_form {
 #  Menu Phase One
 sub print_main_menu {
     my $r=shift;
+    my %Text = &Apache::lonlocal::texthash
+        ('upload'    => 'Upload a class list',
+         'enrollone' => 'Enroll a single student',
+         'modify'    => 'Modify student data',
+         'view'      => 'View Class List',
+         'drop'      => 'Drop Students',
+         'populate'  => 'Automated Enrollment Manager');
+
     $r->print(<<END);
 <p>
 <font size="+1">
-    <a href="/adm/dropadd?action=upload">Upload a course list</a>
+    <a href="/adm/dropadd?action=upload">$Text{'upload'}</a>
 </font>
 </p><p>
 <font size="+1">
-    <a href="/adm/dropadd?action=enrollstudent">Enroll a single student</a>
+    <a href="/adm/dropadd?action=enrollstudent">$Text{'enrollone'}</a>
 </font>
 </p><p>
 <font size="+1">
-    <a href="/adm/dropadd?action=modifystudent">Modify student data</a>
+    <a href="/adm/dropadd?action=modifystudent">$Text{'modify'}</a>
 </font>
 </p><p>
 <font size="+1">
-    <a href="/adm/dropadd?action=classlist">View Classlist</a>
+    <a href="/adm/dropadd?action=classlist">$Text{'view'}</a>
 </font>
 </p><p>
 <font size="+1">
-    <a href="/adm/dropadd?action=drop">Drop Students</a>
+    <a href="/adm/dropadd?action=drop">$Text{'drop'}</a>
+</font>
+</p><p>
+<font size="+1">
+    <a href="/adm/populate">$Text{'populate'}</a>
 </font>
-</p>
 END
 }
 
 ###############################################################
 ###############################################################
+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;
@@ -182,51 +202,83 @@ sub print_upload_manager_header {
     } else {
 	$javascript=&upload_manager_javascript_forward_associate();
     }
-    my $javascript_validations=&javascript_validations($krbdefdom);
-    $r->print(<<ENDPICK);
-<h3>Uploading Class List</h3>
-<hr>
-<h3>Identify fields</h3>
-Total number of records found in file: $distotal <hr />
-Enter as many fields as you can. The system will inform you and bring you back
-to this page if the data selected is insufficient to run your class.<hr />
-<input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
-<input type="hidden" name="action"     value="upload" />
-<input type="hidden" name="state"      value="got_file" />
-<input type="hidden" name="associate"  value="" />
-<input type="hidden" name="datatoken"  value="$datatoken" />
-<input type="hidden" name="fileupload" value="$ENV{'form.fileupload'}" />
-<input type="hidden" name="upfiletype" value="$ENV{'form.upfiletype'}" />
-<input type="hidden" name="upfile_associate" 
-                                       value="$ENV{'form.upfile_associate'}" />
-<hr />
-<script type="text/javascript" language="Javascript">
-$javascript
-$javascript_validations
-</script>
-ENDPICK
+    my $javascript_validations=&javascript_validations('auth',$krbdefdom);
+    my $checked=(($ENV{'form.noFirstLine'})?' checked="1"':'');
+    $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n".
+              "<hr>\n".
+              '<h3>'.&mt('Identify fields')."</h3>\n");
+    $r->print("<p>\n".
+              &mt('Total number of records found in file: [_1].',$distotal).
+              "\n".
+              "</p><hr>\n");
+    $r->print(&mt('Enter as many fields as you can. '.
+                  'The system will inform you and bring you back to '.
+                  'this page if the data selected is insufficient to '.
+                  'enroll students in your class.')."<hr>\n");
+    $r->print(&hidden_input('action','upload').
+              &hidden_input('state','got_file').
+              &hidden_input('associate','').
+              &hidden_input('datatoken',$datatoken).
+              &hidden_input('fileupload',$ENV{'form.fileupload'}).
+              &hidden_input('upfiletype',$ENV{'form.upfiletype'}).
+              &hidden_input('upfile_associate',$ENV{'form.upfile_associate'}));
+    $r->print('<input type="button" value="Reverse Association" '.
+              'name="'.&mt('Reverse Association').'" '.
+              'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');
+    $r->print('<input type="checkbox" name="noFirstLine" $checked />'.
+              &mt('Ignore First Line'));
+    $r->print("<hr />\n".
+              '<script type="text/javascript" language="Javascript">'."\n".
+              $javascript."\n".$javascript_validations.'</script>');
 }
 
 ###############################################################
 ###############################################################
 sub javascript_validations {
-    my ($krbdefdom)=@_;
-    my %param = ( formname => 'studentform',
+    my ($mode,$krbdefdom)=@_;
+    my $authheader;
+    if ($mode eq 'auth') {
+        my %param = ( formname => 'studentform',
+                      kerb_def_dom => $krbdefdom );
+        $authheader = &Apache::loncommon::authform_header(%param);
+    } elsif ($mode eq 'createcourse') {
+        my %param = ( formname => 'ccrs',
                   kerb_def_dom => $krbdefdom );
-    my $authheader = &Apache::loncommon::authform_header(%param);
-    my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
-    return (<<ENDPICK);
-function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec) {
+        $authheader = &Apache::loncommon::authform_header(%param);
+    }
+    
+    my %alert = &Apache::lonlocal::texthash
+        (username => 'You need to specify the username field.',
+         authen   => 'You must choose an authentication type.',
+         krb      => 'You need to specify the Kerberos domain.',
+         ipass    => 'You need to specify the initial password.',
+         name     => 'The optional name field was not specified.',
+         snum     => 'The optional student number field was not specified.',
+         section  => 'The optional section or group field was not specified.', 
+         email    => 'The optional email address field was not specified.',
+         continue => 'Continue enrollment?',
+         );
+    
+#    my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
+    my $function_name =(<<END);
+function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) {
+END
+    my $auth_checks = (<<END);
     var foundatype=0;
-    var message='';
+END
+    unless ($mode eq 'createcourse') {
+        $auth_checks .= (<<END);
     if (founduname==0) {
-	alert('You need to specify the username field');
+	alert('$alert{'username'}');
         return;
     }
+END
+    }
+    $auth_checks .= (<<END);
     // alert('current.radiovalue = '+current.radiovalue);
     if (current.radiovalue == null || current.radiovalue == 'nochange') {
         // They did not check any of the login radiobuttons.
-        alert('You must choose an authentication type');
+        alert('$alert{'authen'}');
         return;
     }
     foundatype=1;
@@ -234,11 +286,11 @@ function verify_message (vf,founduname,f
         var alertmsg = '';
         switch (current.value) {
             case 'krb': 
-                alertmsg = 'You need to specify the Kerberos domain';
+                alertmsg = '$alert{'krb'}';
                 break;
             case 'loc':
             case 'fsys':
-                alertmsg = 'You need to specify the initial password';
+                alertmsg = '$alert{'ipass'}';
                 break;
             case 'fsys':
                 alertmsg = '';
@@ -251,25 +303,59 @@ function verify_message (vf,founduname,f
             return;
         }
     }
-
-    if (foundname==0) { message='No name fields specified. '; }
-    if (foundid==0) { message+='No ID or student number field specified. '; }
-    if (foundsec==0) { message+='No section or group field specified. '; }
+END
+    my $optional_checks = '';
+    if ($mode eq 'createcourse') {
+        $optional_checks = (<<END);
+    vf.submit();
+}
+END
+    } else {
+        $optional_checks = (<<END);
+    var message='';
+    if (foundname==0) { 
+        message='$alert{'name'}';
+    }
+    if (foundid==0) { 
+        if (message!='') { 
+            message+='\\n'; 
+        }
+        message+='$alert{'snum'}';
+    }
+    if (foundsec==0) {
+        if (message!='') {
+            message+='\\n';
+        } 
+        message+='$alert{'section'}';
+    }
+    if (foundemail==0) {
+        if (message!='') {
+            message+='\\n';
+        }
+        message+='$alert{'email'}';
+    }
     if (message!='') {
-       message+='Continue enrollment?';
-       if (confirm(message)) {
-          vf.state.value='enrolling';
-	  vf.submit();
-       }
+        message+= '\\n$alert{'continue'}';
+        if (confirm(message)) {
+            vf.state.value='enrolling';
+            vf.submit();
+        }
     } else {
-      vf.state.value='enrolling';
-      vf.submit();
+        vf.state.value='enrolling';
+        vf.submit();
     }
 }
-
-$authheader
-ENDPICK
-
+END
+    }
+    my $result = $function_name;
+    if ( ($mode eq 'auth') || ($mode eq 'createcourse') ) {
+        $result .= $auth_checks;
+    }
+    $result .= $optional_checks;
+    if ( ($mode eq 'auth') || ($mode eq 'createcourse') ) {
+        $result .= $authheader;
+    }
+    return $result;
 }
 
 ###############################################################
@@ -282,6 +368,7 @@ function verify(vf) {
     var foundname=0;
     var foundid=0;
     var foundsec=0;
+    var foundemail=0;
     var tw;
     for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');
@@ -290,8 +377,9 @@ function verify(vf) {
         if (tw==7) { foundid=1; }
         if (tw==8) { foundsec=1; }
         if (tw==9) { foundpwd=1; }
+        if (tw==10) { foundemail=1; }
     }
-    verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
+    verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail);
 }
 
 //
@@ -310,7 +398,8 @@ function verify(vf) {
 // 7 = id
 // 8 = section
 // 9 = ipwd  (password)
-//
+// 10 = email address
+
 function flip(vf,tf) {
    var nw=eval('vf.f'+tf+'.selectedIndex');
    var i;
@@ -433,79 +522,86 @@ sub print_upload_manager_footer {
     my $locform = &Apache::loncommon::authform_local(%param);
     my $domform = &domain_form($defdom);
     my $date_table = &date_setting_table();
-    $r->print(<<ENDPICK);
-</table>
-<input type=hidden name=nfields value=$i>
-<input type=hidden name=keyfields value="$keyfields">
-<h3>Login Type</h3>
-<p>Note: this will not take effect if the user already exists</p>
-<p>
-$krbform
-</p>
-<p>
-$intform
-</p>
-<p>
-$locform
-</p>
-<h3>LON-CAPA Domain for Students</h3>
-LON-CAPA domain: $domform <p>
-<h3>Starting and Ending Dates</h3>
-<p>
-$date_table
-</p>
-<h3>Full Update</h3>
-<input type=checkbox name=fullup value=yes> Full update 
-(also print list of users not enrolled anymore)<p>
-<h3>ID/Student Number</h3>
-<input type=checkbox name=forceid value=yes> 
-Disable ID/Student Number Safeguard and Force Change of Conflicting IDs
-(only do if you know what you are doing)<p>
-<input type="button" onClick="javascript:verify(this.form)" value="Update Courselist" /><br />
-Note: for large courses, this operation may be time consuming.
-ENDPICK
+    my $Str = "</table>\n";
+    $Str .= &hidden_input('nfields',$i);
+    $Str .= &hidden_input('keyfields',$keyfields);
+    $Str .= '<h3>'.&mt('Login Type')."</h3>\n";
+    $Str .= "<p>\n".
+        &mt('Note: this will not take effect if the user already exists').
+        "</p><p>\n";
+    $Str .= $krbform."\n</p><p>\n".
+        $intform."\n</p><p>\n".
+        $locform."\n</p>\n";
+    $Str .= '<h3>'.&mt('LON-CAPA Domain for Students')."</h3>\n";
+    $Str .= "<p>\n".&mt('LON-CAPA domain: [_1]',$domform)."\n</p>\n";
+    $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n";
+    $Str .= "<p>\n".$date_table."</p>\n";
+    $Str .= "<h3>".&mt('Full Update')."</h3>\n";
+    $Str .= '<input type="checkbox" name="fullup" value="yes">'.
+        ' '.&mt('Full update (also print list of users not enrolled anymore)').
+        "</p>\n";
+    $Str .= "<h3>".&mt('Student Number')."</h3>\n";
+    $Str .= "<p>\n".'<input type="checkbox" name="forceid" value="yes">';
+    $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '.
+                'of Conflicting IDs (only do if you know what you are doing)').
+                "\n</p><p>\n";
+    $Str .= '<input type="button" onClick="javascript:verify(this.form)" '.
+        'value="Update Courselist" />'."<br />\n";
+    $Str .= &mt('Note: for large courses, this operation may be time '.
+                'consuming');
+    $r->print($Str);
+    return;
 }
 
-# ======================================================= Menu Phase Two Upload
+###############################################################
+###############################################################
 sub print_upload_manager_form {
     my $r=shift;
-
+    my $firstLine;
     my $datatoken;
     if (!$ENV{'form.datatoken'}) {
-      $datatoken=&Apache::loncommon::upfile_store($r);
+        $datatoken=&Apache::loncommon::upfile_store($r);
     } else {
-      $datatoken=$ENV{'form.datatoken'};
-      &Apache::loncommon::load_tmp_file($r);
+        $datatoken=$ENV{'form.datatoken'};
+        &Apache::loncommon::load_tmp_file($r);
     }
     my @records=&Apache::loncommon::upfile_record_sep();
+    if($ENV{'form.noFirstLine'}){
+        $firstLine=shift(@records);
+    }
     my $total=$#records;
     my $distotal=$total+1;
     my $today=time;
     my $halfyear=$today+15552000;
-    my $defdom=$r->dir_config('lonDefDomain');
+    my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     my ($krbdef,$krbdefdom) =
         &Apache::loncommon::get_kerberos_defaults($defdom);
     &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom);
     my $i;
     my $keyfields;
     if ($total>=0) {
-	my @d=(['username','Username'],
-               ['names','Last Name, First Names'],
-	       ['fname','First Name'],
-               ['mname','Middle Names/Initials'],
-	       ['lname','Last Name'],
-               ['gen','Generation'],
-	       ['id','ID/Student Number'],
-               ['sec','Group/Section'],
-	       ['ipwd','Initial Password']);
+        my @field=(['username',&mt('Username')],
+                   ['names',&mt('Last Name, First Names')],
+                   ['fname',&mt('First Name')],
+                   ['mname',&mt('Middle Names/Initials')],
+                   ['lname',&mt('Last Name')],
+                   ['gen',&mt('Generation')],
+                   ['id',&mt('ID/Student Number')],
+                   ['sec',&mt('Group/Section')],
+                   ['ipwd',&mt('Initial Password')],
+                   ['email',&mt('EMail Address')]);
 	if ($ENV{'form.upfile_associate'} eq 'reverse') {	
 	    &Apache::loncommon::csv_print_samples($r,\@records);
-	    $i=&Apache::loncommon::csv_print_select_table($r,\@records,\@d);
-	    foreach (@d) { $keyfields.=$_->[0].','; }
+	    $i=&Apache::loncommon::csv_print_select_table($r,\@records,
+                                                          \@field);
+	    foreach (@field) { 
+                $keyfields.=$_->[0].','; 
+            }
 	    chop($keyfields);
 	} else {
-	    unshift(@d,['none','']);
-	    $i=&Apache::loncommon::csv_samples_select_table($r,\@records,\@d);
+	    unshift(@field,['none','']);
+	    $i=&Apache::loncommon::csv_samples_select_table($r,\@records,
+                                                            \@field);
 	    my %sone=&Apache::loncommon::record_sep($records[0]);
 	    $keyfields=join(',',sort(keys(%sone)));
 	}
@@ -513,9 +609,12 @@ sub print_upload_manager_form {
     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
 }
 
-# ======================================================= Enroll single student
+###############################################################
+###############################################################
 sub enroll_single_student {
     my $r=shift;
+    # Remove non alphanumeric values from section
+    $ENV{'form.csec'}=~s/\W//g;
     #
     # We do the dates first because the action of making them the defaul
     # in the course is entirely seperate from the action of enrolling the
@@ -583,31 +682,39 @@ sub enroll_single_student {
                 $r->print("unable to enroll: ".$login_result);
             }
 	} else {
-            $r->print('<p><font color="#ff0000">ERROR</font>&nbsp;'.
-                      'Invalid login mode or password.  '.
-                      'Unable to enroll '.$ENV{'form.cuname'}.'.</p>');
-        }          
+            $r->print('<p><font color="#ff0000">ERROR</font>&nbsp;');
+            if ($amode =~ /^krb/) {
+                $r->print('Missing Kerberos domain information.  ');
+            } else {
+                $r->print('Invalid login mode or password.  ');
+            }
+            $r->print('<b>Unable to enroll '.$ENV{'form.cuname'}.'.</b></p>');
+        }
     } else {
         $r->print('Invalid username or domain');
     }    
 }
 
 sub setup_date_selectors {
-    my ($starttime,$endtime) = @_;
+    my ($starttime,$endtime,$mode) = @_;
     if (! defined($starttime)) {
         $starttime = time;
-        if (exists($ENV{'course.'.$ENV{'request.course.id'}.
+        unless ($mode eq 'createcourse') {
+            if (exists($ENV{'course.'.$ENV{'request.course.id'}.
                             '.default_enrollment_start_date'})) {
-            $starttime = $ENV{'course.'.$ENV{'request.course.id'}.
+                $starttime = $ENV{'course.'.$ENV{'request.course.id'}.
                                   '.default_enrollment_start_date'};
+            }
         }
     }
     if (! defined($endtime)) {
         $endtime = time+(6*30*24*60*60); # 6 months from now, approx
-        if (exists($ENV{'course.'.$ENV{'request.course.id'}.
+        unless ($mode eq 'createcourse') {
+            if (exists($ENV{'course.'.$ENV{'request.course.id'}.
                             '.default_enrollment_end_date'})) {
-            $endtime = $ENV{'course.'.$ENV{'request.course.id'}.
+                $endtime = $ENV{'course.'.$ENV{'request.course.id'}.
                                 '.default_enrollment_end_date'};
+            }
         }
     }
     my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform',
@@ -616,6 +723,14 @@ sub setup_date_selectors {
     my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform',
                                                           'enddate',
                                                           $endtime);
+    if ($mode eq 'createcourse') {
+        $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs',
+                                                            'startdate',
+                                                            $starttime);
+        $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs',
+                                                          'enddate',
+                                                          $endtime);
+    }
     return ($startdateform,$enddateform);
 }
 
@@ -629,11 +744,14 @@ sub get_dates_from_form {
 }
 
 sub date_setting_table {
-    my ($starttime,$endtime) = @_;
-    my ($startform,$endform)=&setup_date_selectors($starttime,$endtime);
+    my ($starttime,$endtime,$mode) = @_;
+    my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);
     my $dateDefault = '<nobr>'.
         '<input type="checkbox" name="makedatesdefault" />'.
         ' make these dates the default for future enrollment';
+    if ($mode eq 'createcourse') {
+        $dateDefault = '&nbsp;';
+    }
     my $perpetual = '<nobr><input type="checkbox" name="no_end_date"';
     if (defined($endtime) && $endtime == 0) {
         $perpetual .= ' checked';
@@ -671,32 +789,131 @@ sub make_dates_default {
     return $result;
 }
 
-# ======================================================= Menu Phase Two Enroll
+##
+## Single student enrollment routines (some of them)
+##
+sub get_student_username_domain_form {
+    my $r = shift;
+    my $domform = &Apache::loncommon::select_dom_form
+        ($ENV{'course.'.$ENV{'request.course.id'}.'.domain'},'cudomain',0);
+    $r->print(<<END);
+<input type="hidden" name="action" value="enrollstudent" />
+<input type="hidden" name="state"  value="gotusername" />
+<h3>Enroll One Student</h3>
+<table>
+<tr><th>Username:</th>
+    <td><input type="text" name="cuname"  size="15" /></td></tr>
+<tr><th>Domain:</th>
+    <td>$domform</td></tr>
+<tr><th>&nbsp;</th>
+    <td>
+    <input type="submit" name="Begin Enrollment" value="Begin Enrollment" />
+    </td></tr>
+</table>
+END
+    return;
+}
+
 sub print_enroll_single_student_form {
     my $r=shift;
     $r->print("<h3>Enroll One Student</h3>");
-    my $today    = time;
-    my $halfyear = $today+15552000;
-    my $defdom=$r->dir_config('lonDefDomain');
-    # Set up authentication forms
-    my ($krbdef,$krbdefdom) =
-        &Apache::loncommon::get_kerberos_defaults($defdom);
-    my $javascript_validations=&javascript_validations($krbdefdom);
-    my %param = ( formname => 'document.studentform',
-                  kerb_def_dom => $krbdefdom,
-                  kerb_def_auth => $krbdef
-                  );
-    my $krbform = &Apache::loncommon::authform_kerberos(%param);
-    my $intform = &Apache::loncommon::authform_internal(%param);
-    my $locform = &Apache::loncommon::authform_local(%param);
-    # Set up domain selection form
-    my $domform = &domain_form($defdom);
+    #
+    my $username = $ENV{'form.cuname'};
+    my $domain   = $ENV{'form.cudomain'};
+    my $home = &Apache::lonnet::homeserver($username,$domain);
+    # $new_user flags whether we are creating a new user or using an old one
+    my $new_user = 1;
+    if ($home ne 'no_host') {
+        $new_user = 0;
+    }
+    #
+    my $user_data_html = '';
+    my $javascript_validations = '';
+    if ($new_user) {
+        my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
+        # Set up authentication forms
+        my ($krbdef,$krbdefdom) =
+            &Apache::loncommon::get_kerberos_defaults($domain);
+        $javascript_validations=&javascript_validations('auth',$krbdefdom);
+        my %param = ( formname => 'document.studentform',
+                      kerb_def_dom => $krbdefdom,
+                      kerb_def_auth => $krbdef
+                      );
+        my $krbform = &Apache::loncommon::authform_kerberos(%param);
+        my $intform = &Apache::loncommon::authform_internal(%param);
+        my $locform = &Apache::loncommon::authform_local(%param);
+        #
+        # Set up domain selection form
+        my $homeserver_form = '';
+        my %servers = &Apache::loncommon::get_library_servers($domain);
+        $homeserver_form = '<select name="lcserver" size="1">'."\n".
+            '<option value="default" selected>default</option>'."\n";
+        while (my ($servername,$serverdescription) = each (%servers)) {
+            $homeserver_form .= '<option value="'.$servername.'">'.
+                $serverdescription."</option>\n";
+        }
+        $homeserver_form .= "</select>\n";
+        #
+        #
+        $user_data_html = <<END;
+<h3>User Data for $username\@$domain</h3>
+<table>
+<tr><th>First Name:</th>
+    <td><input type="text" name="cfirst"  size="15"></td></tr>
+<tr><th>Middle Name:</th>
+    <td><input type="text" name="cmiddle" size="15"></td></tr>
+<tr><th>Last Name:</th>
+    <td><input type="text" name="clast"   size="15"></td></tr>
+<tr><th>Generation:</th>
+    <td><input type="text" name="cgen"    size="5"> </td></tr>
+<tr><th>Home Server:</th>
+    <td>$homeserver_form</td></tr>
+</table>
+<h3>Password</h3>
+Please select an authentication mechanism
+<table>
+<p>
+$krbform
+<br />
+$intform
+<br />
+$locform
+</p>
+END
+    } else {
+        # User already exists.  Do not worry about authentication
+        my %uenv = &Apache::lonnet::dump('environment',$domain,$username);
+        $javascript_validations = &javascript_validations('noauth');
+        $user_data_html = <<END;
+<h3>User Data for $username\@$domain</h3>
+<input type="hidden" name="lcserver" value="default" />
+<table>
+<tr><th>First Name:</th>
+    <td>
+    <input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" />
+    </td></tr>
+<tr><th>Middle Name:</th>
+    <td>
+    <input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" />
+    </td></tr>
+<tr><th>Last Name:</th>
+    <td>
+    <input type="text" name="clast"value="$uenv{'lastname'}" size="15" />
+    </td></tr>
+<tr><th>Generation:</th>
+    <td>
+    <input type="text" name="cgen" value="$uenv{'generation'}" size="5" />
+    </td></tr>
+</table>
+END
+    }
     my $date_table = &date_setting_table();
-    # Print it all out
+        # Print it all out
     $r->print(<<END);
-<input type="hidden" name="action" value="enrollstudent">
-<input type="hidden" name="state"  value="done">
-
+<input type="hidden" name="action" value="enrollstudent" />
+<input type="hidden" name="state"  value="done" />
+<input type="hidden" name="cuname" value="$username" />
+<input type="hidden" name="lcdomain" value="$domain" />
 <script type="text/javascript" language="Javascript">
 function verify(vf) {
     var founduname=0;
@@ -733,25 +950,8 @@ function clearpwd(vf) {
 }
 
 </script>
-<h3>Personal Data</h3>
-<table>
-<tr><td>First Name:</td><td> <input type="text" name="cfirst"  size="15"></td></tr>
-<tr><td>Middle Name:</td><td> <input type="text" name="cmiddle" size="15"></td></tr>
-<tr><td>Last Name: </td><td><input type="text" name="clast"   size="15"></td></tr>
-<tr><td>Generation: </td><td><input type="text" name="cgen"    size="5"> </td></tr>
-</table>
 
-<h3>Login Data</h3>
-<p>Username: <input type="text" name="cuname"  size="15"></p>
-<p>Domain:   $domform</p>
-<p>Note: login settings below  will not take effect if the user already exists
-</p><p>
-$krbform
-</p><p>
-$intform
-</p><p>
-$locform
-</p><p>
+$user_data_html
 
 <h3>Course Data</h3>
 
@@ -776,7 +976,7 @@ END
 # ========================================================= Menu Phase Two Drop
 sub print_drop_menu {
     my $r=shift;
-    $r->print("<h3>Drop Students</h3>");
+    $r->print("<h3>".&mt('Drop Students')."</h3>");
     my $cid=$ENV{'request.course.id'};
     my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
     if (! defined($classlist)) {
@@ -803,7 +1003,7 @@ sub print_html_classlist {
 <input type="hidden" name="action" value="$ENV{'form.action'}" />
 <input type="hidden" name="state"  value="" />
 <p>
-<font size="+1">Current Classlist</font>
+<font size="+1">Current Class List</font>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 END
     if ($ENV{'form.action'} ne 'modifystudent') {
@@ -895,7 +1095,7 @@ END
             $r->print('"'.join('","',("username","domain","ID","student name",
                                       "section","status")).'"'."\n");
         } else {
-            $r->print('"'.join('","',("username","domain","ID","student name",
+            $r->print('"'.join('","',(&mt("username"),"domain","ID","student name",
                                       "section")).'"'."\n");
         }
     } elsif ($mode eq 'excel') {
@@ -908,7 +1108,7 @@ END
         $excel_workbook->set_tempdir('/home/httpd/perl/tmp');
         $excel_sheet = $excel_workbook->addworksheet('classlist');
         #
-        my $description = 'Classlist for '.
+        my $description = 'Class List for '.
             $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
         $excel_sheet->write($row++,0,$description);
         #
@@ -1020,6 +1220,11 @@ sub print_modify_student_form {
     }
     # determine the students starting and ending times and section
     my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom);
+    if ($starttime =~ /^error/) {
+        $r->print('<h2>Error</h2>');
+        $r->print('<p>'.$starttime.'</p>');
+        return;
+    }
     # Deal with date forms
     my $date_table = &date_setting_table($starttime,$endtime);
     #
@@ -1075,6 +1280,9 @@ END
 sub modify_single_student {
     my $r = shift;
     #
+    # Remove non alphanumeric values from the section
+    $ENV{'form.section'} =~ s/\W//g;
+    #
     # Do the date defaults first
     my ($starttime,$endtime) = &get_dates_from_form();
     if ($ENV{'form.makedatesdefault'}) {
@@ -1216,7 +1424,7 @@ sub get_enrollment_data {
     my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
     my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles
-    return "666" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
+    return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i);
     # Go through the roles looking for enrollment in this course
     my ($end,$start) = (undef,undef);
     my $section = '';
@@ -1314,19 +1522,23 @@ END
 END
 
     } else  {
+        my $wordusername=&mt('username');
+        my $worddomain=&mt('domain');
+        my $wordstudentname=&mt('student name');
+        my $wordsection=&mt('section');
         $r->print(<<END);
 <table border=2>
 <tr><th>&nbsp;</th>
     <th>
-       <a href="/adm/dropadd?action=$action&sortby=username">username</a>
+       <a href="/adm/dropadd?action=$action&sortby=username">$wordusername</a>
     </th><th>
-       <a href="/adm/dropadd?action=$action&sortby=domain">domain</a>
+       <a href="/adm/dropadd?action=$action&sortby=domain">$worddomain</a>
     </th><th>
        <a href="/adm/dropadd?action=$action&sortby=id">ID</a>
     </th><th>
-       <a href="/adm/dropadd?action=$action&sortby=fullname">student name</a>
+       <a href="/adm/dropadd?action=$action&sortby=fullname">$wordstudentname</a>
     </th><th>
-       <a href="/adm/dropadd?action=$action&sortby=section">section</a>
+       <a href="/adm/dropadd?action=$action&sortby=section">$wordsection</a>
     </th>
 </tr>
 END
@@ -1370,11 +1582,14 @@ END
 END
     }
     $r->print('</table><br>');
+    my $DropStudents=&mt('Drop Students');
+    my $CheckAll=&mt('check all');
+    my $UncheckAll=&mt('uncheck all');
     $r->print(<<"END");
 </p><p>
-<input type="button" value="check all" onclick="javascript:checkAll(document.studentform.droplist)"> &nbsp;
-<input type="button" value="uncheck all" onclick="javascript:uncheckAll(document.studentform.droplist)"> 
-<p><input type=submit value="Drop Students"></p>
+<input type="button" value="$CheckAll" onclick="javascript:checkAll(document.studentform.droplist)"> &nbsp;
+<input type="button" value="$UncheckAll" onclick="javascript:uncheckAll(document.studentform.droplist)"> 
+<p><input type=submit value="$DropStudents"></p>
 END
     return;
 }
@@ -1384,26 +1599,25 @@ END
 #
 sub print_first_courselist_upload_form {
     my $r=shift;
-    my $upfile_select=&Apache::loncommon::upfile_select_html();
-    my $create_classlist_help = 
-	&Apache::loncommon::help_open_topic("Course_Create_Class_List",
-           "How do I create a class list from a spreadsheet");
-    my $create_csv_help =
-	&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
-           "How do I create a CSV file from a spreadsheet");
-    $r->print(<<ENDUPFORM);
-<input type=hidden name=phase value=two>
-<h3>Upload a courselist</h3>
-$upfile_select
-<p>
-<input type=submit name="fileupload" value="Upload Courselist">
-<input type="hidden" name="action" value="upload" />
-<input type="hidden" name="state"  value="got_file" />
-</p>
-$create_classlist_help <br />
-$create_csv_help
-</body></html>
-ENDUPFORM
+    my $str;
+    $str  = '<input type="hidden" name="phase" value="two">';
+    $str .= '<input type="hidden" name="action" value="upload" />';
+    $str .= '<input type="hidden"   name="state"  value="got_file" />';
+    $str .= "<h3>".&mt('Upload a class list')."</h3>\n";
+    $str .= &Apache::loncommon::upfile_select_html();
+    $str .= "<p>\n";
+    $str .= '<input type="submit" name="fileupload" value="'.
+        &mt('Upload class list').'">'."\n";
+    $str .= '<input type="checkbox" name="noFirstLine" /> '.
+        &mt('Ignore First Line')."</p>\n";
+    $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
+                         &mt("How do I create a class list from a spreadsheet")).
+                             "<br />\n";
+    $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
+                           &mt("How do I create a CSV file from a spreadsheet")).
+                               "<br />\n";
+    $str .= "</body>\n</html>\n";
+    $r->print($str);
     return;
 }
 
@@ -1412,6 +1626,7 @@ sub upfile_drop_add {
     my $r=shift;
     &Apache::loncommon::load_tmp_file($r);
     my @studentdata=&Apache::loncommon::upfile_record_sep();
+    if($ENV{'form.noFirstLine'}){shift(@studentdata);}
     my @keyfields = split(/\,/,$ENV{'form.keyfields'});
     my $cid = $ENV{'request.course.id'};
     my %fields=();
@@ -1437,8 +1652,9 @@ sub upfile_drop_add {
     } else {
         my %home_servers = &Apache::loncommon::get_library_servers($domain);
         if (! exists($home_servers{$desiredhost})) {
-            $r->print('<font color="#ff0000">Error:</font>'.
-                      'Invalid home server specified');
+            $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
+                      &mt('Invalid home server specified'));
+            $r->print("</body>\n</html>\n");
             return;
         }
     }
@@ -1460,11 +1676,19 @@ sub upfile_drop_add {
             $genpwd=$ENV{'form.locarg'};
         }
     }
+    if ($amode =~ /^krb/) {
+        if (! defined($genpwd) || $genpwd eq '') {
+            $r->print('<font color="red" size="+1">'.
+                      &mt('Unable to enroll students').'</font>  '.
+                      &mt('No Kerberos domain was specified.').'</p>');
+            $amode = ''; # This causes the loop below to be skipped
+        }
+    }
     unless (($domain=~/\W/) || ($amode eq '')) {
         #######################################
         ##         Enroll Students           ##
         #######################################
-        $r->print('<h3>Enrolling Students</h3>');
+        $r->print('<h3>'.&mt('Enrolling Students')."</h3>\n<p>\n");
         my $count=0;
         my $flushc=0;
         my %student=();
@@ -1493,9 +1717,10 @@ sub upfile_drop_add {
                     }
                 }
                 if ($entries{$fields{'username'}}=~/\W/) {
-                    $r->print('<p><b>Unacceptable username: '.
-                              $entries{$fields{'username'}}.' for user '.
-                              $fname.' '.$mname.' '.$lname.' '.$gen.'</b><p>');
+                    $r->print('<br />'.
+      &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',
+          $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
+                              '</b>');
                 } else {
                     # determine section number
                     my $sec='';
@@ -1505,6 +1730,8 @@ sub upfile_drop_add {
                             $sec=$entries{$fields{'sec'}};
                         }
                     }
+                    # remove non alphanumeric values from section
+                    $sec =~ s/\W//g;
                     # determine student id number
                     my $id='';
                     if (defined($fields{'id'})) {
@@ -1513,6 +1740,14 @@ sub upfile_drop_add {
                         }
                         $id=~tr/A-Z/a-z/;
                     }
+                    # determine email address
+                    my $email='';
+                    if (defined($fields{'email'})) {
+                        if (defined($entries{$fields{'email'}})) {
+                            $email=$entries{$fields{'email'}};
+                            unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
+                        }
+                    }
                     # determine student password
                     my $password='';
                     if ($genpwd) { 
@@ -1529,17 +1764,18 @@ sub upfile_drop_add {
                              \$lname,\$gen,\$sec) {
                         $$_ =~ s/(\s+$|^\s+)//g;
                     }
-                    if ($password) {
+                    if ($password || $ENV{'form.login'} eq 'loc') {
                         &modifystudent($domain,$username,$cid,$sec,
                                        $desiredhost);
                         my $reply=&Apache::lonnet::modifystudent
                             ($domain,$username,$id,$amode,$password,
                              $fname,$mname,$lname,$gen,$sec,$enddate,
-                             $startdate,$ENV{'form.forceid'},$desiredhost);
+                             $startdate,$ENV{'form.forceid'},$desiredhost,
+                             $email);
                         if ($reply ne 'ok') {
-                            $r->print('<p><b>'.
-                                      'Error enrolling '.$username.': '.
-                                      $reply.'</b></p>');
+                            $reply =~ s/^error://;
+                            $r->print('<br />'.
+                &mt('<b>[_1]</b>:  Unable to enroll: [_2]',$username,$reply));
          		} else {
                             $count++; $flushc++;
                             $student{$username}=1;
@@ -1550,23 +1786,28 @@ sub upfile_drop_add {
                             }
                         }
                     } else {
-                        $r->print("<p><b>No password for $username</b><p>");
+                        $r->print('<br />'.
+      &mt('<b>[_1]</b>: Unable to enroll.  No password specified.',$username)
+                                  );
                     }
                 }
             }
         } # end of foreach (@studentdata)
-        $r->print('<p>Processed Students: '.$count.'</p>');
-        $r->print("<p>If active, the new role will be available when the ".
-                  "students next log in to LON-CAPA.</p>");
+        $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count).
+                  "</p>\n");
+        $r->print("<p>\n".
+                  &mt('If active, the new role will be available when the '.
+                  'students next log in to LON-CAPA.')."</p>\n");
         #####################################
         #           Drop students           #
         #####################################
         if ($ENV{'form.fullup'} eq 'yes') {
-            $r->print('<h3>Dropping Students</h3>');
+            $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");
             #  Get current classlist
             my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
             if (! defined($classlist)) {
-                $r->print("There are no students currently enrolled.\n");
+                $r->print(&mt('There are no students currently enrolled.').
+                          "\n");
             } else {
                 # Remove the students we just added from the list of students.
                 foreach (@studentdata) {
@@ -1599,15 +1840,16 @@ sub drop_student_list {
         # drop student
         my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});
         if ($result eq 'ok' || $result eq 'ok:') {
-            $r->print('Dropped '.$uname.' @ '.$udom.'<br>');
+            $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
             $count++;
         } else {
-            $r->print('Error dropping '.$uname.' @ '.$udom.': '.$result.
+            $r->print(
+          &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
                       '<br />');
         }
     }
-    $r->print('<p><b>Dropped '.$count.' student(s).</b>');
-    $r->print('<p>Re-enrollment will re-activate data.') if ($count);
+    $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>');
+    $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
 }
 
 ###################################################################
@@ -1631,7 +1873,8 @@ The response to the request is governed
  upload           enrolling      enroll students based on upload
  drop             undefined      print the classlist ready to drop
  drop             done           drop the selected students
- enrollstudent    undefined      print single student enroll menu
+ enrollstudent    undefined      print student username domain form
+ enrollstudent    gotusername    print single student enroll menu
  enrollstudent    enrolling      enroll student
  classlist        undefined      print html classlist
  classlist        csv            print csv classlist
@@ -1646,7 +1889,7 @@ The response to the request is governed
 sub handler {
     my $r=shift;
     if ($r->header_only) {
-        $r->content_type('text/html');
+        &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         return OK;
     }
@@ -1667,7 +1910,7 @@ sub handler {
         $r->content_type('text/csv');
     } else {
         # Start page
-        $r->content_type('text/html');
+        &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         $r->print(&header());
     }
@@ -1699,11 +1942,13 @@ sub handler {
         }
     } elsif ($ENV{'form.action'} eq 'enrollstudent') {
         if (! exists($ENV{'form.state'})) {
+            &get_student_username_domain_form($r);
+        } elsif ($ENV{'form.state'} eq 'gotusername') {
             &print_enroll_single_student_form($r);
         } elsif ($ENV{'form.state'} eq 'enrolling') {
             &enroll_single_student($r);
         } else {
-            &print_enroll_single_student_form($r);
+            &get_student_username_domain_form($r);
         }
     } elsif ($ENV{'form.action'} eq 'classlist') {
         if (! exists($ENV{'form.state'})) {