--- loncom/interface/lonuserutils.pm	2010/11/14 21:19:08	1.97.2.22
+++ loncom/interface/lonuserutils.pm	2010/11/29 04:40:12	1.109.2.11
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Utility functions for managing LON-CAPA user accounts
 #
-# $Id: lonuserutils.pm,v 1.97.2.22 2010/11/14 21:19:08 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.109.2.11 2010/11/29 04:40:12 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,6 +36,7 @@ use Apache::loncommon();
 use Apache::lonhtmlcommon;
 use Apache::lonlocal;
 use Apache::longroup;
+use Apache::lonnavmaps;
 use LONCAPA qw(:DEFAULT :match);
 
 ###############################################################
@@ -47,8 +48,7 @@ sub modifystudent {
     # this one.  If $csec is defined, drop them from all other sections of
     # this course and add them to section $csec
     my ($cnum,$cdom) = &get_course_identity($courseid);
-    my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1});
-    my %roles = &Apache::lonnet::dump('roles',$udom,$unam,'.',undef,$extra);
+    my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
     my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles
     return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
@@ -296,7 +296,7 @@ sub hidden_input {
 }
 
 sub print_upload_manager_header {
-    my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype,
+    my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype,$formname,
         $can_assign)=@_;
     my $javascript;
     #
@@ -327,9 +327,32 @@ sub print_upload_manager_header {
         $password_choice = 'int';
     }
     #
-    my $groupslist;
+    my ($sectionjs,$groupslist);
     if ($context eq 'course') {
         $groupslist = &get_groupslist();
+        if ($env{'form.context'} eq 'requestcrs') {
+            $sectionjs = <<"ENDJS";
+
+function toggleSectionsDefault() {
+    var usingsecs;
+    if (document.$formname.usesection.length > 1) {
+        for (var i=0; i<document.$formname.usesection.length; i++) {
+            if (document.$formname.usesection[i].checked) {
+                usingsecs = document.$formname.usesection[i].value;
+            }
+        }
+    }
+    if (usingsecs == 1) {
+        document.getElementById('defaultsec').style.display="block";
+    } else {
+        document.getElementById('defaultsec').style.display="none";
+        document.$formname.newsec.value = "";
+        document.$formname.sections.value = "";
+    }
+    return;
+}
+ENDJS
+        }
     }
     my $javascript_validations =
         &javascript_validations('upload',$krbdefdom,$password_choice,undef,
@@ -342,14 +365,17 @@ sub print_upload_manager_header {
              ."</p>\n");
     $r->print('<div class="LC_left_float"><h3>'.
               &mt('Identify fields in uploaded list')."</h3>\n");
-    $r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n");
+    $r->print(&mt('Enter as many fields as you can.').'<br />'.
+              &mt('The system will inform you and bring you back to this page,').
+              '<br />'.&mt('if the data selected are insufficient to add users.')."<br />\n");
     $r->print(&hidden_input('action','upload').
               &hidden_input('state','got_file').
               &hidden_input('associate','').
               &hidden_input('datatoken',$datatoken).
               &hidden_input('fileupload',$env{'form.fileupload'}).
               &hidden_input('upfiletype',$env{'form.upfiletype'}).
-              &hidden_input('upfile_associate',$env{'form.upfile_associate'}));
+              &hidden_input('upfile_associate',$env{'form.upfile_associate'}).
+              &hidden_input('context',$env{'form.context'}));
     $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'.
               &mt('Ignore First Line').'</label><br />');
     $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '.
@@ -358,7 +384,7 @@ sub print_upload_manager_header {
     $r->print("<br /><br />\n".
               '<script type="text/javascript" language="Javascript">'."\n".
               '// <![CDATA['."\n".
-              $javascript."\n".$javascript_validations."\n".
+              $javascript."\n".$javascript_validations."\n".$sectionjs."\n".
               '// ]]>'."\n".
               '</script>');
 }
@@ -389,9 +415,13 @@ sub javascript_validations {
             if ($context eq 'course') {
                 if ($env{'request.course.sec'} eq '') {
                     $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');';
-                    $setsections_js =
-                        &setsections_javascript($param{'formname'},$groupslist,
-                                                $mode,'',$crstype);
+                    if ($env{'form.context'} eq 'requestcrs') {
+                        $setsections_js =  &newsections_javascript($param{'formname'});
+                    } else {
+                        $setsections_js =
+                            &setsections_javascript($param{'formname'},$groupslist,
+                                                    $mode,'',$crstype);
+                    }
                 } else {
                     $setsection_call = "'ok'";
                 }
@@ -519,7 +549,9 @@ END
 END
     } else {
         $section_checks = &section_check_js();
-        $optional_checks = (<<END);
+
+        unless ($env{'form.context'} eq 'requestcrs') {
+            $optional_checks = (<<END);
     var message='';
     if (foundname==0) {
         message='$alert{'name'}';
@@ -555,6 +587,7 @@ END
         message+='$alert{'domain'}';
     }
 END
+        }
         if (($mode eq 'upload') && ($context eq 'domain')) {
             $optional_checks .= (<<END);
 
@@ -566,7 +599,14 @@ END
     }
 END
         }
-        $optional_checks .= (<<END);
+        if ($env{'form.context'} eq 'requestcrs') {
+            $optional_checks .= (<<END);
+    vf.state.value='enrolling';
+    $finish
+}
+END
+        } else {
+            $optional_checks .= (<<END);
 
     if (message!='') {
         message+= '\\n$alert{'continue'}';
@@ -580,6 +620,7 @@ END
     }
 }
 END
+       }
     }
     my $result = $function_name.$auth_checks.$optional_checks."\n".
                  $section_checks.$authheader;
@@ -609,7 +650,7 @@ sub upload_manager_javascript_forward_as
             $auth_update = <<"END";
    // Currently the initial password field is only supported for internal auth
    // (see bug 6368).
-   if (nw==9) {
+   if (nw==2) {
        eval('vf.f'+tf+'.selectedIndex=0;')
        alert('$warning');
    }
@@ -618,7 +659,7 @@ END
             $auth_update = <<"END";
    // If we set the password, make the password form below correspond to
    // the new value.
-   if (nw==9) {
+   if (nw==2) {
       changed_radio('int',document.studentform);
       set_auth_radio_buttons('int',document.studentform);
 $argreset
@@ -643,10 +684,10 @@ function verify(vf,sec_caller) {
     for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');
         if (tw==1) { founduname=1; }
-        if ((tw>=2) && (tw<=6)) { foundname=1; }
-        if (tw==7) { foundid=1; }
-        if (tw==8) { foundsec=1; }
-        if (tw==9) { foundpwd=1; }
+        if (tw==2) { foundpwd=1; }
+        if ((tw>=3) && (tw<=7)) { foundname=1; }
+        if (tw==8) { foundid=1; }
+        if (tw==9) { foundsec=1; }
         if (tw==10) { foundemail=1; }
         if (tw==11) { foundrole=1; }
         if (tw==12) { founddomain=1; }
@@ -663,14 +704,14 @@ function verify(vf,sec_caller) {
 //
 // 0 = none
 // 1 = username
-// 2 = names (lastname, firstnames)
-// 3 = fname (firstname)
-// 4 = mname (middlename)
-// 5 = lname (lastname)
-// 6 = gen   (generation)
-// 7 = id
-// 8 = section
-// 9 = ipwd  (password)
+// 2 = ipwd  (password)
+// 3 = names (lastname, firstnames)
+// 4 = fname (firstname)
+// 5 = mname (middlename)
+// 6 = lname (lastname)
+// 7 = gen   (generation)
+// 8 = id
+// 9 = section
 // 10 = email address
 // 11 = role
 // 12 = domain
@@ -686,20 +727,20 @@ function flip(vf,tf) {
       }
    }
    // If we set this to 'lastname, firstnames', clear out all the ones
-   // set to 'fname','mname','lname','gen' (3,4,5,6) currently.
-   if (nw==2) {
+   // set to 'fname','mname','lname','gen' (4,5,6,7) currently.
+   if (nw==3) {
       for (i=0;i<=vf.nfields.value;i++) {
-         if ((eval('vf.f'+i+'.selectedIndex')>=3) &&
-             (eval('vf.f'+i+'.selectedIndex')<=6)) {
+         if ((eval('vf.f'+i+'.selectedIndex')>=4) &&
+             (eval('vf.f'+i+'.selectedIndex')<=7)) {
              eval('vf.f'+i+'.selectedIndex=0;')
          }
       }
    }
-   // If we set this to one of 'fname','mname','lname','gen' (3,4,5,6),
-   // clear out any that are set to 'lastname, firstnames' (2)
-   if ((nw>=3) && (nw<=6)) {
+   // If we set this to one of 'fname','mname','lname','gen' (4,5,6,7),
+   // clear out any that are set to 'lastname, firstnames' (3)
+   if ((nw>=4) && (nw<=7)) {
       for (i=0;i<=vf.nfields.value;i++) {
-         if (eval('vf.f'+i+'.selectedIndex')==2) {
+         if (eval('vf.f'+i+'.selectedIndex')==3) {
              eval('vf.f'+i+'.selectedIndex=0;')
          }
       }
@@ -710,7 +751,7 @@ function flip(vf,tf) {
 function clearpwd(vf) {
     var i;
     for (i=0;i<=vf.nfields.value;i++) {
-        if (eval('vf.f'+i+'.selectedIndex')==9) {
+        if (eval('vf.f'+i+'.selectedIndex')==2) {
             eval('vf.f'+i+'.selectedIndex=0;')
         }
     }
@@ -743,7 +784,7 @@ sub upload_manager_javascript_reverse_as
             $auth_update = <<"END";
    // Currently the initial password field is only supported for internal auth
    // (see bug 6368).
-   if (tf==8 && nw!=0) {
+   if (tf==1 && nw!=0) {
        eval('vf.f'+tf+'.selectedIndex=0;')
        alert('$warning');
    }
@@ -751,7 +792,7 @@ END
         } elsif ($numbuttons > 1) {
             $auth_update = <<"END";
    // initial password specified, pick internal authentication
-   if (tf==8 && nw!=0) {
+   if (tf==1 && nw!=0) {
       changed_radio('int',document.studentform);
       set_auth_radio_buttons('int',document.studentform);
 $argreset
@@ -776,10 +817,10 @@ function verify(vf,sec_caller) {
     for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');
         if (i==0 && tw!=0) { founduname=1; }
-        if (((i>=1) && (i<=5)) && tw!=0 ) { foundname=1; }
-        if (i==6 && tw!=0) { foundid=1; }
-        if (i==7 && tw!=0) { foundsec=1; }
-        if (i==8 && tw!=0) { foundpwd=1; }
+        if (i==1 && tw!=0) { foundpwd=1; }
+        if (((i>=2) && (i<=6)) && tw!=0 ) { foundname=1; }
+        if (i==7 && tw!=0) { foundid=1; }
+        if (i==8 && tw!=0) { foundsec=1; }
         if (i==9 && tw!=0) { foundemail=1; }
         if (i==10 && tw!=0) { foundrole=1; }
         if (i==11 && tw!=0) { founddomain=1; }
@@ -792,31 +833,23 @@ function flip(vf,tf) {
    var nw=eval('vf.f'+tf+'.selectedIndex');
    var i;
    // picked the all one name field, reset the other name ones to blank
-   if (tf==1 && nw!=0) {
-      for (i=2;i<=5;i++) {
+   if (tf==2 && nw!=0) {
+      for (i=3;i<=6;i++) {
          eval('vf.f'+i+'.selectedIndex=0;')
       }
    }
    //picked one of the piecewise name fields, reset the all in
    //one field to blank
-   if ((tf>=2) && (tf<=5) && (nw!=0)) {
-      eval('vf.f1.selectedIndex=0;')
-   }
-   // intial password specified, pick internal authentication
-   if (tf==8 && nw!=0) {
-       changed_radio('int',document.studentform);
-       set_auth_radio_buttons('int',document.studentform);
-       vf.krbarg.value='';
-       vf.intarg.value='';
-       vf.locarg.value='';
+   if ((tf>=3) && (tf<=6) && (nw!=0)) {
+      eval('vf.f2.selectedIndex=0;')
    }
    $auth_update
 }
 
 function clearpwd(vf) {
     var i;
-    if (eval('vf.f8.selectedIndex')!=0) {
-        eval('vf.f8.selectedIndex=0;')
+    if (eval('vf.f1.selectedIndex')!=0) {
+        eval('vf.f1.selectedIndex=0;')
     }
 }
 ENDPICK
@@ -839,6 +872,9 @@ sub print_upload_manager_footer {
         $env{'form.ipwd_choice'} ne '') {
         $param{'curr_authtype'} = 'int';
     }
+    if ($env{'form.context'} eq 'requestcrs') {
+        $param{'context'} = $env{'form.context'};
+    }
     my $krbform = &Apache::loncommon::authform_kerberos(%param);
     my $intform = &Apache::loncommon::authform_internal(%param);
     my $locform = &Apache::loncommon::authform_local(%param);
@@ -851,8 +887,11 @@ sub print_upload_manager_footer {
 
     $Str .= '<h3>'.&mt('Options').'</h3>'
            .&Apache::lonhtmlcommon::start_pick_box();
-
-    $Str .= &Apache::lonhtmlcommon::row_title(&mt('Login Type'));
+    if ($env{'form.context'} eq 'requestcrs') {
+        $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default password'));
+    } else {
+        $Str .= &Apache::lonhtmlcommon::row_title(&mt('Login Type'));
+    }
     if ($context eq 'domain') {
         $Str .= '<p>'
                .&mt('Change authentication for existing users in domain "[_1]" to these settings?'
@@ -866,12 +905,17 @@ sub print_upload_manager_footer {
                .'</span></p>'; 
     } else {
         $Str .= '<p class="LC_info">'."\n".
-            &mt('This will not take effect if the user already exists.').
-            &Apache::loncommon::help_open_topic('Auth_Options').
-            "</p>\n";
+            &mt('This will not take effect if the user already exists.');
+            my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($defdom);
+            if ($authnum > 1) {
+                $Str .= &Apache::loncommon::help_open_topic('Auth_Options');
+            }
+            $Str .= "</p>\n";
     }
     $Str .= &set_login($defdom,$krbform,$intform,$locform);
-
+    if ($env{'form.context'} eq 'requestcrs') {
+        $Str .= '<input type="hidden" name="defaultdomain" value="gcitest" />';
+    }
     my ($home_server_pick,$numlib) =
         &Apache::loncommon::home_server_form_item($defdom,'lcserver',
                                                   'default','hide');
@@ -887,14 +931,14 @@ sub print_upload_manager_footer {
                 &Apache::lonhtmlcommon::row_closure();
     }
 
-    $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain'))
-           .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1)
-           .&Apache::lonhtmlcommon::row_closure();
-
-    $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates'))
-           ."<p>\n".$date_table."</p>\n"
-           .&Apache::lonhtmlcommon::row_closure();
-
+    unless ($env{'form.context'} eq 'requestcrs') {
+        $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain'))
+               .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1)
+               .&Apache::lonhtmlcommon::row_closure()
+               .&Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates'))
+               ."<p>\n".$date_table."</p>\n"
+               .&Apache::lonhtmlcommon::row_closure();
+    }
     if ($context eq 'domain') {
         $Str .= &Apache::lonhtmlcommon::row_title(
                     &mt('Settings for assigning roles'))
@@ -914,9 +958,22 @@ sub print_upload_manager_footer {
                     &mt('Default role'))
                .&mt('Choose the role to assign to users without a value specified in the uploaded file.')
     } elsif ($context eq 'course') {
-        $Str .= &Apache::lonhtmlcommon::row_title(
+        if ($env{'form.context'} eq 'requestcrs') {
+            $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default section')).
+                    &mt('Students can be assigned to different sections.').'<br />'.
+                    &mt('Will you be using sections?').'&nbsp;'.
+                    '<input type="radio" name="usesection" value="1" '.
+                    'onclick="javascript:toggleSectionsDefault()" />'.
+                    '&nbsp;'.&mt('Yes').'</label>'.
+                    '&nbsp;&nbsp;&nbsp;<label>'.
+                    '<input type="radio" name="usesection" value="0" checked="checked" '.
+                    'onclick="javascript:toggleSectionsDefault()" />'.
+                    '&nbsp;'.&mt('No').'</label>';
+        } else {
+            $Str .= &Apache::lonhtmlcommon::row_title(
                     &mt('Default role and section'))
-               .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.');
+                   .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.');
+        }    
     } else {
         $Str .= &Apache::lonhtmlcommon::row_title(
                     &mt('Default role and/or section(s)'))
@@ -940,11 +997,22 @@ sub print_upload_manager_footer {
         }
     } else {
         my ($cnum,$cdom) = &get_course_identity();
-        my $rowtitle = &mt('section');
+        my ($rowtitle,$closure);
+        if ($env{'form.context'} eq 'requestcrs') {
+            $closure = 1;
+            $rowtitle = &mt('default section name (letters/numbers only)');
+        } else {
+            $rowtitle = &mt('section');
+        }
         my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,
-                                     $permission,$context,'upload',$crstype);
-        $Str .= $secbox
-               .&Apache::lonhtmlcommon::row_closure();
+                                    $permission,$context,'upload',$crstype,
+                                    $env{'form.context'}).
+                     &Apache::lonhtmlcommon::row_closure($closure);
+        if ($env{'form.context'} eq 'requestcrs') {
+            $Str .= '<div id ="defaultsec" style="display: none" />'.$secbox.'</div>';
+        } else {
+            $Str .= $secbox; 
+        }
         my %lt;
         if ($crstype eq 'Community') {
             %lt = &Apache::lonlocal::texthash (
@@ -957,15 +1025,19 @@ sub print_upload_manager_footer {
                     stus => 'Students selected from this list can be dropped.'
             );
         }
-        $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update'))
-               .'<label><input type="checkbox" name="fullup" value="yes" />'
-               .' '.$lt{'disp'}
-               .'</label><br />'
-               .$lt{'stus'}
-               .&Apache::lonhtmlcommon::row_closure();
+        unless ($env{'form.context'} eq 'requestcrs') {
+            $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update'))
+                   .'<label><input type="checkbox" name="fullup" value="yes" />'
+                   .' '.$lt{'disp'}
+                   .'</label><br />'
+                   .$lt{'stus'}
+                   .&Apache::lonhtmlcommon::row_closure();
+        }
     }
     if ($context eq 'course' || $context eq 'domain') {
-        $Str .= &forceid_change($context);
+        unless ($env{'form.context'} eq 'requestcrs') {
+            $Str .= &forceid_change($context);
+        }
     }
 
     $Str .= &Apache::lonhtmlcommon::end_pick_box();
@@ -1009,7 +1081,7 @@ sub forceid_change {
 ###############################################################
 ###############################################################
 sub print_upload_manager_form {
-    my ($r,$context,$permission,$crstype) = @_;
+    my ($r,$context,$permission,$crstype,$formname) = @_;
     my $firstLine;
     my $datatoken;
     if (!$env{'form.datatoken'}) {
@@ -1057,12 +1129,13 @@ sub print_upload_manager_form {
     #
     my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($defdom);
     &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context,
-                                 $permission,$crstype,\%can_assign);
+                                 $permission,$crstype,$formname,\%can_assign);
     my $i;
     my $keyfields;
     if ($total>=0) {
         my @field=
             (['username',&mt('Username'),     $env{'form.username_choice'}],
+             ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],
              ['names',&mt('Last Name, First Names'),$env{'form.names_choice'}],
              ['fname',&mt('First Name'),      $env{'form.fname_choice'}],
              ['mname',&mt('Middle Names/Initials'),$env{'form.mname_choice'}],
@@ -1070,7 +1143,6 @@ sub print_upload_manager_form {
              ['gen',  &mt('Generation'),      $env{'form.gen_choice'}],
              ['id',   &mt('Student/Employee ID'),$env{'form.id_choice'}],
              ['sec',  &mt('Section'),          $env{'form.sec_choice'}],
-             ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],
              ['email',&mt('E-mail Address'),   $env{'form.email_choice'}],
              ['role',&mt('Role'),             $env{'form.role_choice'}],
              ['domain',&mt('Domain'),         $env{'form.domain_choice'}],
@@ -1151,15 +1223,15 @@ sub setup_date_selectors {
 
 
 sub get_dates_from_form {
-    my ($startname,$endname) = @_;
+    my ($startname,$endname,$timezone) = @_;
     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);
+    my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname,$timezone);
+    my $enddate   = &Apache::lonhtmlcommon::get_date_from_form($endname,$timezone);
     if ($env{'form.no_end_date'}) {
         $enddate = 0;
     }
@@ -1263,8 +1335,10 @@ sub default_role_selector {
                     'exs'  => "Existing sections",
                     'new'  => "New section",
                   );
-    $options = '<select name="defaultrole">'."\n".
-               ' <option value="">'.&mt('Please select').'</option>'."\n"; 
+    $options = '<select name="defaultrole">'."\n";
+    unless (($context eq 'course') && (&Apache::loncommon::needs_gci_custom())) {
+        $options .= ' <option value="">'.&mt('Please select').'</option>'."\n";
+    }
     if ($context eq 'course') {
         $options .= &default_course_roles($context,$checkpriv,$crstype,%customroles);
     } elsif ($context eq 'author') {
@@ -1525,18 +1599,14 @@ sub print_userlist {
         return;
     }
     if (!(($context eq 'domain') && 
-        (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) {
-        $r->print(
-            "\n</p>\n"
-           .'<p>'
-           .&list_submit_button(&mt('Update Display'))
-           ."</p>\n"
-        );
+          (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) {
+        $r->print('&nbsp;'.&list_submit_button(&mt('Update Display')).
+                  "\n</p>\n");
     }
     my ($indexhash,$keylist) = &make_keylist_array();
     my (%userlist,%userinfo,$clearcoursepick);
     if (($context eq 'domain') && 
-        ($env{'form.roletype'} eq 'course') ||
+        ($env{'form.roletype'} eq 'course') || 
         ($env{'form.roletype'} eq 'community')) {
         my ($crstype,$numcodes,$title,$warning);
         if ($env{'form.roletype'} eq 'course') {
@@ -1810,7 +1880,7 @@ sub section_group_filter {
         }
         if (@options > 0) {
             my $currsel;
-            $markup = '<select name="'.$name{$item}.'">'."\n";
+            $markup = '<select name="'.$name{$item}.'" />'."\n";
             foreach my $option ('all','none',@options) { 
                 $currsel = '';
                 if ($env{'form.'.$name{$item}} eq $option) {
@@ -1825,9 +1895,7 @@ sub section_group_filter {
                 $markup .= '</option>'."\n";
             }
             $markup .= '</select>'."\n";
-            $output .= ('&nbsp;'x3).'<span class="LC_nobreak">'
-                      .'<label>'.$title{$item}.': '.$markup.'</label>'
-                      .'</span> ';
+            $output .= ('&nbsp;'x3).'<label>'.$title{$item}.': '.$markup.'</label>';
         }
     }
     return $output;
@@ -2177,6 +2245,7 @@ sub process_date_info {
 
 sub show_users_list {
     my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_;
+    my $custommenu; 
     if ($formname eq '') {
         $formname = 'studentform';
     }
@@ -2201,11 +2270,17 @@ sub show_users_list {
         $sortby = 'username';
     }
     my $setting = $env{'form.roletype'};
-    my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$crstype);
+    my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$crstype,
+        $clickersupport,$displaygroups);
     if ($context eq 'course') {
         $cid = $env{'request.course.id'};
         $crstype = &Apache::loncommon::course_type();
         ($cnum,$cdom) = &get_course_identity($cid);
+        $custommenu = &Apache::loncommon::needs_gci_custom();
+        unless ($custommenu) {
+            $clickersupport = 1;
+            $displaygroups = 1;
+        }
         ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                      $userlist,$keylist,$cdom,$cnum);
         if ($mode eq 'autoenroll') {
@@ -2326,6 +2401,8 @@ END
                        'role'       => "role",
                        'type'       => "enroll type/action",
                        'email'      => "e-mail address",
+                       'lastlogin'  => "last login",
+                       'submissions' => "test status",
                        'photo'      => "photo",
                        'extent'     => "extent",
                        'pr'         => "Proceed",
@@ -2355,7 +2432,7 @@ END
             push(@cols,'section');
         }
         if (!($context eq 'domain' && ($env{'form.roletype'} eq 'course')
-                              && ($env{'form.roletype'} eq 'community'))) {
+                              && ($env{'form.roletype'} eq 'community'))) { 
             push(@cols,('start','end'));
         }
         if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
@@ -2366,15 +2443,25 @@ END
                                     $env{'form.roletype'} eq 'community')) {
             push (@cols,'extent');
         }
-        if (($statusmode eq 'Any') &&
+        if (($statusmode eq 'Any') && 
             (!($context eq 'domain' && (($env{'form.roletype'} eq 'course')
              || ($env{'form.roletype'} eq 'community'))))) {
             push(@cols,'status');
         }
         if ($context eq 'course') {
-            push(@cols,'groups');
+            if ($displaygroups) {
+                push(@cols,'groups');
+            }
         }
         push(@cols,'email');
+        if ($context eq 'course') {
+            if ($custommenu) {
+                push(@cols,'lastlogin');
+                if (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'st')) {
+                    push(@cols,'submissions');
+                }
+            }
+        }
     }
 
     my $rolefilter = $env{'form.showrole'};
@@ -2387,7 +2474,6 @@ END
     if ($mode ne 'autoenroll') {
         $results_description = &results_header_row($rolefilter,$statusmode,
                                                    $context,$permission,$mode,$crstype);
-
         $r->print('<b>'.$results_description.'</b><br /><br />');
     }
     my ($output,$actionselect,%canchange,%canchangesec);
@@ -2409,7 +2495,7 @@ END
 END
             if ($actionselect) {
                 $output .= <<"END";
-<div class="LC_left_float"><fieldset><legend><b>$lt{'ac'}</b></legend>
+<div class="LC_left_float"><fieldset><legend>$lt{'ac'}</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>
@@ -2454,7 +2540,7 @@ END
                     }
                 }
             }
-            $output .= '<div class="LC_left_float"><fieldset><legend><b>'.$lt{'link'}.'</b></legend>'.
+            $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'.
                        '<table><tr>';
             my @linkdests = ('aboutme');
             if ($permission->{'cusr'}) {
@@ -2465,6 +2551,7 @@ END
                                          $env{'request.course.sec'})) {
                 push(@linkdests,'track');
             }
+
             $output .= '<td>';
             my $usernamelink = $env{'form.usernamelink'};
             if ($usernamelink eq '') {
@@ -2481,7 +2568,7 @@ END
             if ($env{'form.userwin'}) {
                 $checkwin = ' checked="checked"';
             }
-            $output .= '</td><td valign="top" style="border-left: 1px solid;><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
+            $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".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".
                   &Apache::loncommon::start_data_table().
@@ -2497,27 +2584,32 @@ END
             }
         }
         foreach my $item (@cols) {
-            $output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n";
+            if (grep(/^\Q$item\E$/,@sortable)) {
+                $output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n";
+            } else {
+                $output .= "<th>$lt{$item}</th>\n";
+            }
         }
         my %role_types = &role_type_names();
         if ($context eq 'course' && $mode ne 'autoenroll') {
             if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
                 # Clicker display on or off?
-                my %clicker_options = (
-                                        'on' => 'Show',
-                                        'off' => 'Hide',
-                                      );
-                my $clickerchg = 'on';
-                if ($displayclickers eq 'on') {
-                    $clickerchg = 'off';
-                }
-                $output .= '    <th>'."\n".'     '
-                        .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id'
+                if ($clickersupport) {
+                    my %clicker_options = (
+                                            'on' => 'Show',
+                                            'off' => 'Hide',
+                                          );
+                    my $clickerchg = 'on';
+                    if ($displayclickers eq 'on') {
+                        $clickerchg = 'off';
+                    }
+                    $output .= '    <th>'."\n".'     '
+                       .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id'
                             ,'<a href="javascript:document.'.$formname.'.displayclickers.value='
                              ."'".$clickerchg."'".';document.'.$formname.'.submit();">'
                             ,'</a>')
                         ."\n".'    </th>'."\n";
-
+                }
                 # Photo display on or off?
                 if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
                     my %photo_options = &Apache::lonlocal::texthash(
@@ -2556,14 +2648,18 @@ END
             $CSVfile = undef;
         }
         #
-        push @cols,'clicker';
+        if ($clickersupport) {
+            push @cols,'clicker';
+        }
         # Write headers and data to file
         print $CSVfile '"'.$results_description.'"'."\n"; 
         print $CSVfile '"'.join('","',map {
             &Apache::loncommon::csv_translate($lt{$_})
             } (@cols))."\"\n";
     } elsif ($mode eq 'excel') {
-        push @cols,'clicker';
+        if ($clickersupport) {
+            push @cols,'clicker';
+        }
         # Create the excel spreadsheet
         ($excel_workbook,$excel_filename,$format) =
             &Apache::loncommon::create_workbook($r);
@@ -2599,6 +2695,40 @@ END
                                                 Future  => 'Future',
                                                 Expired => 'Expired',
                                                );
+    # If this is for a single course get last course "log-in" and submissions.
+    my (%crslogins,%stusubmissions,%elapsed,$numparts,%nummultipart,$multipart);
+    my $now = time;
+    if ($context eq 'course') {
+        if ($custommenu) {
+            %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum);
+            %stusubmissions=&Apache::lonnet::dump('nohist_submissiontracker',$cdom,$cnum);
+            %elapsed = &Apache::lonlocal::texthash(    
+                                         -1 => 'more than a month ago',
+                                    2592000 => 'within last 30 days',
+                                     604800 => 'within last 7 days',
+                                      86400 => 'within last 24 hours',
+                                   );
+            my $navmap = Apache::lonnavmaps::navmap->new();
+            if (defined($navmap)) {
+                my @allres=$navmap->retrieveResources('/uploaded/'.$cdom.'/'.$cnum.'/default_1261144274.sequence',sub { $_[0]->is_problem() },0);
+                foreach my $resource (@allres) {
+                    my @parts = $resource->parts();
+                    my $count = scalar(@parts);
+                    if ($count > 1) {
+                        $nummultipart{$count} ++;
+                    }
+                    $numparts += $count;
+                }
+                if (keys(%nummultipart) > 0) {
+                   $multipart = '<br />'.'contains';
+                   foreach my $key (sort {$a <=> $b} keys(%nummultipart)) {
+                       $multipart .= " nummultipart{$key} multipart questions (with $key parts)";
+                   }
+                }
+            }
+        }
+    }
+
     # Get groups, role, permanent e-mail so we can sort on them if
     # necessary.
     foreach my $user (keys(%{$userlist})) {
@@ -2734,7 +2864,7 @@ END
         if ($clickers!~/\w/) { $clickers='-'; }
         $in{'clicker'} = $clickers; 
 	my $role = $in{'role'};
-        $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype); 
+        $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype);
         if (! defined($in{'start'}) || $in{'start'} == 0) {
             $in{'start'} = &mt('none');
         } else {
@@ -2745,6 +2875,34 @@ END
         } else {
             $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
         }
+        if ($context eq 'course') {
+            if ($custommenu) {
+                my $lastlogin = $crslogins{$in{'username'}.':'.$in{'domain'}.':'.$in{'section'}.':'.$role};
+                if ($lastlogin ne '') {
+                    my $sincelogin = $now - $lastlogin;
+                    if ($sincelogin < 86400) {
+                        $in{'lastlogin'} = $elapsed{'86400'};
+                    } elsif ($sincelogin < 604800) {
+                        $in{'lastlogin'} = $elapsed{'604800'};
+                    } elsif ($sincelogin < 2592000 ) {
+                        $in{'lastlogin'} = $elapsed{'2592000'};
+                    } else {
+                        $in{'lastlogin'} = $elapsed{'-1'};
+                    }
+                }
+            }
+            if ($role eq 'st') {
+                my $numsub = $stusubmissions{$in{'username'}.':'.$in{'domain'}."\0attempts"} + 
+                             $stusubmissions{$in{'username'}.':'.$in{'domain'}."\0surveysubs"};
+                if (!$numsub) {
+                    $in{'submissions'} = 'not attempted';
+                } elsif ($numsub < $numparts) {
+                    $in{'submissions'} = 'incomplete ('.$numsub.'/'.$numparts.')';
+                } else {
+                    $in{'submissions'} = 'completed';
+                }
+            }
+        }
         if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
             $r->print(&Apache::loncommon::start_data_table_row());
             my $checkval;
@@ -2818,19 +2976,27 @@ END
                         $showitem = $ltstatus{$in{$item}};
                     }
                     $r->print('<td>'.$showitem.'</td>'."\n");
+                } elsif ($item eq 'submissions') {
+                    if ($in{$item} =~ /^incomplete/) { 
+                        $r->print('<td>'.$in{$item}.$multipart.'</td>');
+                    } else {
+                        $r->print('<td>'.$in{$item}.'</td>'."\n");
+                    }
                 } else {
                     $r->print('<td>'.$in{$item}.'</td>'."\n");
                 }
             }
             if (($context eq 'course') && ($mode ne 'autoenroll')) {
                 if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
-                    if ($displayclickers eq 'on') {
-                        my $clickers =
+                    if ($clickersupport) {
+                        if ($displayclickers eq 'on') {
+                            my $clickers =
                    (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
-                        if ($clickers!~/\w/) { $clickers='-'; }
-                        $r->print('<td>'.$clickers.'</td>');
-                    } else {
-                        $r->print('    <td>&nbsp;</td>  ');
+                            if ($clickers!~/\w/) { $clickers='-'; }
+                            $r->print('<td>'.$clickers.'</td>');
+                        } else {
+                            $r->print('    <td>&nbsp;</td>  ');
+                        }
                     }
                     if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
                         if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') {
@@ -3021,7 +3187,7 @@ sub print_username_link {
         $output = $in->{'username'};
     } else {
         $output = '<a href="javascript:username_display_launch('.
-                  "'$in->{'username'}','$in->{'domain'}'".')">'.
+                  "'$in->{'username'}','$in->{'domain'}'".')" />'.
                   $in->{'username'}.'</a>';
     }
     return $output;
@@ -3251,8 +3417,8 @@ ENDJS
     my %lt = &Apache::lonlocal::texthash (
                  chac => 'Access dates to apply for selected users',
                  chse => 'Changes in section affiliation to apply to selected users',
-                 fors => 'For student roles, changing the section will result in a section switch as students may only be in one section of a course at a time.',
-                 forn => 'For a course role that is not "student", users may have roles in more than one section at a time.',
+                 fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.',
+                 forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.',
                  reta => "Retain each user's current section affiliations?", 
                  dnap => '(Does not apply to student roles).',
             );
@@ -3271,13 +3437,14 @@ ENDJS
                                           $permission,$crstype);
     }
     $output .= '<h3>'.$headertext.'</h3>'.
-               '<form name="'.$formname.'" method="post" action="">'."\n".
+               '<form name="'.$formname.'" method="post">'."\n".
                 $date_items;
     if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {
         my ($cnum,$cdom) = &get_course_identity();
+        my $crstype = &Apache::loncommon::course_type();
         if ($crstype eq 'Community') {
-            $lt{'fors'} = &mt('For member roles, changing the section will result in a section switch, as members may only be in one section of a community at a time.');
-            $lt{'forn'} = &mt('For a community role that is not "member", users may have roles in more than one section at a time.');
+            $lt{'fors'} = &mt('For member roles changing the section, will result in a section switch as members may only be in one section of a community at a time.');
+            $lt{'forn'} = &mt('For a role in a community that is not a member role, a user may have roles in more than one section of a community at a time.');
             $lt{'dnap'} = &mt('(Does not apply to member roles).'); 
         }
         my $info;
@@ -3315,23 +3482,27 @@ ENDJS
 }
 
 sub section_picker {
-    my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_;
+    my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype,$caller) = @_;
     my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
     my $sections_select .= &course_sections(\%sections_count,$role);
-    my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n";
-    if ($mode eq 'upload') {
+    my $secbox = '<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n";
+    if ($mode eq 'upload' && $caller ne 'requestcrs') {
         my ($options,$cb_script,$coursepick) =
             &default_role_selector($context,1,$crstype);
         $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').
                    $options. &Apache::lonhtmlcommon::row_closure(1)."\n";
     }
     $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n";
-    if ($env{'request.course.sec'} eq '') {
+    if ($caller eq 'requestcrs') {
+       $secbox .=  '<input type="hidden" name="defaultrole" value="st" />'."\n".
+                   '<input type="text" name="newsec" size="15" />'."\n".
+                   '<input type="hidden" name="sections" value="" />'."\n";
+    } elsif ($env{'request.course.sec'} eq '') {
         $secbox .= '<table class="LC_createuser"><tr class="LC_section_row">'."\n".
                    '<td align="center">'.&mt('Existing sections')."\n".
                    '<br />'.$sections_select.'</td><td align="center">'.
                    &mt('New section').'<br />'."\n".
-                   '<input type="text" name="newsec" size="15" value="" />'."\n".
+                   '<input type="text" name="newsec" size="15" />'."\n".
                    '<input type="hidden" name="sections" value="" />'."\n".
                    '</td></tr></table>'."\n";
     } else {
@@ -3340,7 +3511,7 @@ sub section_picker {
                    $env{'request.course.sec'};
     }
     $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n".
-               &Apache::lonhtmlcommon::end_pick_box().'</div>';
+               &Apache::lonhtmlcommon::end_pick_box().'</p>';
     return $secbox;
 }
 
@@ -3481,12 +3652,11 @@ sub results_header_row {
                 if ($rolefilter eq 'Any') {
                     $description .= &mt('All users with co-author roles in domain',$showfilter);
                 } else {
-                    $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter);
+                    $description .= &mt('All co-authors in domain  with [_1] roles',$rolefilter);
                 }
             }
         } elsif (($env{'form.roletype'} eq 'course') || 
                  ($env{'form.roletype'} eq 'community')) {
-
             my $coursefilter = $env{'form.coursepick'};
             if ($env{'form.roletype'} eq 'course') {
                 if ($coursefilter eq 'category') {
@@ -3546,6 +3716,10 @@ sub show_drop_list {
     my ($r,$classlist,$nosort,$permission,$crstype) = @_;
     my $cid = $env{'request.course.id'};
     my ($cnum,$cdom) = &get_course_identity($cid);
+    my $displaygroups;
+    unless (&Apache::loncommon::needs_gci_custom()) {
+        $displaygroups = 1;
+    }
     if (! exists($env{'form.sortby'})) {
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                                 ['sortby']);
@@ -3623,8 +3797,10 @@ END
     <th>$lt{'sec'}</th>
     <th>$lt{'start'}</th>
     <th>$lt{'end'}</th>
-    <th>$lt{'groups'}</th>
 END
+        if ($displaygroups) {
+            $r->print("    <th>$lt{'groups'}</th>\n");
+        }
         $r->print(&Apache::loncommon::end_data_table_header_row());
     } else  {
         $r->print(&Apache::loncommon::start_data_table().
@@ -3645,10 +3821,13 @@ END
        <a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a>
     </th><th>
        <a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a>
-    </th><th>
-       <a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a>
     </th>
 END
+       if ($displaygroups) {
+           $r->print("<th>
+       <a href=\"/adm/createuser?action=$action&sortby=groups\">$lt{'groups'}</a>
+    </th>\n");
+        }
         $r->print(&Apache::loncommon::end_data_table_header_row());
     }
     #
@@ -3701,8 +3880,10 @@ END
     <td>$section</td>
     <td>$start $startitem</td>
     <td>$end</td>
-    <td>$active_groups</td>
 END
+        if ($displaygroups) {
+            $r->print("    <td>$active_groups</td>\n");
+        }
         $r->print(&Apache::loncommon::end_data_table_row());
     }
     $r->print(&Apache::loncommon::end_data_table().'<br />');
@@ -3733,13 +3914,15 @@ END
 # Print out the initial form to get the file containing a list of users
 #
 sub print_first_users_upload_form {
-    my ($r,$context) = @_;
+    my ($r,$context,$noheader,$caller) = @_;
     my $str;
     $str  = '<input type="hidden" name="phase" value="two" />';
     $str .= '<input type="hidden" name="action" value="upload" />';
     $str .= '<input type="hidden" name="state"  value="got_file" />';
 
-    $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";
+    unless ($noheader) {
+        $str .= '<h3>'.&mt('Upload a file containing information about users').'</h3>'."\n";
+    }
 
     # Excel and CSV Help
     $str .= '<div class="LC_left_float">'
@@ -3753,15 +3936,15 @@ sub print_first_users_upload_form {
            .&Apache::lonhtmlcommon::row_title(&mt('File'))
            .&Apache::loncommon::upfile_select_html()
            .&Apache::lonhtmlcommon::row_closure()
-           .&Apache::lonhtmlcommon::row_title(
-                '<label for="noFirstLine">'
-               .&mt('Ignore First Line')
-               .'</label>')
-           .'<input type="checkbox" name="noFirstLine" id="noFirstLine" />'
+           .&Apache::lonhtmlcommon::row_title(&mt('Ignore First Line, e.g., contains column titles'))
+           .'<label><input type="radio" name="noFirstLine" id="noFirstLine" value="1" />&nbsp;'.&mt('Yes').'</label>'
+           .'&nbsp;&nbsp;&nbsp;'
+           .'<label><input type="radio" name="noFirstLine" id="FirstLineOK" value="0" checked="checked" />&nbsp;'.&mt('No').'</label>'
            .&Apache::lonhtmlcommon::row_closure(1)
            .&Apache::lonhtmlcommon::end_pick_box();
 
     $str .= '<p>'
+           .'<input type="hidden" name="context" value="'.$caller.'" />' 
            .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />'
            .'</p>';
 
@@ -3786,7 +3969,7 @@ sub upfile_drop_add {
             $fields{$env{'form.f'.$i}}=$keyfields[$i];
         }
     }
-    if ($env{'form.fullup'} ne 'yes') {
+    if (($env{'form.fullup'} ne 'yes') && ($env{'form.context'} ne 'requestcrs')) {
         $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".
                   '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />');
     }
@@ -3824,9 +4007,15 @@ sub upfile_drop_add {
             $crstype = &Apache::loncommon::course_type($cid);
         }
     }
-    my ($startdate,$enddate) = &get_dates_from_form();
-    if ($env{'form.makedatesdefault'}) {
-        $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));
+    my ($startdate,$enddate);
+    if ($env{'form.context'} eq 'requestcrs') {
+        $startdate = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_start_date'};
+        $enddate = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_end_date'};
+    } else {
+        ($startdate,$enddate) = &get_dates_from_form();
+        if ($env{'form.makedatesdefault'}) {
+            $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));
+        }
     }
     # Determine domain and desired host (home server)
     my $defdom=$env{'request.role.domain'};
@@ -3885,7 +4074,7 @@ sub upfile_drop_add {
         } elsif ($setting eq 'course') {
             $defaultrole = $env{'form.courserole'};
             $defaultsec = $env{'form.sections'};
-        }
+        }  
     } elsif ($context eq 'author') {
         $defaultrole = $env{'form.defaultrole'};
     } elsif ($context eq 'course') {
@@ -3992,10 +4181,15 @@ sub upfile_drop_add {
                 $r->print($groupwarn.'<br />');
             }
         }
-        my (%curr_rules,%got_rules,%alerts);
+        my (%curr_rules,%got_rules,%alerts,%cancreate);
         my %customroles = &my_custom_roles($crstype);
         my @permitted_roles = 
-            &roles_on_upload($context,$setting,$crstype,%customroles); 
+            &roles_on_upload($context,$setting,$crstype,%customroles);
+        my %longtypes = &Apache::lonlocal::texthash(
+                            official   => 'Institutional',
+                            unofficial => 'Non-institutional',
+                        );
+        map { $cancreate{$_} = &can_create_user($domain,$context,$_); } keys(%longtypes);
         # Get new users list
         foreach my $line (@userdata) {
             my @secs;
@@ -4022,6 +4216,7 @@ sub upfile_drop_add {
                         $gen=$entries{$fields{'gen'}};
                     }
                 }
+
                 if ($entries{$fields{'username'}}
                     ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
                     my $nowhitespace;
@@ -4149,20 +4344,73 @@ sub upfile_drop_add {
                     my (%rulematch,%inst_results,%idinst_results);
                     my $uhome=&Apache::lonnet::homeserver($username,$userdomain);
                     if ($uhome eq 'no_host') {
-                        next if ($userdomain ne $domain);
+                        if ($userdomain ne $domain) {
+                            $r->print('<br />'.
+                                      &mt('[_1]: The domain specified ([_2]) is different to that of the course.',
+                                         '<b>'.$username.'</b>',$userdomain).'<br />'.
+                                      &mt('The user does not already exist, and you may not create a new user in a different domain.')); 
+                            next;
+                        }
                         $checkid = 1;
                         $newuser = 1;
+                        if ($username =~/^[^\@]+\@[^\@]+$/) {
+                            if ($email eq '') {
+                                $email = $username;
+                            }
+                            if (&Apache::loncommon::needs_gci_custom()) {
+                                my $lc_email;
+                                if ($username eq $email) {
+                                    $lc_email = lc($email);
+                                }
+                                my $lc_username = lc($username);
+                                if ($lc_username ne $username) {
+                                    if ($username eq $email) {
+                                        $email = $lc_username;
+                                    }
+                                    $username = $lc_username;
+                                    $uhome=&Apache::lonnet::homeserver($username,$userdomain);
+                                    if ($uhome ne 'no_host') {
+                                        $newuser = 0;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    my $user = $username.':'.$userdomain;
+                    if ($newuser) {
                         my $checkhash;
                         my $checks = { 'username' => 1 };
-                        $checkhash->{$username.':'.$domain} = { 'newuser' => 1, };
+                        $checkhash->{$user} = { 'newuser' => 1, };
                         &Apache::loncommon::user_rule_check($checkhash,$checks,
                             \%alerts,\%rulematch,\%inst_results,\%curr_rules,
                             \%got_rules);
                         if (ref($alerts{'username'}) eq 'HASH') {
                             if (ref($alerts{'username'}{$domain}) eq 'HASH') {
-                                next if ($alerts{'username'}{$domain}{$username});
+                                if ($alerts{'username'}{$domain}{$username}) {
+                                    $r->print('<br />'.
+                                              &mt('[_1]: matches the username format at your institution, but is not known to your directory service.','<b>'.$username.'</b>').'<br />'.
+                                              &mt('Consequently, the user was not created.'));
+                                    next;
+                                }
+                            }
+                        }
+                        my $usertype = 'unofficial';
+                        if (ref($rulematch{$user}) eq 'HASH') {
+                            if ($rulematch{$user}{'username'}) {
+                                $usertype = 'official';
                             }
                         }
+                        if (!$cancreate{$usertype}) {
+                            my $showtype = $longtypes{$usertype};
+                            if ($usertype eq 'unofficial') {
+                                $r->print('<br />'.
+                                          &mt("[_1]: The user does not exist, and the new user's username must be an e-mail address.",'<b>'.$username.'</b>'));
+                            } else {
+                                $r->print('<br />'.
+                                          &mt("[_1]: The user does not exist, and you are not permitted to create users of type: [_2].",'<b>'.$username.'</b>',$showtype));
+                            }
+                            next;
+                        }
                     } else {
                         if ($context eq 'course' || $context eq 'author') {
                             if ($userdomain eq $domain ) {
@@ -4213,7 +4461,12 @@ sub upfile_drop_add {
                                 \%got_rules);
                             if (ref($alerts{'id'}) eq 'HASH') {
                                 if (ref($alerts{'id'}{$userdomain}) eq 'HASH') {
-                                    next if ($alerts{'id'}{$userdomain}{$id});
+                                    if ($alerts{'id'}{$userdomain}{$id}) {
+                                        $r->print(&mt('[_1]: has a student/employee ID matching the format at your institution, but the ID is found by your directory service.',
+                                                  '<b>'.$username.'</b>').'<br />'.
+                                                  &mt('Consequently, the user was not created.'));
+                                        next;
+                                    }
                                 }
                             }
                         }
@@ -4245,7 +4498,7 @@ sub upfile_drop_add {
                                         $role = 'cr_'.$env{'user.domain'}.'_'.
                                                 $env{'user.name'}.'_'.$role;
                                     }
-                                    if (($role ne 'cc') && ($role ne 'co')) {
+                                    if (($role ne 'cc') && ($role ne 'co')) { 
                                         if (@secs > 1) {
                                             $multiple = 1;
                                             foreach my $sec (@secs) {
@@ -4308,14 +4561,24 @@ sub upfile_drop_add {
             }
         } # end of foreach (@userdata)
         # Flush the course logs so reverse user roles immediately updated
-        $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
+        &Apache::lonnet::flushcourselogs();
         $r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}).
                   "</p>\n");
         if ($counts{'role'} > 0) {
-            $r->print("<p>\n".
-                      &mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.')."</p>\n");
+            if (&Apache::loncommon::needs_gci_custom()) {
+                $r->print("<p>\n".
+                          &mt('[quant,_1,student] enrolled in Concept Test.',$counts{'role'}).
+                         "</p>\n");
+            } else {
+                $r->print("<p>\n".
+                          &mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.')."</p>\n");
+            }
         } else {
-            $r->print('<p>'.&mt('No roles added').'</p>');
+            if (&Apache::loncommon::needs_gci_custom()) {
+                $r->print('<p>'.&mt('No students enrolled').'</p>');
+            } else {
+                $r->print('<p>'.&mt('No roles added').'</p>');
+            }
         }
         if ($counts{'auth'} > 0) {
             $r->print("<p>\n".
@@ -4472,9 +4735,10 @@ sub print_drop_menu {
 # ================================================================== Phase four
 
 sub update_user_list {
-    my ($r,$context,$setting,$choice,$crstype) = @_;
+    my ($r,$context,$setting,$choice) = @_;
     my $now = time;
     my $count=0;
+    my $crstype;
     if ($context eq 'course') {
         $crstype = &Apache::loncommon::course_type();
     }
@@ -4489,7 +4753,7 @@ sub update_user_list {
                                    'reenable' => 'Re-enabled',
                                    'activate' => 'Activated',
                                    'chgdates' => 'Changed Access Dates for',
-                                   'chgsec'   => 'Changed section(s) for',
+                                   'chgsec'   => 'Changed section for',
                                    'drop'     => 'Dropped',
                                  },
                         error => {'revoke'    => 'revoking',
@@ -4506,9 +4770,8 @@ sub update_user_list {
         ($startdate,$enddate) = &get_dates_from_form();
     }
     foreach my $item (@changelist) {
-        my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,
-            @sections,$scopestem,$singlesec,$showsecs,$warn_singlesec,
-            $nothingtodo,$keepnosection);
+        my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,@sections,
+            $scopestem);
         if ($choice eq 'drop') {
             ($uname,$udom,$sec) = split(/:/,$item,-1);
             $role = 'st';
@@ -4607,23 +4870,14 @@ sub update_user_list {
             } elsif ($choice eq 'chgsec') {
                 my (@newsecs,$revresult,$nochg,@retained);
                 if (($role ne 'cc') && ($role ne 'co')) {
-                    my @secs = sort(split(/,/,$env{'form.newsecs'}));
-                    if (@secs) {
-                        my %curr_groups = &Apache::longroup::coursegroups();
-                        foreach my $sec (@secs) {
-                            next if (($sec =~ /\W/) || ($sec eq 'none') ||
-                            (exists($curr_groups{$sec})));
-                            push(@newsecs,$sec);
-                        }
-                    }
+                    @newsecs = split(/,/,$env{'form.newsecs'});
                 }
                 # remove existing section if not to be retained.   
-                if (!$env{'form.retainsec'} || ($role eq 'st')) {
+                if (!$env{'form.retainsec'}) {
                     if ($sec eq '') {
                         if (@newsecs == 0) {
-                            $result = 'ok';
+                            $result = &mt('No change in section assignment (none)');
                             $nochg = 1;
-                            $nothingtodo = 1;
                         } else {
                             $revresult =
                                 &Apache::lonnet::revokerole($udom,$uname,
@@ -4650,23 +4904,13 @@ sub update_user_list {
                 } else {
                     if ($sec eq '') {
                         $nochg = 1;
-                        $keepnosection = 1;
                     } else { 
                         push(@retained,$sec);
                     }
                 }
                 # add new sections
-                my (@diffs,@shownew);
-                if (@retained) {
-                    @diffs = &Apache::loncommon::compare_arrays(\@retained,\@newsecs);
-                } else {
-                    @diffs = @newsecs;
-                }
                 if (@newsecs == 0) {
-                    if ($nochg) {
-                        $result = 'ok';
-                        $nothingtodo = 1;
-                    } else {
+                    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,'',$context);
@@ -4675,41 +4919,15 @@ sub update_user_list {
                             $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);
                         }
                     }
-                    $showsecs = &mt('No section');
-                } elsif (@diffs == 0) {
-                    $result = 'ok';
-                    $nothingtodo = 1;
                 } 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,'',$context);
-                                if (@newsecs > 1) {
-                                    my $showsingle;
-                                    if ($newsec eq '') {
-                                        $showsingle = &mt('No section');
-                                    } else {
-                                        $showsingle = $newsec;
-                                    }
-                                    if ($crstype eq 'Community') {
-                                        $warn_singlesec = &mt('Although more than one section was indicated, a role was only added for the first section - [_1], as each community member may only be in one section at a time.','<i>'.$showsingle.'</i>');
-                                    } else {
-                                        $warn_singlesec = &mt('Although more than one section was indicated, a role was only added for the first section - [_1], as each student may only be in one section of a course at a time.','<i>'.$showsingle.'</i>');
-                                    }
-                                    $showsecs = $showsingle;
-                                    last;
-                                } else {
-                                    if ($newsec eq '') {
-                                        $showsecs = &mt('No section');
-                                    } else {
-                                        $showsecs = $newsec;
-                                    }
-                                }
                             } else {
                                 my $newscope = $scopestem;
                                 if ($newsec ne '') {
                                    $newscope .= '/'.$newsec;
-                                   push(@shownew,$newsec);
                                 }
                                 $result = &Apache::lonnet::assignrole($udom,$uname,
                                                         $newscope,$role,$end,$start);
@@ -4717,15 +4935,6 @@ sub update_user_list {
                         }
                     }
                 }
-                unless ($role eq 'st') {
-                    unless ($showsecs) {
-                        my @tolist = sort(@shownew,@retained);
-                        if ($keepnosection) {
-                            push(@tolist,&mt('No section'));
-                        }
-                        $showsecs = join(', ',@tolist);
-                    }
-                }
             }
         }
         my $extent = $scope;
@@ -4736,48 +4945,13 @@ sub update_user_list {
             }
         }
         if ($result eq 'ok' || $result eq 'ok:') {
-            my $dates;
-            if (($choice eq 'chgsec') || ($choice eq 'chgdates')) {
-                $dates = &dates_feedback($start,$end,$now);
-            }
-            if ($choice eq 'chgsec') {
-                if ($nothingtodo) {
-                    $r->print(&mt("Section assignment for role of '[_1]' in [_2] for '[_3]' unchanged.",$plrole,$extent,'<i>'.
-                          &Apache::loncommon::plainname($uname,$udom).
-                          '</i>').' ');
-                    if ($sec eq '') {
-                        $r->print(&mt('[_1]No section[_2] - [_3]','<b>','</b>',$dates));
-                    } else {
-                        $r->print(&mt('Section(s): [_1] - [_2]',
-                                      '<b>'.$showsecs.'</b>',$dates));
-                    }
-                    $r->print('<br />');
-                } else {
-                    $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]' to [_4] - [_5]",$plrole,$extent,
-                        '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',
-                        '<b>'.$showsecs.'</b>',$dates).'<br />');
-                   $count ++;
-               }
-               if ($warn_singlesec) {
-                   $r->print('<div class="LC_warning">'.$warn_singlesec.'</div>');
-               }
-            } elsif ($choice eq 'chgdates') {
-                $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]' - [_4]",$plrole,$extent,
-                      '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',
-                      $dates).'<br />');
-               $count ++;
-            } else {
-                $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]'.",$plrole,$extent,
-                      '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>').
-                          '<br />');
-                $count ++;
-            }
+            $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for [_3]",
+                          $plrole,$extent,$uname.':'.$udom).'<br />');
+            $count++;
         } else {
             $r->print(
-                &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for '[_3]': [_4].",
-                    $plrole,$extent,
-                    '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',
-                    $result).'<br />');
+                &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for [_3]: [_4].",
+                    $plrole,$extent,$uname.':'.$udom,$result).'<br />');
         }
     }
     $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n");
@@ -4793,13 +4967,13 @@ sub update_user_list {
             }
         }
     }
-    $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} for [quant,_1,user role,user roles,no user roles].",$count).'</b></p>');
+    $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,no users].",$count).'</b></p>');
     if ($count > 0) {
         if ($choice eq 'revoke' || $choice eq 'drop') {
             $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>');
         }
         # Flush the course logs so reverse user roles immediately updated
-        $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
+        &Apache::lonnet::flushcourselogs();
     }
     if ($env{'form.makedatesdefault'}) {
         if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {
@@ -4813,27 +4987,6 @@ sub update_user_list {
     $r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n");
 }
 
-sub dates_feedback {
-    my ($start,$end,$now) = @_;
-    my $dates;
-    if ($start < $now) {
-        if ($end == 0) {
-            $dates .= &mt('role(s) active now; no end date');
-        } elsif ($end > $now) {
-            $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end));
-        } else {
-            $dates = &mt('role(s) expired: [_1].',&Apache::lonlocal::locallocaltime($end));
-        }
-     } else {
-        if ($end == 0 || $end > $now) {
-            $dates = &mt('future role(s); starts: [_1].',&Apache::lonlocal::locallocaltime($start));
-        } else {
-            $dates = &mt('role(s) expired: [_1].',&Apache::lonlocal::locallocaltime($end));
-        }
-    }
-    return $dates;
-}
-
 sub classlist_drop {
     my ($scope,$uname,$udom,$now) = @_;
     my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
@@ -5014,7 +5167,7 @@ sub setsections_javascript {
                     accr => 'A course coordinator role will be added with access to all sections.',
                     acor => 'A coordinator role will be added with access to all sections',
                     inea => 'In each course, each user may only have one student role at a time.',
-                    inco => 'In each community, each user may only have one member role at a time.',
+                    inec => 'In each community, each user may only have on member role at a time.',
                     youh => 'You had selected ',
                     secs => 'sections.',
                     plmo => 'Please modify your selections so they include no more than one section.',
@@ -5022,21 +5175,16 @@ sub setsections_javascript {
                     plch => 'Please choose a different section name.',
                     mnot => 'may not be used as a section name, as it is the name of a course group.',
                     secn => 'Section names and group names must be distinct. Please choose a different section name.',
-                    nonw => 'Section names may only contain letters or numbers.',
                  );                
     $setsection_js .= <<"ENDSECCODE";
 
 function setSections(formname,crstype) {
     var re1 = /^currsec_/;
-    var re2 =/\\W/;
-    var trimleading = /^\\s+/;
-    var trimtrailing = /\\s+\$/;
     var groups = new Array($groupslist);
     for (var i=0;i<formname.elements.length;i++) {
         var str = formname.elements[i].name;
         var checkcurr = str.match(re1);
         if (checkcurr != null) {
-            var num = i;
             if ($checkincluded) {
                 $rolecode
                 if (role == 'cc' || role == 'co') {
@@ -5048,97 +5196,64 @@ function setSections(formname,crstype) {
                 } else {
                     var sections = '';
                     var numsec = 0;
-                    var fromexisting = new Array();
-                    for (var j=0; j<formname.elements[num].length; j++) {
-                        if (formname.elements[num].options[j].selected == true ) {
-                            var addsec = formname.elements[num].options[j].value;
-                            if ((addsec != "") && (addsec != null)) {
-                                fromexisting.push(addsec);
+                    var sections;
+                    for (var j=0; j<formname.elements[i].length; j++) {
+                        if (formname.elements[i].options[j].selected == true ) {
+                            if (formname.elements[i].options[j].value != "") {
                                 if (numsec == 0) {
-                                    sections = addsec;
-                                } else {
-                                    sections = sections + "," +  addsec;
-                                }
-                                numsec ++;
-                            }
-                        }
-                    }
-                    var newsecs = formname.elements[num+1].value;
-                    var validsecs = new Array();
-                    var validsecstr = '';
-                    var badsecs = new Array();
-                    if (newsecs != null && newsecs != "") {
-                        var numsplit;
-                        if (newsecs.indexOf(',') == -1) {
-                            numsplit = new Array(newsecs);
-                        } else {
-                            numsplit = newsecs.split(/,/g);
-                        }
-                        for (var m=0; m<numsplit.length; m++) {
-                            var newsec = numsplit[m];
-                            newsec = newsec.replace(trimleading,'');
-                            newsec = newsec.replace(trimtrailing,'');
-                            if (re2.test(newsec) == true) {
-                                badsecs.push(newsec);
-                            } else {
-                                if (newsec != '') {
-                                    var isnew = 1;
-                                    if (fromexisting != null) {
-                                        for (var n=0; n<fromexisting.length; n++) {
-                                            if (newsec == fromexisting[n]) {
-                                                isnew = 0;
-                                            }
-                                        }
-                                    }
-                                    if (isnew == 1) {
-                                        validsecs.push(newsec);
+                                    if (formname.elements[i].options[j].value != "") {
+                                        sections = formname.elements[i].options[j].value;
+                                        numsec ++;
                                     }
                                 }
+                                else {
+                                    sections = sections + "," +  formname.elements[i].options[j].value
+                                    numsec ++;
+                                }
                             }
                         }
-                        if (badsecs.length > 0) {
-                            alert("$alerts{'nonw'}\\n$alerts{'plch'}");
-                            return;
+                    }
+                    if (numsec > 0) {
+                        if (formname.elements[i+1].value != "" && formname.elements[i+1].value != null) {
+                            sections = sections + "," +  formname.elements[i+1].value;
                         }
-                        numsec = numsec + validsecs.length;
                     }
+                    else {
+                        sections = formname.elements[i+1].value;
+                    }
+                    var newsecs = formname.elements[i+1].value;
+                    var numsplit;
+                    if (newsecs != null && newsecs != "") {
+                        numsplit = newsecs.split(/,/g);
+                        numsec = numsec + numsplit.length;
+                    }
+
                     if ((role == 'st') && (numsec > 1)) {
                         if (crstype == 'Community') {
                             alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                         } else {
-                            alert("$alerts{'inco'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
+                            alert("$alerts{'inec'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                         }
                         return;
-                    } else {
-                        if (validsecs != null) {
-                            for (var j=0; j<validsecs.length; j++) {
-                                if (validsecstr == '' || validsecstr == null) {
-                                    validsecstr = validsecs[j];
-                                } else {
-                                    validsecstr += ','+validsecs[j];
-                                }
-                                if ((validsecs[j] == 'all') ||
-                                    (validsecs[j] == 'none')) {
-                                    alert("'"+validsecs[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
+                    }
+                    else {
+                        if (numsplit != null) {
+                            for (var j=0; j<numsplit.length; j++) {
+                                if ((numsplit[j] == 'all') ||
+                                    (numsplit[j] == 'none')) {
+                                    alert("'"+numsplit[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
                                     return;
                                 }
                                 for (var k=0; k<groups.length; k++) {
-                                    if (validsecs[j] == groups[k]) {
-                                        alert("'"+validsecs[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
+                                    if (numsplit[j] == groups[k]) {
+                                        alert("'"+numsplit[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
                                         return;
                                     }
                                 }
                             }
                         }
+                        formname.elements[i+2].value = sections;
                     }
-                    if ((validsecstr != '') && (validsecstr != null)) {
-                        if ((sections == '') || (sections == null)) {
-                            sections = validsecstr;
-                        } else {
-                            sections = sections + "," + validsecstr;
-                        }
-                    }
-                    formname.elements[num+2].value = sections;
                 }
             }
         }
@@ -5149,6 +5264,46 @@ ENDSECCODE
     return $setsection_js; 
 }
 
+sub newsections_javascript {
+    my %alerts = &Apache::lonlocal::texthash(
+                    inea => 'In each course, each user may only have one student role at a time.',
+                    youh => 'You had selected ',
+                    secs => 'sections.',
+                    plmo => 'Please modify your selections so they include no more than one section.',
+                    mayn => 'may not be used as the name for a section, as it is a reserved word.',
+                    plch => 'Please choose a different section name.',
+                 );
+    my $setsection_js = <<"ENDSECCODE";
+
+function setSections(formname) {
+    var newsecs = formname.newsec.value;
+    var numsplit = 0;
+    var numsec = 0;
+    if (newsecs != null && newsecs != "") {
+        numsplit = newsecs.split(/,/g);
+        numsec = numsplit.length;
+    }
+    if (numsec > 1) {
+        alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
+    } else {
+        if (numsplit > 0) {
+            for (var j=0; j<numsplit.length; j++) {
+                if ((numsplit[j] == 'all') ||
+                    (numsplit[j] == 'none')) {
+                    alert("'"+numsplit[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
+                    return;
+                }
+           }
+           formname.sections.value = newsecs;
+       }
+    }
+    return 'ok';
+}
+
+ENDSECCODE
+    return $setsection_js;
+}
+
 sub can_create_user {
     my ($dom,$context,$usertype) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
@@ -5263,14 +5418,22 @@ sub roles_by_context {
         if ($env{'request.role'} =~ m{^dc\./}) {
             push(@allroles,'ad');
         }
-        push(@allroles,('ta','ep','in'));
-        if ($crstype eq 'Community') {
-            push(@allroles,'co');
+        if (&Apache::loncommon::needs_gci_custom()) {
+            if ($crstype eq 'Community') {
+                push(@allroles,'co');
+            } else {
+                push(@allroles,'cc');
+            }
         } else {
-            push(@allroles,'cc');
-        }
-        if ($custom) {
-            push(@allroles,'cr');
+            push(@allroles,('ta','ep','in'));
+            if ($crstype eq 'Community') {
+                push(@allroles,'co');
+            } else {
+                push(@allroles,'cc');
+            }
+            if ($custom) {
+                push(@allroles,'cr');
+            }
         }
     } elsif ($context eq 'author') {
         @allroles = ('ca','aa');
@@ -5594,7 +5757,7 @@ sub sectioncheck_alerts {
     my %alerts = &Apache::lonlocal::texthash(
                     curd => 'You must select a course or community in the current domain',
                     inea => 'In each course, each user may only have one student role at a time',
-                    inco => 'In each community, each user may only have one member role at a time',
+                    inco => 'In each community, each user may only have one member role at a time', 
                     youh => 'You had selected',
                     sect => 'sections',
                     plsm => 'Please modify your selections so they include no more than one section',