--- loncom/interface/lonuserutils.pm	2008/03/06 21:57:33	1.51
+++ loncom/interface/lonuserutils.pm	2008/05/29 00:43:21	1.56
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Utility functions for managing LON-CAPA user accounts
 #
-# $Id: lonuserutils.pm,v 1.51 2008/03/06 21:57:33 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.56 2008/05/29 00:43:21 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,7 +42,7 @@ use LONCAPA qw(:DEFAULT :match);
 ###############################################################
 # Drop student from all sections of a course, except optional $csec
 sub modifystudent {
-    my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
+    my ($udom,$unam,$courseid,$csec,$desiredhost,$context)=@_;
     # 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
@@ -69,7 +69,7 @@ sub modifystudent {
                         # dom  name  id mode pass     f     m     l     g
                         ($udom,$unam,'',  '',  '',undef,undef,undef,undef,
                          $section,time,undef,undef,$desiredhost,'','manual',
-                         '',$courseid);
+                         '',$courseid,'',$context);
                     $result .= $reply.':';
                 }
             }
@@ -129,7 +129,8 @@ sub modifyuserrole {
         if ($role ne '') {
             $role =~ s/_/\//g;
             $roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope,
-                                                      $role,$end,$start);
+                                                      $role,$end,$start,'',
+                                                      '',$context);
         }
     }
     return ($userresult,$authresult,$roleresult,$idresult);
@@ -924,8 +925,15 @@ sub setup_date_selectors {
 
 
 sub get_dates_from_form {
-    my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
-    my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate');
+    my ($startname,$endname) = @_;
+    if ($startname eq '') {
+        $startname = 'startdate';
+    }
+    if ($endname eq '') {
+        $endname = 'enddate';
+    }
+    my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname);
+    my $enddate   = &Apache::lonhtmlcommon::get_date_from_form($endname);
     if ($env{'form.no_end_date'}) {
         $enddate = 0;
     }
@@ -1251,34 +1259,11 @@ sub print_userlist {
     if ($env{'form.showrole'} eq 'Any') {
        $roleselected = ' selected="selected" '; 
     }
-    my ($role_select,$cnum,$cdom);
-    if ($context eq 'domain') {
-        $role_select = &domain_roles_select();
-        $r->print('<label>'.&mt('Role Type: [_1]',$role_select).'</label>');
-    } else {
-        $role_select = '<select name="showrole">'."\n".
-                       '<option value="Any" '.$roleselected.'>'.
-                       &mt('Any role').'</option>';
-        my @poss_roles = &curr_role_permissions($context);
-        foreach my $role (@poss_roles) {
-            $roleselected = '';
-            if ($role eq $env{'form.showrole'}) {
-                $roleselected = ' selected="selected" ';
-            }
-            my $plrole;
-            if ($role eq 'cr') {
-                $plrole = &mt('Custom role');
-            } else {
-                $plrole=&Apache::lonnet::plaintext($role);
-            }
-            $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
-        }
-        $role_select .= '</select>';
-        $r->print('<label>'.&mt('Role: [_1]',$role_select).'</label>');
-        if ($context eq 'course') {
-            ($cnum,$cdom) = &get_course_identity();
-            $r->print(&section_group_filter($cnum,$cdom));
-        }
+    my ($cnum,$cdom);
+    $r->print(&role_filter($context));
+    if ($context eq 'course') {
+        ($cnum,$cdom) = &get_course_identity();
+        $r->print(&section_group_filter($cnum,$cdom));
     }
     if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {
         $r->print('&nbsp;'.&list_submit_button(&mt('Update Display')).
@@ -1450,6 +1435,41 @@ sub print_userlist {
               $env{'form.phase'}.'" /></form>');
 }
 
+sub role_filter {
+    my ($context) = @_;
+    my $output;
+    my $roleselected = '';
+    if ($env{'form.showrole'} eq 'Any') {
+       $roleselected = ' selected="selected" ';
+    }
+    my ($role_select);
+    if ($context eq 'domain') {
+        $role_select = &domain_roles_select();
+        $output = '<label>'.&mt('Role Type: [_1]',$role_select).'</label>';
+    } else {
+        $role_select = '<select name="showrole">'."\n".
+                       '<option value="Any" '.$roleselected.'>'.
+                       &mt('Any role').'</option>';
+        my @poss_roles = &curr_role_permissions($context);
+        foreach my $role (@poss_roles) {
+            $roleselected = '';
+            if ($role eq $env{'form.showrole'}) {
+                $roleselected = ' selected="selected" ';
+            }
+            my $plrole;
+            if ($role eq 'cr') {
+                $plrole = &mt('Custom role');
+            } else {
+                $plrole=&Apache::lonnet::plaintext($role);
+            }
+            $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
+        }
+        $role_select .= '</select>';
+        $output = '<label>'.&mt('Role: [_1]',$role_select).'</label>';
+    }
+    return $output;
+}
+
 sub section_group_filter {
     my ($cnum,$cdom) = @_;
     my @filters;
@@ -1513,6 +1533,10 @@ sub list_submit_button {
 
 sub gather_userinfo {
     my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_;
+    my $viewablesec;
+    if ($context eq 'course') {
+        $viewablesec = &viewable_section($permission);
+    }
     foreach my $item (keys(%{$rolehash})) {
         my %userdata;
         if ($context eq 'author') { 
@@ -1522,7 +1546,6 @@ sub gather_userinfo {
             &build_user_record($context,\%userdata,$userinfo,$indexhash,
                                $item,$userlist);
         } elsif ($context eq 'course') {
-            my $viewablesec = &viewable_section($permission);
             ($userdata{'username'},$userdata{'domain'},$userdata{'role'},
              $userdata{'section'}) = split(/:/,$item,-1);
             ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});
@@ -1840,7 +1863,10 @@ sub process_date_info {
 }
 
 sub show_users_list {
-    my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist)=@_;
+    my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_;
+    if ($formname eq '') {
+        $formname = 'studentform';
+    }
     #
     # Variables for excel output
     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
@@ -1855,6 +1881,9 @@ sub show_users_list {
     } else {
         push(@sortable,'extent');
     }
+    if ($mode eq 'pickauthor') {
+        @sortable = ('username','fullname','email','status');
+    }
     if (!grep(/^\Q$sortby\E$/,@sortable)) {
         $sortby = 'username';
     }
@@ -1895,121 +1924,41 @@ function photowindow(photolink) {
 END
         }
     }
-    if ($mode ne 'autoenroll') {
+    if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
         my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();
-        my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");
-        my $singconfirm = &mt(' for a single user?');
-        my $multconfirm = &mt(' for multiple users?');
         my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);
-        my %lt = &Apache::lonlocal::texthash( 
-              acwi => 'Access will be set to start immediately',
-              asyo => 'as you did not select an end date in the pop-up window',
-              accw => 'Access will be set to continue indefinitely',
-              asyd => 'as you did not select an end date in the pop-up window',
-              sewi => "Sections will be switched to 'No section'",
-              ayes => "as you either selected the 'No section' option",
-              oryo => 'or you did not select a section in the pop-up window',
-              arol => 'A role with no section will be added',
-              swbs => 'Sections will be switched to:',
-              rwba => 'Roles will be added for section(s):',
-        );
+        my $verify_action_js = &bulkaction_javascript($formname);
         $r->print(<<END);
 
 <script type="text/javascript" language="Javascript">
 $check_uncheck_js
 
-function verify_action (field) {
-    var numchecked = 0;
-    var singconf = '$singconfirm';
-    var multconf = '$multconfirm';
-    if (field.length > 0) {
-        for (i = 0; i < field.length; i++) {
-            if (field[i].checked == true) {
-               numchecked ++;
-            }
-        }
-    } else {
-        if (field.checked == true) {
-            numchecked ++;
-        }
-    }
-    if (numchecked == 0) {
-        alert("$alert");
-    } 
-    else {
-        var message = document.studentform.bulkaction[document.studentform.bulkaction.selectedIndex].text;
-        var choice = document.studentform.bulkaction[document.studentform.bulkaction.selectedIndex].value;
-        if (numchecked == 1) { 
-            message += singconf;
-        } 
-        else {
-            message += multconf; 
-        }
-        if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate') {
-            var datemsg = '';
-            if ((document.studentform.startdate_month.value == '') && 
-                (document.studentform.startdate_day.value  == '') &&
-                (document.studentform.startdate_year.value == '')) {
-                datemsg = "\\n$lt{'acwi'},\\n$lt{'asyo'}.\\n";
-            }
-            if ((document.studentform.enddate_month.value == '') &&
-                (document.studentform.enddate_day.value  == '') &&
-                (document.studentform.enddate_year.value == '')) {
-                datemsg += "\\n$lt{'accw'},\\n$lt{'asyd'}.\\n";
-            }
-            if (datemsg != '') {
-                message += "\\n"+datemsg;
-            }
-        }
-        if (choice == 'chgsec') {
-            var rolefilter = document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value;
-            var retained =  document.studentform.retainsec.value;
-            var secshow = document.studentform.newsecs.value;
-            if (secshow == '') {
-                if (rolefilter == 'st' || retained == 0 || retained == "") {
-                    message += "\\n\\n$lt{'sewi'},\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n"; 
-                } else {
-                    message += "\\n\\n$lt{'arol'}\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
-                }
-            } else {
-                if (rolefilter == 'st' || retained == 0 || retained == "") {
-                    message += "\\n\\n$lt{'swbs'} "+secshow+".\\n";
-                } else {
-                    message += "\\n\\n$lt{'rwba'} "+secshow+".\\n";
-                }
-            }
-        }
-        if (confirm(message)) {
-            document.studentform.phase.value = 'bulkchange';
-            document.studentform.submit();
-        }
-    }
-}
+$verify_action_js
 
 function username_display_launch(username,domain) {
     var target;
-    for (var i=0; i<document.studentform.usernamelink.length; i++) {
-        if (document.studentform.usernamelink[i].checked) {
-            target = document.studentform.usernamelink[i].value;
+    for (var i=0; i<document.$formname.usernamelink.length; i++) {
+        if (document.$formname.usernamelink[i].checked) {
+            target = document.$formname.usernamelink[i].value;
         }
     }
     if (target == 'modify') {
-        if (document.studentform.userwin.checked == true) {
+        if (document.$formname.userwin.checked == true) {
             var url = '/adm/createuser?srchterm='+username+'&srchdomain='+domain+'&phase=get_user_info&action=singleuser&srchin=dom&srchby=uname&srchtype=exact&popup=1';
             var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
             modifywin = window.open(url,'',options,1);
             modifywin.focus();
             return;
         } else {
-            document.studentform.srchterm.value=username;
-            document.studentform.srchdomain.value=domain;
-            document.studentform.phase.value='get_user_info';
-            document.studentform.action.value = 'singleuser';
-            document.studentform.submit();
+            document.$formname.srchterm.value=username;
+            document.$formname.srchdomain.value=domain;
+            document.$formname.phase.value='get_user_info';
+            document.$formname.action.value = 'singleuser';
+            document.$formname.submit();
         }
     }
     if (target == 'aboutme') {
-        if (document.studentform.userwin.checked == true) {
+        if (document.$formname.userwin.checked == true) {
             var url = '/adm/'+domain+'/'+username+'/aboutme?popup=1';
             var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
             aboutmewin = window.open(url,'',options,1);
@@ -2045,12 +1994,11 @@ END
                        'clicker'    => "clicker id",
                        'photo'      => "photo",
                        'extent'     => "extent",
-                       'go'         => "go",
                        'pr'         => "Proceed",
                        'ca'         => "check all",
                        'ua'         => "uncheck all",
                        'ac'         => "Action to take for selected users",
-                       'link'       => "Behavior of username links",
+                       'link'       => "Behavior of clickable username link for each user",
                        'aboutme'    => "Display a user's personal page",
                        'owin'       => "Open in a new window",
                        'modify'     => "Modify a user's information",
@@ -2060,28 +2008,33 @@ END
     } elsif ($context eq 'author') {
         $lt{'extent'} = &mt('Author'); 
     }
-    my @cols = ('username','domain','id','fullname');
-    if ($context eq 'course') {
-        push(@cols,'section');
-    }
-    if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { 
-        push(@cols,('start','end'));
-    }
-    if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
-        push(@cols,'role');
-    }
-    if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||
-                                $env{'form.roletype'} eq 'course')) {
-        push (@cols,'extent');
-    }
-    if (($statusmode eq 'Any') && 
-        (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {
-        push(@cols,'status');
-    }
-    if ($context eq 'course') {
-        push(@cols,'groups');
+    my @cols;
+    if ($mode eq 'pickauthor') {
+        @cols = ('username','fullname','status','email');
+    } else {
+        @cols = ('username','domain','id','fullname');
+        if ($context eq 'course') {
+            push(@cols,'section');
+        }
+        if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { 
+            push(@cols,('start','end'));
+        }
+        if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
+            push(@cols,'role');
+        }
+        if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||
+                                    $env{'form.roletype'} eq 'course')) {
+            push (@cols,'extent');
+        }
+        if (($statusmode eq 'Any') && 
+            (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {
+            push(@cols,'status');
+        }
+        if ($context eq 'course') {
+            push(@cols,'groups');
+        }
+        push(@cols,'email');
     }
-    push(@cols,'email');
 
     my $rolefilter = $env{'form.showrole'};
     if ($env{'form.showrole'} eq 'cr') {
@@ -2093,13 +2046,13 @@ END
     if ($mode ne 'autoenroll') {
         $results_description = &results_header_row($rolefilter,$statusmode,
                                                    $context,$permission,$mode);
-        $r->print('<b>'.$results_description.'</b><br />');
+        $r->print('<b>'.$results_description.'</b><br /><br />');
     }
     my ($output,$actionselect,%canchange,%canchangesec);
-    if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
-        if ($mode ne 'autoenroll') {
+    if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
+        if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
             if ($permission->{'cusr'}) {
-                $actionselect = &select_actions($context,$setting,$statusmode);
+                $actionselect = &select_actions($context,$setting,$statusmode,$formname);
             }
             $r->print(<<END);
 <input type="hidden" name="srchby"  value="uname" />
@@ -2108,33 +2061,12 @@ END
 <input type="hidden" name="srchterm" value="" />
 <input type="hidden" name="srchdomain" value="" /> 
 END
-            $output = '<p>';
-            my @linkdests = ('aboutme');
-            if ($permission->{'cusr'}) {
-                unshift (@linkdests,'modify');
-            }
-            $output .= '<span class="LC_nobreak">'.$lt{'link'}.':&nbsp;';
-            my $usernamelink = $env{'form.usernamelink'};
-            if ($usernamelink eq '') {
-                $usernamelink = 'aboutme';
-            }
-            foreach my $item (@linkdests) {
-                my $checkedstr = '';
-                if ($item eq $usernamelink) {
-                    $checkedstr = ' checked="checked" ';
-                }
-                $output .= '<label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.'>&nbsp;'.$lt{$item}.'</label>&nbsp;&nbsp;';
-            }
-            my $checkwin;
-            if ($env{'form.userwin'}) { 
-                $checkwin = 'checked = "checked"'; 
-            }
-            $output .= '&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="userwin" value="1" $checkwin />'.$lt{'owin'}.'</span><br />';
             if ($actionselect) {
                 $output .= <<"END";
-$lt{'ac'}:&nbsp;$actionselect <input type="button" value="$lt{'go'}" onclick="javascript:opendatebrowser(this.form,'studentform','go')" /></p>
-<p><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.actionlist)" /> &nbsp;
-<input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.actionlist)" /><br /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action(document.studentform.actionlist)" />
+<div class="LC_left_float"><fieldset><legend><b>$lt{'ac'}</b></legend>
+$actionselect
+<br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> &nbsp;
+<input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.$formname.actionlist)" /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action('actionlist')" /></fieldset></div>
 END
                 my @allroles;
                 if ($env{'form.showrole'} eq 'Any') {
@@ -2176,22 +2108,49 @@ END
                     }
                 }
             }
+            $output .= '<div class="LC_left_float"><fieldset><legend><b>'.$lt{'link'}.'</b></legend>'.
+                       '<table><tr>';
+            my @linkdests = ('aboutme');
+            if ($permission->{'cusr'}) {
+                unshift (@linkdests,'modify');
+            }
+            $output .= '<td>';
+            my $usernamelink = $env{'form.usernamelink'};
+            if ($usernamelink eq '') {
+                $usernamelink = 'aboutme';
+            }
+            foreach my $item (@linkdests) {
+                my $checkedstr = '';
+                if ($item eq $usernamelink) {
+                    $checkedstr = ' checked="checked" ';
+                }
+                $output .= '<span class="LC_nobreak"><label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.'>&nbsp;'.$lt{$item}.'</label></span><br />';
+            }
+            my $checkwin;
+            if ($env{'form.userwin'}) {
+                $checkwin = 'checked = "checked"';
+            }
+            $output .= '</td><td valign="top"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1" '.$checkwin.'/>'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
         }
-        $output .= "\n<p>\n".
+        $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".
                   &Apache::loncommon::start_data_table().
                   &Apache::loncommon::start_data_table_header_row();
         if ($mode eq 'autoenroll') {
             $output .= "
- <th><a href=\"javascript:document.studentform.sortby.value='type';document.studentform.submit();\">$lt{'type'}</a></th>
+ <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>
             ";
         } else {
-            $output .= "\n".'<th>'.&mt('Count').'</th>'."\n";
+            if ($mode eq 'pickauthor') {
+                $output .= "\n".'<th>&nbsp;</th>'."\n";
+            } else { 
+                $output .= "\n".'<th>'.&mt('Count').'</th>'."\n";
+            }
             if ($actionselect) {
                 $output .= '<th>'.&mt('Select').'</th>'."\n";
             }
         }
         foreach my $item (@cols) {
-            $output .= "<th><a href=\"javascript:document.studentform.sortby.value='$item';document.studentform.submit();\">$lt{$item}</a></th>\n";
+            $output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n";
         }
         my %role_types = &role_type_names();
         if ($context eq 'course' && $mode ne 'autoenroll') {
@@ -2206,8 +2165,8 @@ END
                     $clickerchg = 'off';
                 }
                 $output .= '    <th>'."\n".'     '.
-                    '<a href="javascript:document.studentform.displayclickers.value='.
-                      "'".$clickerchg."'".';document.studentform.submit();">'.
+                    '<a href="javascript:document.'.$formname.'.displayclickers.value='.
+                      "'".$clickerchg."'".';document.'.$formname.'.submit();">'.
                       $clicker_options{$clickerchg}.'</a>&nbsp;'.$lt{'clicker'}."\n".
                       '    </th>'."\n";
 
@@ -2222,8 +2181,8 @@ END
                         $photochg = 'off';
                     }
                     $output .= '    <th>'."\n".'     '.
-                '<a href="javascript:document.studentform.displayphotos.value='.
-                      "'".$photochg."'".';document.studentform.submit();">'.
+                '<a href="javascript:document.'.$formname.'.displayphotos.value='.
+                      "'".$photochg."'".';document.'.$formname.'.submit();">'.
                       $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".
                       '    </th>'."\n";
                 }
@@ -2422,7 +2381,7 @@ END
         } else {
             $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
         }
-        if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
+        if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
             $r->print(&Apache::loncommon::start_data_table_row());
             my $checkval;
             if ($mode eq 'autoenroll') {
@@ -2444,7 +2403,9 @@ END
                 }
                 $r->print("<td>$cellentry</td>\n");
             } else {
-                $r->print("<td>$rowcount</td>\n");
+                if ($mode ne 'pickauthor') {  
+                    $r->print("<td>$rowcount</td>\n");
+                }
                 if ($actionselect) {
                     my $showcheckbox;
                     if ($role =~ /^cr\//) {
@@ -2478,6 +2439,8 @@ END
                     } else {
                         $r->print('<td>&nbsp;</td>');
                     }
+                } elsif ($mode eq 'pickauthor') {
+                        $r->print('<td><input type="button" name="chooseauthor" onclick="javascript:gochoose('."'$in{'username'}'".');" value="'.&mt('Select').'" /></td>');
                 }
             }
             foreach my $item (@cols) {
@@ -2545,7 +2508,7 @@ END
             $row++;
         }
     }
-    if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
+    if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
             $r->print(&Apache::loncommon::end_data_table().'<br />');
     } elsif ($mode eq 'excel') {
         $excel_workbook->close();
@@ -2565,6 +2528,125 @@ END
     }
 }
 
+sub bulkaction_javascript {
+    my ($formname,$caller) = @_;
+    my $docstart = 'document';
+    if ($caller eq 'popup') {
+        $docstart = 'opener.document';
+    }
+    my %lt = &Apache::lonlocal::texthash(
+              acwi => 'Access will be set to start immediately',
+              asyo => 'as you did not select an end date in the pop-up window',
+              accw => 'Access will be set to continue indefinitely',
+              asyd => 'as you did not select an end date in the pop-up window',
+              sewi => "Sections will be switched to 'No section'",
+              ayes => "as you either selected the 'No section' option",
+              oryo => 'or you did not select a section in the pop-up window',
+              arol => 'A role with no section will be added',
+              swbs => 'Sections will be switched to:',
+              rwba => 'Roles will be added for section(s):',
+            );
+    my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");
+    my $noaction = &mt("You need to select an action to take for the user(s) you have selected"); 
+    my $singconfirm = &mt(' for a single user?');
+    my $multconfirm = &mt(' for multiple users?');
+    my $output = <<"ENDJS";
+function verify_action (field) {
+    var numchecked = 0;
+    var singconf = '$singconfirm';
+    var multconf = '$multconfirm';
+    if ($docstart.$formname.elements[field].length > 0) {
+        for (i=0; i<$docstart.$formname.elements[field].length; i++) {
+            if ($docstart.$formname.elements[field][i].checked == true) {
+               numchecked ++;
+            }
+        }
+    } else {
+        if ($docstart.$formname.elements[field].checked == true) {
+            numchecked ++;
+        }
+    }
+    if (numchecked == 0) {
+        alert("$alert");
+        return;
+    } else {
+        var message = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].text;
+        var choice = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].value;
+        if (choice == '') {
+            alert("$noaction");
+            return;
+        } else {
+            if (numchecked == 1) {
+                message += singconf;
+            } else {
+                message += multconf;
+            }
+ENDJS
+    if ($caller ne 'popup') {
+        $output .= <<"NEWWIN";
+            if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate' || choice == 'chgsec') {
+                opendatebrowser(document.$formname,'$formname','go');
+                return;
+
+            } else {
+                if (confirm(message)) {
+                    document.$formname.phase.value = 'bulkchange';
+                    document.$formname.submit();
+                    return;
+                }
+            }
+NEWWIN
+    } else {
+        $output .= <<"POPUP";
+            if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate') {
+                var datemsg = '';
+                if (($docstart.$formname.startdate_month.value == '') &&
+                    ($docstart.$formname.startdate_day.value  == '') &&
+                    ($docstart.$formname.startdate_year.value == '')) {
+                    datemsg = "\\n$lt{'acwi'},\\n$lt{'asyo'}.\\n";
+                }
+                if (($docstart.$formname.enddate_month.value == '') &&
+                    ($docstart.$formname.enddate_day.value  == '') &&
+                    ($docstart.$formname.enddate_year.value == '')) {
+                    datemsg += "\\n$lt{'accw'},\\n$lt{'asyd'}.\\n";
+                }
+                if (datemsg != '') {
+                    message += "\\n"+datemsg;
+                }
+            }
+            if (choice == 'chgsec') {
+                var rolefilter = $docstart.$formname.showrole.options[$docstart.$formname.showrole.selectedIndex].value;
+                var retained =  $docstart.$formname.retainsec.value;
+                var secshow = $docstart.$formname.newsecs.value;
+                if (secshow == '') {
+                    if (rolefilter == 'st' || retained == 0 || retained == "") {
+                        message += "\\n\\n$lt{'sewi'},\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
+                    } else {
+                        message += "\\n\\n$lt{'arol'}\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
+                    }
+                } else {
+                    if (rolefilter == 'st' || retained == 0 || retained == "") {
+                        message += "\\n\\n$lt{'swbs'} "+secshow+".\\n";
+                    } else {
+                        message += "\\n\\n$lt{'rwba'} "+secshow+".\\n";
+                    }
+                }
+            }
+            if (confirm(message)) {
+                $docstart.$formname.phase.value = 'bulkchange';
+                $docstart.$formname.submit();
+                window.close();
+            }
+POPUP
+    }
+    $output .= '
+        }
+    }
+}
+';
+    return $output;
+}
+
 sub print_username_link {
     my ($mode,$in) = @_;
     my $output;
@@ -2588,7 +2670,7 @@ sub role_type_names {
 }
 
 sub select_actions {
-    my ($context,$setting,$statusmode) = @_;
+    my ($context,$setting,$statusmode,$formname) = @_;
     my %lt = &Apache::lonlocal::texthash(
                 revoke   => "Revoke user roles",
                 delete   => "Delete user roles",
@@ -2649,7 +2731,7 @@ sub select_actions {
         }
     }
     if ($options) {
-        $output = '<select name="bulkaction" onchange="javascript:opendatebrowser(this.form,'."'studentform','change'".')" />'."\n".
+        $output = '<select name="bulkaction">'."\n".
                   '<option value="" selected="selected">'.
                   &mt('Please select').'</option>'."\n".$options."\n".'</select>';
         if ($choices{'dates'}) {
@@ -2665,7 +2747,8 @@ sub select_actions {
                 '<input type="hidden" name="enddate_year" value="" />'."\n".
                 '<input type="hidden" name="enddate_hour" value="" />'."\n".
                 '<input type="hidden" name="enddate_minute" value="" />'."\n".
-                '<input type="hidden" name="enddate_second" value="" />'."\n";
+                '<input type="hidden" name="enddate_second" value="" />'."\n".
+                '<input type="hidden" name="no_end_date" value="" />'."\n";
             if ($context eq 'course') {
                 $output .= '<input type="hidden" name="makedatesdefault" value="" />'."\n";
             }
@@ -2691,20 +2774,6 @@ sub date_section_javascript {
     $output .= <<"ENDONE";
     function opendatebrowser(callingform,formname,calledby) {
         var bulkaction = callingform.bulkaction.options[callingform.bulkaction.selectedIndex].value;
-        if (bulkaction == 'revoke' || bulkaction == 'delete' || bulkaction == '') {
-            if (calledby == 'go') {
-                if (bulkaction == 'revoke') {
-                    alert("$nopopup{'revoke'}");
-                }
-                if (bulkaction == 'delete') {
-                    alert("$nopopup{'delete'}"); 
-                }
-                if (bulkaction == '') {
-                    alert("$nopopup{'none'}");
-                }
-            }
-            return;
-        }
         var url = '/adm/createuser?';
         var type = '';
         var showrole = callingform.showrole.options[callingform.showrole.selectedIndex].value;
@@ -2758,9 +2827,7 @@ END
         setSections(formname);
         if (seccheck == 'ok') {
             opener.document.$callingform.newsecs.value = formname.sections.value;
-            window.close();
         }
-        return;
 END
     } else {
         if ($context eq 'course') {
@@ -2794,13 +2861,22 @@ END
     opener.document.$callingform.enddate_hour.value =  formname.enddate_hour.options[formname.enddate_hour.selectedIndex].value;
     opener.document.$callingform.enddate_minute.value =  formname.enddate_minute.value;
     opener.document.$callingform.enddate_second.value = formname.enddate_second.value;
-    window.close();
+    if (formname.no_end_date.checked) {
+        opener.document.$callingform.no_end_date.value = '1';
+    } else {
+        opener.document.$callingform.no_end_date.value = '0';
+    }
 END
     }
-    $output .= '
+    my $verify_action_js = &bulkaction_javascript($callingform,'popup');
+    $output .= <<"ENDJS";
+    verify_action('actionlist');
 }
+
+$verify_action_js
+
 </script>
-';
+ENDJS
     my %lt = &Apache::lonlocal::texthash (
                  chac => 'Access dates to apply for selected users',
                  chse => 'Changes in section affiliation to apply to selected users',
@@ -2857,8 +2933,7 @@ END
         $output .= $info.$secbox;
     }
     $output .= '<p>'.
-&mt('Use "Save" to update the main window with your selections.').'<br /><br />'.
-'<input type="button" name="dateselection" value="'.&mt('Save').'" onclick="javascript:saveselections(this.form)" /></p>'."\n".
+'<input type="button" name="dateselection" value="'.&mt('Make changes').'" onclick="javascript:saveselections(this.form)" /></p>'."\n".
 '</form>';
     return $output;
 }
@@ -3657,13 +3732,14 @@ sub upfile_drop_add {
                                 $sec = $secs[0];
                             }
                             &modifystudent($domain,$username,$cid,$sec,
-                                           $desiredhost);
+                                           $desiredhost,$context);
                             $roleresult =
                                 &Apache::lonnet::modifystudent
                                     ($domain,$username,$id,$amode,$password,
                                      $fname,$mname,$lname,$gen,$sec,$enddate,
                                      $startdate,$env{'form.forceid'},
-                                     $desiredhost,$email,'manual','',$cid);
+                                     $desiredhost,$email,'manual','',$cid,
+                                     '',$context);
                             $userresult = $roleresult;
                         } else {
                             if ($role ne '') { 
@@ -3969,24 +4045,25 @@ sub update_user_list {
             $end = $now;
             $type = 'manual';
             $result =
-                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
         } elsif ($choice eq 'revoke') {
             # revoke or delete user role
             $end = $now; 
             if ($role eq 'st') {
                 $result = 
-                    &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+                    &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
             } else {
                 $result = 
-                    &Apache::lonnet::revokerole($udom,$uname,$scope,$role);
+                    &Apache::lonnet::revokerole($udom,$uname,$scope,$role,
+                                                '','',$context);
             }
         } elsif ($choice eq 'delete') {
             if ($role eq 'st') {
-                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid);
+                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context);
             }
             $result =
                 &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,
-                                            $start,1);
+                                            $start,1,'',$context);
         } else {
             #reenable, activate, change access dates or change section
             if ($choice ne 'chgsec') {
@@ -3995,25 +4072,25 @@ sub update_user_list {
             }
             if ($choice eq 'reenable') {
                 if ($role eq 'st') {
-                    $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+                    $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
                 } else {
                     $result = 
                         &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
-                                                    $now);
+                                                    $now,'','',$context);
                 }
             } elsif ($choice eq 'activate') {
                 if ($role eq 'st') {
-                    $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+                    $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
                 } else {
                     $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
-                                            $now);
+                                            $now,'','',$context);
                 }
             } elsif ($choice eq 'chgdates') {
                 if ($role eq 'st') {
-                    $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+                    $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
                 } else {
                     $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
-                                                $start);
+                                                $start,'','',$context);
                 }
             } elsif ($choice eq 'chgsec') {
                 my (@newsecs,$revresult,$nochg,@retained);
@@ -4029,7 +4106,8 @@ sub update_user_list {
                         } else {
                             $revresult =
                                 &Apache::lonnet::revokerole($udom,$uname,
-                                                            $scope,$role);
+                                                            $scope,$role,
+                                                            '','',$context);
                         } 
                     } else {
                         if (@newsecs > 0) {
@@ -4038,12 +4116,14 @@ sub update_user_list {
                             } else {
                                 $revresult =
                                     &Apache::lonnet::revokerole($udom,$uname,
-                                                                $scope,$role);
+                                                                $scope,$role,
+                                                                '','',$context);
                             }
                         } else {
                             $revresult =
                                 &Apache::lonnet::revokerole($udom,$uname,
-                                                            $scope,$role);
+                                                            $scope,$role,
+                                                            '','',$context);
                         }
                     }
                 } else {
@@ -4058,17 +4138,17 @@ sub update_user_list {
                     if (!$nochg) {
                         if ($role eq 'st') {
                             $result = 
-                                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid);
+                                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context);
                         } else {
                             my $newscope = $scopestem;
-                            $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start);
+                            $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);
                         }
                     }
                 } else {
                     foreach my $newsec (@newsecs) { 
                         if (!grep(/^\Q$newsec\E$/,@retained)) {
                             if ($role eq 'st') {
-                                $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid);
+                                $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context);
                             } else {
                                 my $newscope = $scopestem;
                                 if ($newsec ne '') {