--- loncom/interface/loncreateuser.pm	2007/12/14 00:20:53	1.209
+++ loncom/interface/loncreateuser.pm	2007/12/21 16:23:54	1.218
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.209 2007/12/14 00:20:53 raeburn Exp $
+# $Id: loncreateuser.pm,v 1.218 2007/12/21 16:23:54 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -223,15 +223,15 @@ sub print_username_entry_form {
     my $start_page =
 	&Apache::loncommon::start_page('User Management',
 				       $jscript,{'add_entries' => \%loaditems,});
-    if ($env{'form.action'} eq 'singleuser') {
+    if ($env{'form.action'} eq 'custom') {
         &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"javascript:backPage(document.crtuser)",
-            text=>"Single user search",
-            faq=>282,bug=>'Instructor Interface',});
-    } elsif ($env{'form.action'} eq 'custom') {
+            text=>"Pick custom role",});
+    } else {
         &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"javascript:backPage(document.crtuser)",
-            text=>"Pick custom role",});
+            text=>"Single user search",
+            faq=>282,bug=>'Instructor Interface',});
     }
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');
     my %existingroles=&Apache::lonuserutils::my_custom_roles();
@@ -245,22 +245,19 @@ sub print_username_entry_form {
                     'ecrp' => "Edit Custom Role Privileges",
                     'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor",
-                    'mod'  => "to edit user information or add/modify roles",
+                    'mod'  => "to modify user information or add/modify roles",
+                    'enrl' => "to enroll one student",
 				       );
     my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface');
     my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
+    my $helpsist=&Apache::loncommon::help_open_topic('Course_Add_Student');
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');
     my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');
     if ($sellink) {
         $sellink = "$lt{'or'} ".$sellink;
     } 
     $r->print($start_page."\n".$crumbs);
-    if ($env{'form.action'} eq 'singleuser') {
-        $r->print("
-<h3>$lt{'srch'} $sellink $lt{'mod'}$helpsiur</h3>
-$response");
-        $r->print(&entry_form($defdom,$srch,$forcenewuser,$context));
-    } elsif ($env{'form.action'} eq 'custom') {
+    if ($env{'form.action'} eq 'custom') {
         if (&Apache::lonnet::allowed('mcr','/')) {
             $r->print(<<ENDCUSTOM);
 <form action="/adm/createuser" method="post" name="docustom">
@@ -272,20 +269,41 @@ $lt{'nr'}: $choice <input type="text" si
 </form>
 ENDCUSTOM
         }
+    } else {
+        my $actiontext = $lt{'mod'}.$helpsiur;
+        if ($env{'form.action'} eq 'singlestudent') {
+            $actiontext = $lt{'enrl'}.$helpsist;
+        }
+        $r->print("
+<h3>$lt{'srch'} $sellink $actiontext</h3>");
+        if ($env{'form.origform'} ne 'crtusername') {
+            $r->print("\n".$response);
+        }
+        $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));
     }
     $r->print(&Apache::loncommon::end_page());
 }
 
 sub entry_form {
-    my ($dom,$srch,$forcenewuser,$context) = @_;
+    my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
-    my $cancreate = &Apache::lonuserutils::can_create_user($dom,$context);
-    if (!$cancreate) {
-        $forcenewuser = '';
+    my $usertype;
+    if (ref($srch) eq 'HASH') {
+        if (($srch->{'srchin'} eq 'dom') &&
+            ($srch->{'srchby'} eq 'uname') &&
+            ($srch->{'srchtype'} eq 'exact') &&
+            ($srch->{'srchdomain'} ne '') &&
+            ($srch->{'srchterm'} ne '')) {
+            my ($rules,$ruleorder) =
+                &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');
+            $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules);
+        }
     }
+    my $cancreate =
+        &Apache::lonuserutils::can_create_user($dom,$context,$usertype);
     my $userpicker = 
        &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
-                                       'document.crtuser');
+                                       'document.crtuser',$cancreate,$usertype);
     my $srchbutton = &mt('Search');
     my $output = <<"ENDBLOCK";
 <form action="/adm/createuser" method="post" name="crtuser">
@@ -295,7 +313,7 @@ $userpicker
 <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />
 </form>
 ENDBLOCK
-    if ($cancreate) {
+    if ($cancreate && $env{'form.phase'} eq '') {
         my $defdom=$env{'request.role.domain'};
         my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
         my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
@@ -315,6 +333,7 @@ ENDBLOCK
 <input type="hidden" name="forcenewuser" value="1" />
 <input type="hidden" name="origform" value="crtusername" />
 <h3>$lt{crnu}$helpcrt</h3>
+$responsemsg
 <table>
  <tr>
   <td>$lt{'usr'}:</td>
@@ -392,8 +411,8 @@ ENDSCRIPT
                                        'firstname'      => "first name",
                                        'permanentemail' => "permanent e-mail",
                                       );
+    $r->print(&Apache::loncommon::start_page('User Management',$jscript));
     if ($operation eq 'createuser') {
-        $r->print(&Apache::loncommon::start_page('User Management',$jscript));
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.usersrchform,'','')",
               text=>"Create/modify user",
@@ -405,9 +424,17 @@ ENDSCRIPT
         $r->print("<b>$lt{'usrch'}</b><br />");
         $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
         $r->print('<h3>'.$lt{'usel'}.'</h3>');
-    } else {
+    } elsif ($operation eq 'enrollstudent') {
+        &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>"javascript:backPage(document.usersrchform,'','')",
+              text=>"Create/modify student",
+              faq=>282,bug=>'Instructor Interface',},
+             {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
+              text=>"Select Student",
+              faq=>282,bug=>'Instructor Interface',});
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print($jscript."<b>$lt{'stusrch'}</b><br />");
-        $r->print(&Apache::londropadd::single_user_entry_form($srch->{'srchdomain'},$srch));
+        $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
         $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
     }
     $r->print('<form name="usersrchform" method="post">'.
@@ -453,14 +480,8 @@ ENDSCRIPT
               ' <input type="hidden" name="seludom" value="" />'."\n".
               ' <input type="hidden" name="currstate" value="select" />'."\n".
               ' <input type="hidden" name="phase" value="get_user_info" />'."\n".
-              ' <input type="hidden" name="action" value="singleuser" />'."\n");
-    $r->print($response);
-    if ($operation eq 'createuser') {
-        $r->print('</form>'.&Apache::loncommon::end_page());
-    } else {
-        $r->print('<input type="hidden" name="action" value="enrollstudent" />'."\n".
-                  '<input type="hidden" name="state" value="gotusername" />'."\n");
-    }
+              ' <input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n");
+    $r->print($response.'</form>'.&Apache::loncommon::end_page());
 }
 
 sub print_user_query_page {
@@ -472,17 +493,50 @@ sub print_user_query_page {
 }
 
 sub print_user_modification_page {
-    my ($r,$ccuname,$ccdomain,$srch,$response,$context) = @_;
+    my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;
     if (($ccuname eq '') || ($ccdomain eq '')) {
-        my $usermsg = &mt('No username and/or domain provided.'); 
+        my $usermsg = &mt('No username and/or domain provided.');
+        $env{'form.phase'} = '';
 	&print_username_entry_form($r,$context,$usermsg);
         return;
     }
+    my ($form,$formname);
+    if ($env{'form.action'} eq 'singlestudent') {
+        $form = 'document.enrollstudent';
+        $formname = 'enrollstudent';
+    } else {
+        $form = 'document.cu';
+        $formname = 'cu';
+    }
     my %abv_auth = &auth_abbrev();
     my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser,
         %alerts,%curr_rules,%got_rules);
     my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
     if ($uhome eq 'no_host') {
+        my $usertype;
+        my ($rules,$ruleorder) =
+            &Apache::lonnet::inst_userrules($ccdomain,'username');
+            $usertype =
+                &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules);
+        my $cancreate =
+            &Apache::lonuserutils::can_create_user($ccdomain,$context,
+                                                   $usertype);
+        if (!$cancreate) {
+            my $helplink = ' href="javascript:helpMenu('."'display'".')"';
+            my %usertypetext = (
+                official   => 'institutional',
+                unofficial => 'non-institutional',
+            );
+            my $response;
+            if ($env{'form.origform'} eq 'crtusername') {
+                $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).
+                            '</span><br />';
+            }
+            $response .= '<span class="LC_warning">'.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the <a[_1]>helpdesk</a> for assistance.',$helplink).'</span><br /><br />';
+            $env{'form.phase'} = '';
+            &print_username_entry_form($r,$context,$response);
+            return;
+        }
         $newuser = 1;
         my $checkhash;
         my $checks = { 'username' => 1 };
@@ -503,9 +557,10 @@ sub print_user_modification_page {
                             $domdesc,$curr_rules{$ccdomain}{'username'},
                             'username');
                     }
+                    $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$userchkmsg);
                     return;
-                } 
+                }
             }
         }
     } else {
@@ -520,7 +575,7 @@ sub print_user_modification_page {
         }
     }
     if ($response) {
-        $response = '<br />'.$response
+        $response = '<br />'.$response;
     }
     my $defdom=$env{'request.role.domain'};
 
@@ -540,165 +595,35 @@ sub print_user_modification_page {
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $dc_setcourse_code = '';
     my $nondc_setsection_code = '';                                        
-
     my %loaditem;
 
-    my $groupslist;
-    my %curr_groups = &Apache::longroup::coursegroups();
-    if (%curr_groups) {
-        $groupslist = join('","',sort(keys(%curr_groups)));
-        $groupslist = '"'.$groupslist.'"';   
-    }
-
-    if ($env{'request.role'} =~ m-^dc\./($match_domain)/$-) {
-        my $dcdom = $1;
-        $loaditem{'onload'} = "document.cu.coursedesc.value='';";
-        my @rolevals = ('st','ta','ep','in','cc');
-        my (@crsroles,@grproles);
-        for (my $i=0; $i<@rolevals; $i++) {
-            $crsroles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Course');
-            $grproles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Group');
-        }
-        my $rolevalslist = join('","',@rolevals);
-        my $crsrolenameslist = join('","',@crsroles);
-        my $grprolenameslist = join('","',@grproles);
-        my $pickcrsfirst = '<--'.&mt('Pick course first');
-        my $pickgrpfirst = '<--'.&mt('Pick group first'); 
-        $dc_setcourse_code = <<"ENDSCRIPT";
-    function setCourse() {
-        var course = document.cu.dccourse.value;
-        if (course != "") {
-            if (document.cu.dcdomain.value != document.cu.origdom.value) {
-                alert("You must select a course in the current domain");
-                return;
-            } 
-            var userrole = document.cu.role.options[document.cu.role.selectedIndex].value
-            var section="";
-            var numsections = 0;
-            var newsecs = new Array();
-            for (var i=0; i<document.cu.currsec.length; i++) {
-                if (document.cu.currsec.options[i].selected == true ) {
-                    if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) { 
-                        if (numsections == 0) {
-                            section = document.cu.currsec.options[i].value
-                            numsections = 1;
-                        }
-                        else {
-                            section = section + "," +  document.cu.currsec.options[i].value
-                            numsections ++;
-                        }
-                    }
-                }
-            }
-            if (document.cu.newsec.value != "" && document.cu.newsec.value != null) {
-                if (numsections == 0) {
-                    section = document.cu.newsec.value
-                }
-                else {
-                    section = section + "," +  document.cu.newsec.value
-                }
-                newsecs = document.cu.newsec.value.split(/,/g);
-                numsections = numsections + newsecs.length;
-            }
-            if ((userrole == 'st') && (numsections > 1)) {
-                alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.")
-                return;
-            }
-            for (var j=0; j<newsecs.length; j++) {
-                if ((newsecs[j] == 'all') || (newsecs[j] == 'none')) {
-                    alert("'"+newsecs[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
-                    return;
-                }
-                if (document.cu.groups.value != '') {
-                    var groups = document.cu.groups.value.split(/,/g);
-                    for (var k=0; k<groups.length; k++) {
-                        if (newsecs[j] == groups[k]) {
-                            alert("'"+newsecs[j]+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");
-                            return; 
-                        }
-                    }
-                }
-            }
-            if ((userrole == 'cc') && (numsections > 0)) {
-                alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
-                section = "";
-            }
-            var coursename = "_$dcdom"+"_"+course+"_"+userrole
-            var numcourse = getIndex(document.cu.dccourse);
-            if (numcourse == "-1") {
-                alert("There was a problem with your course selection");
-                return
-            }
-            else {
-                document.cu.elements[numcourse].name = "act"+coursename;
-                var numnewsec = getIndex(document.cu.newsec);
-                if (numnewsec != "-1") {
-                    document.cu.elements[numnewsec].name = "sec"+coursename;
-                    document.cu.elements[numnewsec].value = section;
-                }
-                var numstart = getIndex(document.cu.start);
-                if (numstart != "-1") {
-                    document.cu.elements[numstart].name = "start"+coursename;
-                }
-                var numend = getIndex(document.cu.end);
-                if (numend != "-1") {
-                    document.cu.elements[numend].name = "end"+coursename
-                }
-            }
-        }
-        document.cu.submit();
-    }
-
-    function getIndex(caller) {
-        for (var i=0;i<document.cu.elements.length;i++) {
-            if (document.cu.elements[i] == caller) {
-                return i;
-            }
-        }
-        return -1;
-    }
-ENDSCRIPT
-    } else {
-        $nondc_setsection_code = 
-            &Apache::lonuserutils::setsections_javascript('cu',$groupslist);
-    }
-    my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
-                                   $nondc_setsection_code,$groupslist);
+    my $groupslist = &Apache::lonuserutils::get_groupslist();
 
-    my ($jsback,$elements) = &crumb_utilities();
-    my $javascript_validations;
-    if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($uhome eq 'no_host')) {
-        my ($krbdef,$krbdefdom) =
-            &Apache::loncommon::get_kerberos_defaults($ccdomain);
-        $javascript_validations = 
-            &Apache::lonuserutils::javascript_validations('auth',$krbdefdom,undef,
-                                                        undef,$ccdomain);
-    }
-    $js .= "\n".
-       '<script type="text/javascript">'."\n".$jsback."\n".
-       $javascript_validations.'</script>';
+    my $js = &validation_javascript($context,$ccdomain,$pjump_def,
+                               $groupslist,$newuser,$formname,\%loaditem);
     my $start_page = 
 	&Apache::loncommon::start_page('User Management',
 				       $js,{'add_entries' => \%loaditem,});
+    my %breadcrumb_text = &singleuser_breadcrumb();
     &Apache::lonhtmlcommon::add_breadcrumb
-     ({href=>"javascript:backPage(document.cu)",
-       text=>"Create/modify user",
+     ({href=>"javascript:backPage($form)",
+       text=>$breadcrumb_text{'search'},
        faq=>282,bug=>'Instructor Interface',});
 
     if ($env{'form.phase'} eq 'userpicked') {
         &Apache::lonhtmlcommon::add_breadcrumb
-     ({href=>"javascript:backPage(document.cu,'get_user_info','select')",
-       text=>"Select a user",
+     ({href=>"javascript:backPage($form,'get_user_info','select')",
+       text=>$breadcrumb_text{'userpicked'},
        faq=>282,bug=>'Instructor Interface',});
     }
     &Apache::lonhtmlcommon::add_breadcrumb
-      ({href=>"javascript:backPage(document.cu,'$env{'form.phase'}','modify')",
-        text=>"Set user role",
+      ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')",
+        text=>$breadcrumb_text{'modify'},
         faq=>282,bug=>'Instructor Interface',});
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');
 
     my $forminfo =<<"ENDFORMINFO";
-<form action="/adm/createuser" method="post" name="cu">
+<form action="/adm/createuser" method="post" name="$formname">
 <input type="hidden" name="phase" value="update_user_data" />
 <input type="hidden" name="ccuname" value="$ccuname" />
 <input type="hidden" name="ccdomain" value="$ccdomain" />
@@ -712,7 +637,7 @@ ENDFORMINFO
 	    $inccourses{$1.'_'.$2}=1;
         }
     }
-    if ($uhome eq 'no_host') {
+    if ($newuser) {
         my $portfolioform;
         if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
             # Current user has quota modification privileges
@@ -721,6 +646,7 @@ ENDFORMINFO
         &initialize_authen_forms($ccdomain);
         my %lt=&Apache::lonlocal::texthash(
                 'cnu'            => 'Create New User',
+                'ast'            => 'as a student',
                 'ind'            => 'in domain',
                 'lg'             => 'Login Data',
                 'hs'             => "Home Server",
@@ -734,12 +660,15 @@ $forminfo
 $loginscript
 </script>
 <input type='hidden' name='makeuser' value='1' />
-<h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain</h2>
+<h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain
 ENDTITLE
-        $r->print('<div class="LC_left_float">');
+        if ($env{'form.action'} eq 'singlestudent') {
+            $r->print(' ('.$lt{'ast'}.')');
+        }
+        $r->print('</h2>'."\n".'<div class="LC_left_float">');
         my $personal_table = 
-            &personal_data_display($ccuname,$ccdomain,$newuser,
-                                   $context,%inst_results);
+            &personal_data_display($ccuname,$ccdomain,$newuser,$context,
+                                   $inst_results{$ccuname.':'.$ccdomain});
         $r->print($personal_table);
         my ($home_server_pick,$numlib) = 
             &Apache::loncommon::home_server_form_item($ccdomain,'hserver',
@@ -802,25 +731,34 @@ ENDAUTH
         } else {
             $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); 
         }
-        $r->print(<<ENDPORT);
-        $portfolioform
-</div><div class="LC_clear_float_footer"></div>
-ENDPORT
+        $r->print($portfolioform);
+        if ($env{'form.action'} eq 'singlestudent') {
+            $r->print(&date_sections_select($context,$newuser,$formname,
+                                            $permission));
+        }
+        $r->print('</div><div class="LC_clear_float_footer"></div>');
     } else { # user already exists
 	my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Modify existing user: ",
+                    'ens'  => "Enroll one student: ",
                     'id'   => "in domain",
 				       );
 	$r->print(<<ENDCHANGEUSER);
 $start_page
 $crumbs
 $forminfo
-<h2>$lt{'cup'} "$ccuname" $lt{'id'} "$ccdomain"</h2>
+<h2>
 ENDCHANGEUSER
-        $r->print('<div class="LC_left_float">');
+        if ($env{'form.action'} eq 'singlestudent') {
+            $r->print($lt{'ens'});
+        } else {
+            $r->print($lt{'cup'});
+        }
+        $r->print(' "'.$ccuname.'" '.$lt{'id'}.' "'.$ccdomain.'"</h2>'.
+                  "\n".'<div class="LC_left_float">');
         my ($personal_table,$showforceid) = 
-            &personal_data_display($ccuname,$ccdomain,$newuser,
-                                   $context,%inst_results);
+            &personal_data_display($ccuname,$ccdomain,$newuser,$context,
+                                   $inst_results{$ccuname.':'.$ccdomain});
         $r->print($personal_table);
         if ($showforceid) {
             $r->print(&Apache::lonuserutils::forceid_change($context));
@@ -852,187 +790,309 @@ ENDNOPORTPRIV
             if ($user_quota_text ne '') {
                 $r->print($user_quota_text);
             }
-            $r->print('</div>');
-
+            if ($env{'form.action'} eq 'singlestudent') {
+                $r->print(&date_sections_select($context,$newuser,$formname));
+            }
         } elsif ($user_quota_text ne '') {
-            $r->print('<div class="LC_left_float">'.$user_quota_text.'</div>');
+            $r->print('<div class="LC_left_float">'.$user_quota_text);
+            if ($env{'form.action'} eq 'singlestudent') {
+                $r->print(&date_sections_select($context,$newuser,$formname));
+            }
+        } else {
+            if ($env{'form.action'} eq 'singlestudent') {
+                $r->print('<div class="LC_left_float">'.
+                          &date_sections_select($context,$newuser,$formname));
+            }
+        }
+        $r->print('</div><div class="LC_clear_float_footer"></div>');
+        if ($env{'form.action'} ne 'singlestudent') {
+            &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);
+        }
+    } ## End of new user/old user logic
+
+    if ($env{'form.action'} eq 'singlestudent') {
+        $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onClick="setSections(this.form)" />'."\n");
+    } else {
+        $r->print('<h3>'.&mt('Add Roles').'</h3>');
+        my $addrolesdisplay = 0;
+        if ($context eq 'domain' || $context eq 'author') {
+            $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain);
+        }
+        if ($context eq 'domain') {
+            my $add_domainroles = &new_domain_roles($r);
+            if (!$addrolesdisplay) {
+                $addrolesdisplay = $add_domainroles;
+            }
+            $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
+            $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");
+        } elsif ($context eq 'author') {
+            if ($addrolesdisplay) {
+                $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');
+                if ($newuser) {
+                    $r->print(' onClick="verify_message(this.form)" \>'."\n");
+                } else {
+                    $r->print('onClick="this.form.submit()" \>'."\n");
+                }
+            } else {
+                $r->print('<br /><a href="javascript:backPage(document.cu)">'.
+                          &mt('Back to previous page').'</a>');
+            }
+        } else {
+            $r->print(&course_level_table(%inccourses));
+            $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections(this.form)" />'."\n");
         }
-        $r->print('<div class="LC_clear_float_footer"></div>');
-        my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
-        # Build up table of user roles to allow revocation of a role.
-        my ($tmp) = keys(%rolesdump);
-        unless ($tmp =~ /^(con_lost|error)/i) {
-           my $now=time;
-	   my %lt=&Apache::lonlocal::texthash(
-		    'rer'  => "Existing Roles",
-                    'rev'  => "Revoke",                    
+    }
+    $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
+    $r->print('<input type="hidden" name="currstate" value="" />');
+    $r->print('<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />');
+    $r->print("</form>".&Apache::loncommon::end_page());
+    return;
+}
+
+sub singleuser_breadcrumb {
+    my %breadcrumb_text;
+    if ($env{'form.action'} eq 'singlestudent') {
+        $breadcrumb_text{'search'} = 'Enroll a student';
+        $breadcrumb_text{'userpicked'} = 'Select a user',
+        $breadcrumb_text{'modify'} = 'Set section/dates',
+    } else {
+        $breadcrumb_text{'search'} = 'Create/modify user';
+        $breadcrumb_text{'userpicked'} = 'Select a user',
+        $breadcrumb_text{'modify'} = 'Set user role',
+    }
+    return %breadcrumb_text;
+}
+
+sub date_sections_select {
+    my ($context,$newuser,$formname,$permission) = @_;
+    my $cid = $env{'request.course.id'};
+    my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid);
+    my $date_table = '<h3>'.&mt('Starting and Ending Dates').'</h3>'."\n".
+        &Apache::lonuserutils::date_setting_table(undef,undef,$context,
+                                                  undef,$formname,$permission);
+    my $rowtitle = 'Section';
+    my $secbox = '<h3>'.&mt('Section').'</h3>'."\n".
+        &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle,
+                                              $permission);
+    my $output = $date_table.$secbox;
+    return $output;
+}
+
+sub validation_javascript {
+    my ($context,$ccdomain,$pjump_def,$groupslist,$newuser,$formname,
+        $loaditem) = @_;
+    my $dc_setcourse_code = '';
+    my $nondc_setsection_code = '';
+    if ($context eq 'domain') {
+        my $dcdom = $env{'request.role.domain'};
+        $loaditem->{'onload'} = "document.cu.coursedesc.value='';";
+        $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser');
+    } else {
+        $nondc_setsection_code =
+            &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
+    }
+    my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
+                                   $nondc_setsection_code,$groupslist);
+
+    my ($jsback,$elements) = &crumb_utilities();
+    my $javascript_validations;
+    if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($newuser)) {
+        my ($krbdef,$krbdefdom) =
+            &Apache::loncommon::get_kerberos_defaults($ccdomain);
+        $javascript_validations =
+            &Apache::lonuserutils::javascript_validations('createuser',$krbdefdom,undef,
+                                                          undef,$ccdomain);
+    }
+    $js .= "\n".
+           '<script type="text/javascript">'."\n".$jsback."\n".
+           $javascript_validations.'</script>';
+    return $js;
+}
+
+sub display_existing_roles {
+    my ($r,$ccuname,$ccdomain,$inccourses) = @_;
+    my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
+    # Build up table of user roles to allow revocation and re-enabling of roles.
+    my ($tmp) = keys(%rolesdump);
+    if ($tmp !~ /^(con_lost|error)/i) {
+        my $now=time;
+        my %lt=&Apache::lonlocal::texthash(
+                    'rer'  => "Existing Roles",
+                    'rev'  => "Revoke",
                     'del'  => "Delete",
-		    'ren'  => "Re-Enable",
+                    'ren'  => "Re-Enable",
                     'rol'  => "Role",
                     'ext'  => "Extent",
                     'sta'  => "Start",
-                    'end'  => "End"
-				       );
-           my (%roletext,%sortrole,%roleclass,%rolepriv);
-	   foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
-				    my $b1=join('_',(split('_',$b))[1,0]);
-				    return $a1 cmp $b1;
-				} keys(%rolesdump)) {
-               next if ($area =~ /^rolesdef/);
-	       my $envkey=$area;
-               my $role = $rolesdump{$area};
-               my $thisrole=$area;
-               $area =~ s/\_\w\w$//;
-               my ($role_code,$role_end_time,$role_start_time) = 
-                   split(/_/,$role);
+                    'end'  => "End",
+                                       );
+        my (%roletext,%sortrole,%roleclass,%rolepriv);
+        foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
+                                    my $b1=join('_',(split('_',$b))[1,0]);
+                                    return $a1 cmp $b1;
+                                } keys(%rolesdump)) {
+            next if ($area =~ /^rolesdef/);
+            my $envkey=$area;
+            my $role = $rolesdump{$area};
+            my $thisrole=$area;
+            $area =~ s/\_\w\w$//;
+            my ($role_code,$role_end_time,$role_start_time) =
+                split(/_/,$role);
 # Is this a custom role? Get role owner and title.
-	       my ($croleudom,$croleuname,$croletitle)=
-	           ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
-               my $allowed=0;
-               my $delallowed=0;
-	       my $sortkey=$role_code;
-	       my $class='Unknown';
-               if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
-		   $class='Course';
-                   my ($coursedom,$coursedir) = ($1,$2);
-		   $sortkey.="\0$coursedom";
-                   # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
-                   my %coursedata=
-                       &Apache::lonnet::coursedescription($1.'_'.$2);
-		   my $carea;
-		   if (defined($coursedata{'description'})) {
-		       $carea=$coursedata{'description'}.
-                           '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
+            my ($croleudom,$croleuname,$croletitle)=
+                ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
+            my $allowed=0;
+            my $delallowed=0;
+            my $sortkey=$role_code;
+            my $class='Unknown';
+            if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
+                $class='Course';
+                my ($coursedom,$coursedir) = ($1,$2);
+                $sortkey.="\0$coursedom";
+                # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
+                my %coursedata=
+                    &Apache::lonnet::coursedescription($1.'_'.$2);
+                my $carea;
+                if (defined($coursedata{'description'})) {
+                    $carea=$coursedata{'description'}.
+                        '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
-		       $sortkey.="\0".$coursedata{'description'};
-                       $class=$coursedata{'type'};
-		   } else {
-		       $carea=&mt('Unavailable course').': '.$area;
-		       $sortkey.="\0".&mt('Unavailable course').': '.$area;
-		   }
-		   $sortkey.="\0$coursedir";
-                   $inccourses{$1.'_'.$2}=1;
-                   if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
-                       (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
-                       $allowed=1;
-                   }
-                   if ((&Apache::lonnet::allowed('dro',$1)) ||
-                       (&Apache::lonnet::allowed('dro',$ccdomain))) {
-                       $delallowed=1;
-                   }
+                    $sortkey.="\0".$coursedata{'description'};
+                    $class=$coursedata{'type'};
+                } else {
+                    $carea=&mt('Unavailable course').': '.$area;
+                    $sortkey.="\0".&mt('Unavailable course').': '.$area;
+                }
+                $sortkey.="\0$coursedir";
+                $inccourses->{$1.'_'.$2}=1;
+                if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
+                    (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
+                    $allowed=1;
+                }
+                if ((&Apache::lonnet::allowed('dro',$1)) ||
+                    (&Apache::lonnet::allowed('dro',$ccdomain))) {
+                    $delallowed=1;
+                }
 # - custom role. Needs more info, too
-		   if ($croletitle) {
-		       if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
-			   $allowed=1;
-			   $thisrole.='.'.$role_code;
-		       }
-		   }
-                   # Compute the background color based on $area
-                   if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
-                       $carea.='<br />Section: '.$3;
-		       $sortkey.="\0$3";
-                   }
-                   $area=$carea;
-               } else {
-		   $sortkey.="\0".$area;
-                   # Determine if current user is able to revoke privileges
-                   if ($area=~m{^/($match_domain)/}) {
-                       if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
+                if ($croletitle) {
+                    if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
+                        $allowed=1;
+                        $thisrole.='.'.$role_code;
+                    }
+                }
+                # Compute the background color based on $area
+                if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
+                    $carea.='<br />Section: '.$3;
+                    $sortkey.="\0$3";
+                    if (!$allowed) {
+                        if ($env{'request.course.sec'} eq $3) {
+                            if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
+                                $allowed = 1;
+                            }
+                        }
+                    }
+                }
+                $area=$carea;
+            } else {
+                $sortkey.="\0".$area;
+                # Determine if current user is able to revoke privileges
+                if ($area=~m{^/($match_domain)/}) {
+                    if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
-                           $allowed=1;
-                       }
-                       if (((&Apache::lonnet::allowed('dro',$1))  ||
-                            (&Apache::lonnet::allowed('dro',$ccdomain))) &&
-                           ($role_code ne 'dc')) {
-                           $delallowed=1;
-                       }
-                   } else {
-                       if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
-                           $allowed=1;
-                       }
-                   }
-		   if ($role_code eq 'ca' || $role_code eq 'au') {
-		       $class='Construction Space';
-		   } elsif ($role_code eq 'su') {
-		       $class='System';
-		   } else {
-		       $class='Domain';
-		   }
-               }
-               if (($role_code eq 'ca') || ($role_code eq 'aa')) {
-                   $area=~m{/($match_domain)/($match_username)};
-		   if (&Apache::lonuserutils::authorpriv($2,$1)) {
-		       $allowed=1;
-                   } else {
-                       $allowed=0;
-                   }
-               }
-               my $row = '';
-               $row.= '<td>';
-               my $active=1;
-               $active=0 if (($role_end_time) && ($now>$role_end_time));
-               if (($active) && ($allowed)) {
-                   $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
-               } else {
-                   if ($active) {
-                      $row.='&nbsp;';
-		   } else {
-                      $row.=&mt('expired or revoked');
-		   }
-               }
-	       $row.='</td><td>';
-               if ($allowed && !$active) {
-                   $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
-               } else {
-                   $row.='&nbsp;';
-               }
-	       $row.='</td><td>';
-               if ($delallowed) {
-                   $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
-               } else {
+                        $allowed=1;
+                    }
+                    if (((&Apache::lonnet::allowed('dro',$1))  ||
+                         (&Apache::lonnet::allowed('dro',$ccdomain))) &&
+                        ($role_code ne 'dc')) {
+                        $delallowed=1;
+                    }
+                } else {
+                    if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
+                        $allowed=1;
+                    }
+                }
+                if ($role_code eq 'ca' || $role_code eq 'au') {
+                    $class='Construction Space';
+                } elsif ($role_code eq 'su') {
+                    $class='System';
+                } else {
+                    $class='Domain';
+                }
+            }
+            if (($role_code eq 'ca') || ($role_code eq 'aa')) {
+                $area=~m{/($match_domain)/($match_username)};
+                if (&Apache::lonuserutils::authorpriv($2,$1)) {
+                    $allowed=1;
+                } else {
+                    $allowed=0;
+                }
+            }
+            my $row = '';
+            $row.= '<td>';
+            my $active=1;
+            $active=0 if (($role_end_time) && ($now>$role_end_time));
+            if (($active) && ($allowed)) {
+                $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
+            } else {
+                if ($active) {
                    $row.='&nbsp;';
-               }
-	       my $plaintext='';
-	       if (!$croletitle) {
-                   $plaintext=&Apache::lonnet::plaintext($role_code,$class)
-	       } else {
-	           $plaintext=
-		"Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
-	       }
-               $row.= '</td><td>'.$plaintext.
-                      '</td><td>'.$area.
-                      '</td><td>'.($role_start_time?localtime($role_start_time)
-                                                   : '&nbsp;' ).
-                      '</td><td>'.($role_end_time  ?localtime($role_end_time)
-                                                   : '&nbsp;' )
-                      ."</td>";
-	       $sortrole{$sortkey}=$envkey;
-	       $roletext{$envkey}=$row;
-	       $roleclass{$envkey}=$class;
-               $rolepriv{$envkey}=$allowed;
-               #$r->print($row);
-           } # end of foreach        (table building loop)
-           my $rolesdisplay = 0;
-           my %output = ();
-	   foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
-	       $output{$type} = '';
-	       foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
-		   if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { 
-		       $output{$type}.=
-                             &Apache::loncommon::start_data_table_row().
-                             $roletext{$sortrole{$which}}.
-                             &Apache::loncommon::end_data_table_row();
-		   }
-	       }
-	       unless($output{$type} eq '') {
-		   $output{$type} = '<tr class="LC_info_row">'.
-			     "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
-                              $output{$type};
-                   $rolesdisplay = 1;
-	       }
-	   }
-           if ($rolesdisplay == 1) {
-               $r->print('
+                } else {
+                   $row.=&mt('expired or revoked');
+                }
+            }
+            $row.='</td><td>';
+            if ($allowed && !$active) {
+                $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
+            } else {
+                $row.='&nbsp;';
+            }
+            $row.='</td><td>';
+            if ($delallowed) {
+                $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
+            } else {
+                $row.='&nbsp;';
+            }
+            my $plaintext='';
+            if (!$croletitle) {
+                $plaintext=&Apache::lonnet::plaintext($role_code,$class)
+            } else {
+                $plaintext=
+        "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
+            }
+            $row.= '</td><td>'.$plaintext.
+                   '</td><td>'.$area.
+                   '</td><td>'.($role_start_time?localtime($role_start_time)
+                                                : '&nbsp;' ).
+                   '</td><td>'.($role_end_time  ?localtime($role_end_time)
+                                                : '&nbsp;' )
+                   ."</td>";
+            $sortrole{$sortkey}=$envkey;
+            $roletext{$envkey}=$row;
+            $roleclass{$envkey}=$class;
+            $rolepriv{$envkey}=$allowed;
+            #$r->print($row);
+        } # end of foreach        (table building loop)
+        my $rolesdisplay = 0;
+        my %output = ();
+        foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
+            $output{$type} = '';
+            foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
+                if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
+                    $output{$type}.=
+                          &Apache::loncommon::start_data_table_row().
+                          $roletext{$sortrole{$which}}.
+                          &Apache::loncommon::end_data_table_row();
+                }
+            }
+            unless($output{$type} eq '') {
+                $output{$type} = '<tr class="LC_info_row">'.
+                          "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
+                           $output{$type};
+                $rolesdisplay = 1;
+            }
+        }
+        if ($rolesdisplay == 1) {
+            $r->print('
 <h3>'.$lt{'rer'}.'</h3>'.
 &Apache::loncommon::start_data_table("LC_createuser").
 &Apache::loncommon::start_data_table_header_row().
@@ -1040,30 +1100,33 @@ ENDNOPORTPRIV
 '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
 '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
 &Apache::loncommon::end_data_table_header_row());
-               foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
-                   if ($output{$type}) {
-                       $r->print($output{$type}."\n");
-                   }
-               }
-	       $r->print(&Apache::loncommon::end_data_table());
-           }
-        }  # End of unless
-    } ## End of new user/old user logic
+           foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
+                if ($output{$type}) {
+                    $r->print($output{$type}."\n");
+                }
+            }
+            $r->print(&Apache::loncommon::end_data_table());
+        }
+    }  # End of check for keys in rolesdump
+    return;
+}
+
+sub new_coauthor_roles {
+    my ($r,$ccuname,$ccdomain) = @_;
     my $addrolesdisplay = 0;
-    $r->print('<h3>'.&mt('Add Roles').'</h3>');
-#
-# Co-Author
-# 
+    #
+    # Co-Author
+    #
     if (&Apache::lonuserutils::authorpriv($env{'user.name'},
                                           $env{'request.role.domain'}) &&
         ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {
         # No sense in assigning co-author role to yourself
         $addrolesdisplay = 1;
-	my $cuname=$env{'user.name'};
+        my $cuname=$env{'user.name'};
         my $cudom=$env{'request.role.domain'};
-	   my %lt=&Apache::lonlocal::texthash(
-		    'cs'   => "Construction Space",
-                    'act'  => "Activate",                    
+        my %lt=&Apache::lonlocal::texthash(
+                    'cs'   => "Construction Space",
+                    'act'  => "Activate",
                     'rol'  => "Role",
                     'ext'  => "Extent",
                     'sta'  => "Start",
@@ -1072,16 +1135,16 @@ ENDNOPORTPRIV
                     'caa'  => "Assistant Co-Author",
                     'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"
-				       );
-       $r->print('<h4>'.$lt{'cs'}.'</h4>'."\n". 
-           &Apache::loncommon::start_data_table()."\n".
-           &Apache::loncommon::start_data_table_header_row()."\n".
-           '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th>'.
-           '<th>'.$lt{'ext'}.'</th><th>'.$lt{'sta'}.'</th>'.
-           '<th>'.$lt{'end'}.'</th>'."\n".
-           &Apache::loncommon::end_data_table_header_row()."\n".
-           &Apache::loncommon::start_data_table_row()."\n".
-           '<td>
+                                       );
+        $r->print('<h4>'.$lt{'cs'}.'</h4>'."\n".
+                  &Apache::loncommon::start_data_table()."\n".
+                  &Apache::loncommon::start_data_table_header_row()."\n".
+                  '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th>'.
+                  '<th>'.$lt{'ext'}.'</th><th>'.$lt{'sta'}.'</th>'.
+                  '<th>'.$lt{'end'}.'</th>'."\n".
+                  &Apache::loncommon::end_data_table_header_row()."\n".
+                  &Apache::loncommon::start_data_table_row().'
+           <td>
             <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />
            </td>
            <td>'.$lt{'cau'}.'</td>
@@ -1092,8 +1155,8 @@ ENDNOPORTPRIV
 <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_ca" value="" />
 <a href=
 "javascript:pjump('."'date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
-          &Apache::loncommon::end_data_table_row()."\n".
-          &Apache::loncommon::start_data_table_row()."\n".
+              &Apache::loncommon::end_data_table_row()."\n".
+              &Apache::loncommon::start_data_table_row()."\n".
 '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
 <td>'.$lt{'caa'}.'</td>
 <td>'.$cudom.'_'.$cuname.'</td>
@@ -1103,24 +1166,30 @@ ENDNOPORTPRIV
 <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_aa" value="" />
 <a href=
 "javascript:pjump('."'date_end','End Date Assistant Co-Author',document.cu.end_$cudom\_$cuname\_aa.value,'end_$cudom\_$cuname\_aa','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
-         &Apache::loncommon::end_data_table_row()."\n".
-         &Apache::loncommon::end_data_table());
+             &Apache::loncommon::end_data_table_row()."\n".
+             &Apache::loncommon::end_data_table());
     } elsif ($env{'request.role'} =~ /^au\./) {
         if (!(&Apache::lonuserutils::authorpriv($env{'user.name'},
                                                 $env{'request.role.domain'}))) {
             $r->print('<span class="LC_error">'.
                       &mt('You do not have privileges to assign co-author roles.').
                       '</span>');
-        } elsif (($env{'user.name'} eq $ccuname) && 
+        } elsif (($env{'user.name'} eq $ccuname) &&
              ($env{'user.domain'} eq $ccdomain)) {
-           $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted'));
+            $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted'));
         }
     }
-#
-# Domain level
-#
+    return $addrolesdisplay;;
+}
+
+sub new_domain_roles {
+    my ($r) = @_;
+    my $addrolesdisplay = 0;
+    #
+    # Domain level
+    #
     my $num_domain_level = 0;
-    my $domaintext = 
+    my $domaintext =
     '<h4>'.&mt('Domain Level').'</h4>'.
     &Apache::loncommon::start_data_table().
     &Apache::loncommon::start_data_table_header_row().
@@ -1132,12 +1201,12 @@ ENDNOPORTPRIV
         foreach my $role ('dc','li','dg','au','sc') {
             if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
                my $plrole=&Apache::lonnet::plaintext($role);
-	       my %lt=&Apache::lonlocal::texthash(
+               my %lt=&Apache::lonlocal::texthash(
                     'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"
-				       );
+                                       );
                $num_domain_level ++;
-               $domaintext .= 
+               $domaintext .=
 &Apache::loncommon::start_data_table_row().
 '<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>
 <td>'.$plrole.'</td>
@@ -1150,40 +1219,14 @@ ENDNOPORTPRIV
 "javascript:pjump('."'date_end','End Date $plrole',document.cu.end_$thisdomain\_$role.value,'end_$thisdomain\_$role','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'.
 &Apache::loncommon::end_data_table_row();
             }
-        } 
+        }
     }
     $domaintext.= &Apache::loncommon::end_data_table();
     if ($num_domain_level > 0) {
         $r->print($domaintext);
         $addrolesdisplay = 1;
     }
-#
-# Course level
-#
-
-    if ($env{'request.role'} =~ m{^dc\./($match_domain)/$}) {
-        $r->print(&course_level_dc($1,'Course'));
-        $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");
-    } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/$}) {
-        if ($addrolesdisplay) {
-            $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');
-            if ($newuser) {
-                $r->print(' onClick="verify_message(this.form)" \>'."\n");
-            } else {
-                $r->print('onClick="this.form.submit()" \>'."\n"); 
-            }
-        } else {
-            $r->print('<br /><a href="javascript:backPage(document.cu)">'.
-                      &mt('Back to previous page').'</a>');
-        }
-    } else {
-        $r->print(&course_level_table(%inccourses));
-        $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections(this.form)" />'."\n");
-    }
-    $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
-    $r->print('<input type="hidden" name="currstate" value="" />');
-    $r->print('<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />');
-    $r->print("</form>".&Apache::loncommon::end_page());
+    return $addrolesdisplay;
 }
 
 sub user_authentication {
@@ -1353,7 +1396,7 @@ sub modify_login_block {
 }
 
 sub personal_data_display {
-    my ($ccuname,$ccdomain,$newuser,$context,%inst_results) = @_; 
+    my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_;
     my ($output,$showforceid,%userenv,%domconfig);
     if (!$newuser) {
         # Get the users information
@@ -1394,8 +1437,12 @@ sub personal_data_display {
         }
         $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
         if ($newuser) {
-            if ($inst_results{$item} ne '') {
-                $output .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results{$item}.'" />'.$inst_results{$item};
+            if (ref($inst_results) eq 'HASH') {
+                if ($inst_results->{$item} ne '') {
+                    $output .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};
+                } else {
+                    $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                }
             } else {
                 $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
             }
@@ -1455,20 +1502,20 @@ sub update_user_data {
     } else {
         $title='Modify User Privileges';
     }
-
+    my $newuser = 0;
     my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'."\n".
                   $jsback."\n".'</script>'."\n";
-
+    my %breadcrumb_text = &singleuser_breadcrumb();
     $r->print(&Apache::loncommon::start_page($title,$jscript));
     &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.userupdate)",
-         text=>"Create/modify user",
+         text=>$breadcrumb_text{'search'},
          faq=>282,bug=>'Instructor Interface',});
     if ($env{'form.prevphase'} eq 'userpicked') {
         &Apache::lonhtmlcommon::add_breadcrumb
            ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')",
-             text=>"Select a user",
+             text=>$breadcrumb_text{'userpicked'},
              faq=>282,bug=>'Instructor Interface',});
     }
     &Apache::lonhtmlcommon::add_breadcrumb
@@ -1628,6 +1675,10 @@ sub update_user_data {
 	}
     }
     ##
+    my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
+    if ($context eq 'course') {
+        ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
+    }
     if (! $env{'form.makeuser'} ) {
         # Check for need to change
         my %userenv = &Apache::lonnet::get
@@ -1643,10 +1694,9 @@ sub update_user_data {
         my %domconfig =
             &Apache::lonnet::get_dom('configuration',['usermodification'],
                                      $env{'form.ccdomain'});
-        my @roletypes = ('active','future');
-        my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@roletypes,undef,$env{'request.role.domain'});
-        my @userroles;
-        my ($cnum,$cdom,$auname,$audom);
+        my @statuses = ('active','future');
+        my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'});
+        my ($auname,$audom);
         if ($context eq 'course') {
             $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
             $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -1779,7 +1829,7 @@ sub update_user_data {
                 }
             }
         }
-        my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota,
+        my ($quotachanged,$oldportfolioquota,$newportfolioquota,
             $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,
             $newdefquotatext);
         my ($defquota,$settingstatus) = 
@@ -1914,7 +1964,7 @@ END
                          ($env{'form.ccuname'} => $env{'form.cid'}));
                     if (($recurseid) &&
                         (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
-                        my %userupdate = (
+                        %userupdate = (
                                   lastname   => $env{'form.clasaname'},
                                   middlename => $env{'form.cmiddlename'},
                                   firstname  => $env{'form.cfirstname'},
@@ -2651,22 +2701,8 @@ sub handler {
             &Apache::lonuserutils::print_first_users_upload_form($r,$context);
         }
         $r->print('</form>'.&Apache::loncommon::end_page());
-    } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
-        $r->print(&header());
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=expire',
-              text=>"Expire User Roles"});
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles',
-                                                      'User_Management_Drops'));
-        if (! exists($env{'form.state'})) {
-            &Apache::lonuserutils::print_expire_menu($r,$context);
-        } elsif ($env{'form.state'} eq 'done') {
-            &Apache::lonuserutils::expire_user_list($r,$context);
-        } else {
-            &Apache::lonuserutils::print_expire_menu($r,$context);
-        }
-        $r->print(&Apache::loncommon::end_page());
-    } elsif ($env{'form.action'} eq 'singleuser' && $permission->{'cusr'}) {
+    } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'}
+             eq 'singlestudent')) && ($permission->{'cusr'})) {
         my $phase = $env{'form.phase'};
         my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
 	&Apache::loncreateuser::restore_prev_selections();
@@ -2695,8 +2731,14 @@ sub handler {
                     $currstate = $env{'form.currstate'};
                 }
                 if ($currstate eq 'select') {
+                    my $operation; 
+                    if ($env{'form.action'} eq 'singleuser') {
+                        $operation = 'createuser';
+                    } elsif ($env{'form.action'} eq 'singlestudent') {
+                        $operation = 'enrollstudent';
+                    }
                     &print_user_selection_page($r,$response,$srch,$results,
-                                               'createuser',\@search,$context);
+                                               $operation,\@search,$context);
                 } elsif ($currstate eq 'modify') {
                     my ($ccuname,$ccdomain);
                     if (($srch->{'srchby'} eq 'uname') && 
@@ -2779,19 +2821,24 @@ sub handler {
                          $formname,$totcodes,$codetitles,$idlist,$idlist_titles);
             $r->print(&Apache::loncommon::end_page());
         }
-    } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
+    } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
         $r->print(&header());
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',
-              text=>"Expire Users"});
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles',
-                                                      'User_Management_Drops'));
-        if (! exists($env{'form.state'})) {
-            &Apache::lonuserutils::print_expire_menu($r,$context);
+              text=>"Drop Students"});
+        if (!exists($env{'form.state'})) {
+            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
+                                                          'Course_Drop_Student'));
+
+            &Apache::lonuserutils::print_drop_menu($r,$context,$permission);
         } elsif ($env{'form.state'} eq 'done') {
-            &Apache::lonuserutiles::expire_user_list($r,$context);
-        } else {
-            &print_expire_menu($r,$context);
+            &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>'/adm/createuser?action=drop',
+              text=>"Result"});
+            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
+                                                          'Course_Drop_Student'));
+            &Apache::lonuserutils::update_user_list($r,$context,undef,
+                                                    $env{'form.action'});
         }
         $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'dateselect') {
@@ -2892,21 +2939,33 @@ sub print_main_menu {
         push(@menu,$customlink);
     }
     if ($context eq 'course') {
-        my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
-        my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; 
-        my @courselinks = 
+        my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
+        my @courselinks =
             (
-               { text => 'Automated Enrollment Manager',
+              { text => 'Enroll a Single Student',
+                 help => 'Course_Single_Student',
+                 action => 'singlestudent',
+                 permission => $permission->{'cusr'},
+                 },
+              { text => 'Drop Students',
+                help => 'Course_Drop_Student',
+                action => 'drop',
+                permission => $permission->{'cusr'},
+              });
+        if (!exists($permission->{'cusr_section'})) {
+            push(@courselinks,
+               { text => 'Automated Student Enrollment Manager',
                  permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                 && $permission->{'cusr'}),
                  url  => '/adm/populate',
-                 },
+                 });
+        }
+        push(@courselinks,
                { text => 'Manage Course Groups',
                  help => 'Course_Manage_Group',
                  permission => $permission->{'grp_manage'},
                  url => '/adm/coursegroups?refpage=cusr',
-               },
-            );
+               });
         push(@menu,@courselinks);
     }
     my $menu_html = '';
@@ -3351,8 +3410,18 @@ sub crumb_utilities {
 
     my $jsback .= qq|
 function backPage(formname,prevphase,prevstate) {
-    formname.phase.value = prevphase;
-    formname.currstate.value = prevstate;
+    if (typeof prevphase == 'undefined') {
+        formname.phase.value = '';
+    }
+    else {  
+        formname.phase.value = prevphase;
+    }
+    if (typeof prevstate == 'undefined') {
+        formname.currstate.value = '';
+    }
+    else {
+        formname.currstate.value = prevstate;
+    }
     formname.submit();
 }
 |;
@@ -3394,7 +3463,8 @@ sub course_level_table {
 		    &Apache::loncommon::get_sections($domain,$cnum);
             }
         }
-	foreach my $role ('st','ta','ep','in','cc') {
+        my @roles = &Apache::lonuserutils::roles_by_context('course');
+	foreach my $role (@roles) {
 	    if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
 		my $plrole=&Apache::lonnet::plaintext($role);
 		$table .= &Apache::loncommon::start_data_table_row().
@@ -3494,6 +3564,7 @@ $table.
 sub course_level_dc {
     my ($dcdom) = @_;
     my %customroles=&Apache::lonuserutils::my_custom_roles();
+    my @roles = &Apache::lonuserutils::roles_by_context('course');
     my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="dccourse" value="" />';
@@ -3518,7 +3589,7 @@ sub course_level_dc {
     my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                      '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                      '<td><select name="role">'."\n";
-    foreach  my $role ('st','ta','ep','in','cc') {
+    foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$role.'">'.$plrole;
     }