--- loncom/interface/Attic/londropadd.pm	2002/04/23 21:03:59	1.29
+++ loncom/interface/Attic/londropadd.pm	2002/05/01 20:15:41	1.36
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to drop and add students in courses 
 #
-# $Id: londropadd.pm,v 1.29 2002/04/23 21:03:59 matthew Exp $
+# $Id: londropadd.pm,v 1.36 2002/05/01 20:15:41 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -75,7 +75,7 @@ ENDHEAD
 
 # =========== Drop student from all sections of a course, except optional $csec
 sub modifystudent {
-    my ($udom,$unam,$courseid,$csec)=@_;
+    my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
     # if $csec is undefined, drop the student from all the courses matching
     # this one.  If $csec is defined, drop them from all other sections of 
     # this course and add them to section $csec
@@ -84,24 +84,61 @@ sub modifystudent {
     my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
     my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles
-    return if ($tmp =~ /^(con_lost|error|no_such_host)/i);
+    return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
     # Go through the roles looking for enrollment in this course
+    my $result = '';
     foreach my $course (keys(%roles)) {
-        my $value = $roles{$course};
-        if ($course=~/^$courseid(?:\/)*(\w+)*\_st$/) {
+        if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) {
             # We are in this course
             my $section=$1;
             $section='' if ($course eq $courseid.'_st');
-            if (((!$section) && (!$csec)) || ($section ne $csec)) {
+            if ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
                 my (undef,$end,$start)=split(/\_/,$roles{$course});
                 my $now=time;
                 if (!($start && ($now<$start)) || !($end && ($now>$end))) {
                     my $reply=&Apache::lonnet::modifystudent
-                        ($udom,$unam,'','','','','','','',$section,time);
+                        ($udom,$unam,'','','','','','','',
+                         $section,time,undef,undef,$desiredhost);
+                    $result .= $reply.':';
                 }
             }
         }
     }
+    if ($result eq '') {
+        $result eq 'Unable to find section for this student';
+    } elsif ($result =~ /^(ok:)+$/) {
+        $result eq 'ok';
+    }
+    return $result;
+}
+
+# ============ build a domain and server selection form
+sub domain_form {
+    my ($defdom) = @_;
+    # Set up domain and server selection forms
+    #
+    # Get the domains
+    my @domains = &Apache::loncommon::get_domains();
+    # build up the menu information to be passed to 
+    # &Apache::loncommon::linked_select_forms
+    my %select_menus;
+    foreach my $dom (@domains) {
+        # set up the text for this domain
+        $select_menus{$dom}->{'text'}= $dom;
+        # we want a choice of 'default' as the default in the second menu
+        $select_menus{$dom}->{'default'}= 'default';
+        $select_menus{$dom}->{'select2'}->{'default'} = 'default';
+        # Now build up the other items in the second menu
+        my %servers = &Apache::loncommon::get_home_servers($dom);
+        foreach my $server (keys(%servers)) {
+            $select_menus{$dom}->{'select2'}->{$server} 
+                                            = "$server $servers{$server}";
+        }
+    }
+    my $result  = &Apache::loncommon::linked_select_forms
+        ('studentform',' with home server ',$defdom,
+         'lcdomain','lcserver',\%select_menus);
+    return $result;
 }
 
 # ============================================================== Menu Phase One
@@ -138,7 +175,8 @@ sub phase_two_header {
 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="submit" name="associate"  value="Reverse Association" />
+<input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
+<input type="hidden" name="associate"  value="" />
 <input type="hidden" name="phase"      value="three" />
 <input type="hidden" name="datatoken"  value="$datatoken" />
 <input type="hidden" name="fileupload" value="$ENV{'form.fileupload'}" />
@@ -382,8 +420,7 @@ sub phase_two_end {
     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 = &Apache::loncommon::select_dom_form($defdom,'lcdomain');    
+    my $domform = &domain_form($defdom);
     $r->print(<<ENDPICK);
 </table>
 <input type=hidden name=nfields value=$i>
@@ -421,7 +458,7 @@ LON-CAPA domain: $domform <p>
 <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="verify(this.form)" value="Update Courselist"><br>
+<input type="button" onClick="javascript:verify(this.form)" value="Update Courselist" /><br />
 Note: for large courses, this operation might be time consuming.
 ENDPICK
 }
@@ -474,9 +511,25 @@ sub menu_phase_two_upload {
 sub enroll_single_student {
     my $r=shift;
     $r->print('<h3>Enrolling Student</h3>');
-    $r->print($ENV{'form.cuname'}." in domain ".$ENV{'form.cdomain'}.": ");
+    $r->print('<p>Enrolling '.$ENV{'form.cuname'}." in domain ".
+              $ENV{'form.lcdomain'}.'</p>');
     if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&&
-        ($ENV{'form.cdomain'})&&($ENV{'form.cdomain'}!~/\W/)) {
+        ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) {
+        # Deal with home server selection
+        my $domain=$ENV{'form.lcdomain'};
+        my $desiredhost = $ENV{'form.lcserver'};
+        if (lc($desiredhost) eq 'default') {
+            $desiredhost = undef;
+        } else {
+            my %home_servers = &Apache::loncommon::get_home_servers($domain);
+            if (! exists($home_servers{$desiredhost})) {
+                $r->print('<font color="#ff0000">Error:</font>'.
+                          'Invalid home server specified');
+                return;
+            }
+        }
+        $r->print(" with server $desiredhost :") if (defined($desiredhost));
+        # End of home server selection logic
 	my $amode='';
         my $genpwd='';
         if ($ENV{'form.login'} eq 'krb') {
@@ -490,18 +543,24 @@ sub enroll_single_student {
 	    $genpwd=$ENV{'form.locarg'};
 	    if (!$genpwd) { $genpwd=" "; }
 	}
-        if (($amode) && ($genpwd)) {
-            &modifystudent($ENV{'form.cdomain'},$ENV{'form.cuname'},
-                           $ENV{'request.course.id'},$ENV{'form.csec'});
+        my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'},
+                                                   $ENV{'form.lcdomain'});
+        if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {
+            &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'},
+                           $ENV{'request.course.id'},$ENV{'form.csec'},
+                            $desiredhost);
           $r->print(&Apache::lonnet::modifystudent(
-                      $ENV{'form.cdomain'},$ENV{'form.cuname'},
+                      $ENV{'form.lcdomain'},$ENV{'form.cuname'},
                       $ENV{'form.cstid'},$amode,$genpwd,
  	              $ENV{'form.cfirst'},$ENV{'form.cmiddle'},
                       $ENV{'form.clast'},$ENV{'form.cgen'},
                       $ENV{'form.csec'},$ENV{'form.enddate'},
-                      $ENV{'form.startdate'},$ENV{'form.forceid'}));
+                      $ENV{'form.startdate'},$ENV{'form.forceid'},
+                    $desiredhost));
 	} else {
-           $r->print('Invalid login mode or password');    
+            $r->print('<p><font color="#ff0000">ERROR</font>&nbsp;'.
+                      'Invalid login mode or password.  '.
+                      'Unable to enroll '.$ENV{'form.cuname'}.'.</p>');
         }          
     } else {
         $r->print('Invalid username or domain');
@@ -523,7 +582,7 @@ sub menu_phase_two_enroll {
     my $intform = &Apache::loncommon::authform_internal(%param);
     my $locform = &Apache::loncommon::authform_local(%param);
     # Set up domain selection form
-    my $domform = &Apache::loncommon::select_dom_form($defdom,'cdomain');    
+    my $domform = &domain_form($defdom);
     # Print it all out
     $r->print(<<ENDSENROLL);
 <script type="text/javascript" language="Javascript">
@@ -535,7 +594,7 @@ function verify(vf) {
     var foundsec=0;
     var tw;
     if ((typeof(vf.cuname.value) !="undefined") && (vf.cuname.value!='') && 
-	(typeof(vf.cdomain.value)!="undefined") && (vf.cdomain.value!='')) {
+	(typeof(vf.lcdomain.value)!="undefined") && (vf.lcdomain.value!='')) {
         founduname=1;
     }
     if ((typeof(vf.cfirst.value)!="undefined") && (vf.cfirst.value!='') &&
@@ -654,6 +713,20 @@ sub show_drop_list {
     my ($r,%currentlist)=@_;
     my $cid=$ENV{'request.course.id'};
     $r->print(<<'END');
+<script>
+function checkAll(field)
+{
+    for (i = 0; i < field.length; i++)
+        field[i].checked = true ;
+}
+
+function uncheckAll(field)
+{
+    for (i = 0; i < field.length; i++)
+        field[i].checked = false ;
+}
+</script>
+<p>
 <input type="hidden" name="phase" value="four">
 <table border=2>
 <tr><th>&nbsp;</th><th>username</th><th>domain</th>
@@ -688,7 +761,12 @@ END
         }
     }
     $r->print('</table><br>');
-    $r->print('<input type=submit value="Drop Students">');
+    $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>
+END
 }
 
 # ================================================= Drop/Add from uploaded file
@@ -713,8 +791,19 @@ sub upfile_drop_add {
     my $enddate   = $ENV{'form.enddate'};
     if ($startdate=~/\D/) { $startdate=''; }
     if ($enddate=~/\D/)   { $enddate=''; }
-    #
+    # Determine domain and desired host (home server)
     my $domain=$ENV{'form.lcdomain'};
+    my $desiredhost = $ENV{'form.lcserver'};
+    if (lc($desiredhost) eq 'default') {
+        $desiredhost = undef;
+    } else {
+        my %home_servers = &Apache::loncommon::get_home_servers($domain);
+        if (! exists($home_servers{$desiredhost})) {
+            $r->print('<font color="#ff0000">Error:</font>'.
+                      'Invalid home server specified');
+            return;
+        }
+    }
     # Determine authentication mechanism
     my $amode  = '';
     my $genpwd = '';
@@ -797,11 +886,12 @@ sub upfile_drop_add {
                         }
                     }
                     if ($password) {
-                        &modifystudent($domain,$username,$cid,$sec);
+                        &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'});
+                             $startdate,$ENV{'form.forceid'},$desiredhost);
                         if ($reply ne 'ok') {
                             $r->print('<p><b>'.
                                       'Error enrolling '.$username.': '.
@@ -857,10 +947,21 @@ sub upfile_drop_add {
 sub drop_student_list {
     my $r=shift;
     my $count=0;
-    foreach (@{$ENV{'form.droplist'}}) {
+    my @droplist;
+    if (ref($ENV{'form.droplist'})) {
+        @droplist = @{$ENV{'form.droplist'}};
+    } else {
+        @droplist = ($ENV{'form.droplist'});
+    }
+    foreach (@droplist) {
         my ($uname,$udom)=split(/\:/,$_);
-        &modifystudent($udom,$uname,$ENV{'request.course.id'});
-        $r->print('Dropped '.$uname.' at '.$udom.'<br>');
+        my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});
+        if ($result eq 'ok') {
+            $r->print('Dropped '.$uname.' at '.$udom.'<br>');
+        } else {
+            $r->print('Error dropping '.$uname.' at '.$udom.': '.$result.
+                      '<br />');
+        }
         $count++;
     }
     $r->print('<p><b>Dropped '.$count.' student(s).</b>');
@@ -870,7 +971,6 @@ sub drop_student_list {
 # ================================================================ Main Handler
 sub handler {
     my $r=shift;
-    $Apache::lonxml::debug=1;
     if ($r->header_only) {
         $r->content_type('text/html');
         $r->send_http_header;