--- loncom/interface/loncreateuser.pm	2009/04/05 17:04:56	1.289
+++ loncom/interface/loncreateuser.pm	2009/07/27 14:09:14	1.300
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.289 2009/04/05 17:04:56 droeschl Exp $
+# $Id: loncreateuser.pm,v 1.300 2009/07/27 14:09:14 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -225,12 +225,14 @@ sub build_tools_display {
                    'usde'       => "Use default",
                    'uscu'       => "Use custom",
                    'official'   => 'Can request creation of official courses',
-                   'unofficial' => 'Can request creation of unofficial courses',  
+                   'unofficial' => 'Can request creation of unofficial courses',
+                   'community'  => 'Can request creation of communities',
     );
     if ($context eq 'requestcourses') {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
-                      'requestcourses.official','requestcourses.unofficial');
-        @usertools = ('official','unofficial');
+                      'requestcourses.official','requestcourses.unofficial',
+                      'requestcourses.community');
+        @usertools = ('official','unofficial','community');
     } else {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                           'tools.aboutme','tools.portfolio','tools.blog');
@@ -282,6 +284,40 @@ sub build_tools_display {
     return $output;
 }
 
+sub coursereq_externaluser {
+    my ($ccuname,$ccdomain,$cdom) = @_;
+    my (@usertools,%userenv,$output);
+    my %lt = &Apache::lonlocal::texthash (
+                   'official'   => 'Can request creation of official courses',
+                   'unofficial' => 'Can request creation of unofficial courses',
+                   'community'  => 'Can request creation of communities',
+    );
+
+    %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
+                      'reqcrsotherdom.official','reqcrsotherdom.unofficial',
+                      'reqcrsotherdom.community');
+    @usertools = ('official','unofficial','community');
+    foreach my $item (@usertools) {
+        my ($tool_on,$tool_off);
+        $tool_off = 'checked="checked" ';
+        if ($userenv{'reqcrsotherdom.'.$item} ne '') {
+            my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});
+            if (grep(/^\Q$cdom\E$/,@curr)) {
+                $tool_on = 'checked="checked" ';
+                $tool_off = '';
+            }
+        }
+        $output .= &Apache::loncommon::start_data_table_row()."\n".
+                   '  <td><span class="LC_nobreak">'.$lt{$item}.': <label>'.
+                   '<input type="radio" name="reqcrsotherdom_'.$item.'" value="1" '.
+                   $tool_on.'/>'.&mt('Yes').'</label>&nbsp;<label>'.
+                   '<input type="radio" name="reqcrsotherdom_'.$item.'" value="0" '.
+                   $tool_off.'/>'.&mt('No').'</label></span></td>'."\n".
+                   &Apache::loncommon::end_data_table_row()."\n";
+    }
+    return $output;
+}
+
 # =================================================================== Phase one
 
 sub print_username_entry_form {
@@ -631,7 +667,7 @@ sub print_user_modification_page {
             &Apache::lonuserutils::can_create_user($ccdomain,$context,
                                                    $usertype);
         if (!$cancreate) {
-            my $helplink = ' href="javascript:helpMenu('."'display'".')"';
+            my $helplink = 'javascript:helpMenu('."'display'".')';
             my %usertypetext = (
                 official   => 'institutional',
                 unofficial => 'non-institutional',
@@ -641,7 +677,12 @@ sub print_user_modification_page {
                 $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 />';
+            $response .= '<p class="LC_warning">'
+                        .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
+                        .' '
+                        .&mt('Please contact the [_1]helpdesk[_2] for assistance.'
+                            ,'<a href="'.$helplink.'">','</a>')
+                        .'</p><br />';
             $env{'form.phase'} = '';
             &print_username_entry_form($r,$context,$response);
             return;
@@ -868,10 +909,15 @@ ENDCHANGEUSER
             $r->print(&Apache::lonuserutils::forceid_change($context));
         }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
-            $r->print('<h3>'.&mt('User Can Request Creation of Courses?').'</h3>'.
-                      &Apache::loncommon::start_data_table().
-                      &build_tools_display($ccuname,$ccdomain,'requestcourses').
-                      &Apache::loncommon::end_data_table());
+            $r->print('<h3>'.&mt('User Can Request Creation of Courses in this Domain?').'</h3>'.
+                      &Apache::loncommon::start_data_table());
+            if ($env{'request.role.domain'} eq $ccdomain) { 
+                $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
+            } else {
+                $r->print(&coursereq_externaluser($ccuname,$ccdomain,
+                                                  $env{'request.role.domain'}));
+            }
+            $r->print(&Apache::loncommon::end_data_table());
         }
         $r->print('</div>');
         my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);
@@ -1230,8 +1276,17 @@ sub display_existing_roles {
             }
         }
         if ($rolesdisplay == 1) {
+            my $contextrole='';
+            if ($env{'request.course.id'}) {
+                $contextrole = 'Existing Roles in this Course';
+            } elsif ($env{'request.role'} =~ /^au\./) {
+                $contextrole = 'Existing Co-Author Roles in your Construction Space';
+            } else {
+                $contextrole = 'Existing Roles in this Domain';
+            }
             $r->print('
 <h3>'.$lt{'rer'}.'</h3>'.
+'<div>'.&mt($contextrole).'</div>'.
 &Apache::loncommon::start_data_table("LC_createuser").
 &Apache::loncommon::start_data_table_header_row().
 '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.
@@ -1283,7 +1338,7 @@ sub new_coauthor_roles {
                   &Apache::loncommon::end_data_table_header_row()."\n".
                   &Apache::loncommon::start_data_table_row().'
            <td>
-            <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />
+            <input type="checkbox" name="act_'.$cudom.'_'.$cuname.'_ca" />
            </td>
            <td>'.$lt{'cau'}.'</td>
            <td>'.$cudom.'_'.$cuname.'</td>
@@ -1295,7 +1350,7 @@ sub new_coauthor_roles {
 "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".
-'<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
+'<td><input type="checkbox" name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
 <td>'.$lt{'caa'}.'</td>
 <td>'.$cudom.'_'.$cuname.'</td>
 <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_aa" value="" />
@@ -1346,7 +1401,7 @@ sub new_domain_roles {
                $num_domain_level ++;
                $domaintext .=
 &Apache::loncommon::start_data_table_row().
-'<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>
+'<td><input type="checkbox" name="act_'.$thisdomain.'_'.$role.'" /></td>
 <td>'.$plrole.'</td>
 <td>'.$thisdomain.'</td>
 <td><input type="hidden" name="start_'.$thisdomain.'_'.$role.'" value="" />
@@ -1847,7 +1902,7 @@ sub update_user_data {
 			 $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
     my (%alerts,%rulematch,%inst_results,%curr_rules);
     my @usertools = ('aboutme','blog','portfolio');
-    my @requestcourses = ('official','unofficial');
+    my @requestcourses = ('official','unofficial','community');
     my ($othertitle,$usertypes,$types) = 
         &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
     if ($env{'form.makeuser'}) {
@@ -1984,7 +2039,9 @@ sub update_user_data {
             ('environment',['firstname','middlename','lastname','generation',
              'id','permanentemail','portfolioquota','inststatus','tools.aboutme',
              'tools.blog','tools.portfolio','requestcourses.official',
-             'requestcourses.unofficial'],
+             'requestcourses.unofficial','requestcourses.community',
+             'reqcrsotherdom.official','reqcrsotherdom.unofficial',
+             'reqcrsotherdom.community'],
               $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) { 
@@ -2086,7 +2143,7 @@ sub update_user_data {
             (!$forceid)) {
             if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                 $env{'form.cid'} = $userenv{'id'};
-                $no_forceid_alert = &mt('New Student/Employee ID does not match existing ID for this user.')
+                $no_forceid_alert = &mt('New student/employee ID does not match existing ID for this user.')
                                    .'<br />'
                                    .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")
                                    .'<br />'."\n";
@@ -2113,7 +2170,7 @@ sub update_user_data {
             $oldinststatuses,$newinststatuses);
         my ($defquota,$settingstatus) = 
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
-        my ($showquota,$showtools,$showrequestcourses,$showinststatus);
+        my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom);
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $showquota = 1;
         }
@@ -2122,6 +2179,8 @@ sub update_user_data {
         }
         if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
             $showrequestcourses = 1;
+        } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
+            $showreqotherdom = 1;
         }
         if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
             $showinststatus = 1;
@@ -2205,8 +2264,14 @@ sub update_user_data {
         }
         &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv,
                       \%changeHash,\%changed,\%newaccess,\%newaccesstext);
-        &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext,
-                      \%userenv, \%changeHash,\%changed,\%newaccess,\%newaccesstext);
+        if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
+            &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext,
+                          \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
+        } else {
+            &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,
+                          \%userenv,
+                                  \%changeHash,\%changed,\%newaccess,\%newaccesstext);
+        }
         if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
             $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
             $env{'form.clastname'}   ne $userenv{'lastname'}   ||
@@ -2232,7 +2297,8 @@ sub update_user_data {
                         ($env{'user.domain'} eq $env{'form.ccdomain'})) {
                         my %newenvhash;
                         foreach my $key (keys(%changed)) {
-                            if (($key eq 'official') || ($key eq 'unofficial')) {
+                            if (($key eq 'official') || ($key eq 'unofficial')
+                                || ($key eq 'community')) {
                                 $newenvhash{'environment.requestcourses.'.$key} =
                                     $changeHash{'requestcourses.'.$key};
                                 if ($changeHash{'requestcourses.'.$key} ne '') {
@@ -2294,6 +2360,7 @@ sub update_user_data {
                              'portfolio'  => 'Portfolio Availability',
                              'official'   => 'Can Request Official Courses',
                              'unofficial' => 'Can Request Unofficial Courses',
+                             'community'  => 'Can Request Communities',
                              'inststatus' => "Affiliation",
                              'prvs'       => 'Previous Value:',
                              'chto'       => 'Changed To:'
@@ -2319,6 +2386,11 @@ END
                         $r->print("
     <th>$lt{$item}</th>\n");
                     }
+                } elsif ($showreqotherdom) {
+                    foreach my $item (@requestcourses) {
+                        $r->print("
+    <th>$lt{$item}</th>\n");
+                    }
                 }
                 if ($showquota) {
                     $r->print("
@@ -2350,6 +2422,11 @@ END
                         $r->print("
     <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");
                     }
+                } elsif ($showreqotherdom) {
+                    foreach my $item (@requestcourses) {
+                        $r->print("
+    <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");
+                    }
                 }
                 if ($showquota) {
                     $r->print("
@@ -2381,6 +2458,11 @@ END
                         $r->print("
     <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
                     }
+                } elsif ($showreqotherdom) {
+                    foreach my $item (@requestcourses) {
+                        $r->print("
+    <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
+                    }
                 }
                 if ($showquota) {
                     $r->print("
@@ -2431,7 +2513,8 @@ END
                            'aboutme'    => "Personal Information Page Availability",
                            'portfolio'  => "Portfolio Availability",
                            'official'   => "Can Request Official Courses",
-                           'unofficial' => "Can Request Unofficial Course",
+                           'unofficial' => "Can Request Unofficial Courses",
+                           'community'  => "Can Request Communities",
                            'inststatus' => "Affiliation",
 					       );
             $r->print(<<"END");
@@ -2449,6 +2532,11 @@ END
                     $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                               $newaccesstext{$item}.']'."\n");
                 }
+            } elsif ($showreqotherdom) {
+                foreach my $item (@requestcourses) {
+                    $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
+                              $newaccesstext{$item}.']'."\n");
+                }
             }
             if ($showtools) {
                 foreach my $item (@usertools) {
@@ -2485,8 +2573,11 @@ END
             } else {
                 $r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname));
             }
-            $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.
-                      &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');
+            my $helplink = 'javascript:helpMenu('."'display'".')';
+            $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'
+                     .&mt('Please contact your [_1]helpdesk[_2] for more information.'
+                         ,'<a href="'.$helplink.'">','</a>')
+                      .'<br />');
         }
         $r->print('<span class="LC_warning">'
                   .$no_forceid_alert
@@ -2537,6 +2628,59 @@ sub tool_changes {
           (ref($newaccess) eq 'HASH') && (ref($newaccesstext) eq 'HASH'))) {
         return;
     }
+    if ($context eq 'reqcrsotherdom') {
+        my $cdom = $env{'request.role.domain'};
+        foreach my $tool (@{$usertools}) {
+            $oldaccesstext->{$tool} = &mt('no');
+            $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
+            if ($userenv->{$context.'.'.$tool} eq '') {
+                if ($env{'form.'.$context.'_'.$tool}) {
+                    $changed->{$tool}=&tool_admin($tool,$cdom,
+                                                  $changeHash,$context);
+                    if ($changed->{$tool}) {
+                        $newaccesstext->{$tool} = &mt('yes');
+                    } else {
+                        $newaccesstext->{$tool} = $oldaccesstext->{$tool};
+                    }
+                }
+            } else {
+                my @curr = split(',',$userenv->{$context.'.'.$tool});
+                my @new;
+                my $changedoms;
+                if (grep(/^\Q$cdom\E$/,@curr)) {
+                    $oldaccesstext->{$tool} = &mt('yes');
+                    unless ($env{'form.'.$context.'_'.$tool}) {
+                        $changedoms = 1;
+                        foreach my $dom (@curr) {
+                            unless ($dom eq $cdom) {
+                                push(@new,$dom);
+                            }
+                        }
+                    }
+                } elsif ($env{'form.'.$context.'_'.$tool}) {
+                    $changedoms = 1;
+                    @new = sort(@curr,$cdom);
+                }
+                $newaccesstext->{$tool} = $oldaccesstext->{$tool};
+                if ($changedoms) {
+                    my $newdomstr; 
+                    if (@new) {
+                        $newdomstr = join(',',@new);
+                    }
+                    $changed->{$tool}=&tool_admin($tool,$newdomstr,$changeHash,
+                                                  $context);
+                    if ($changed->{$tool}) {
+                        if ($env{'form.'.$context.'_'.$tool}) {
+                            $newaccesstext->{$tool} = &mt('yes'); 
+                        } else {
+                            $newaccesstext->{$tool} = &mt('no');
+                        }
+                    }
+                }
+            }
+        }
+        return;
+    }
     foreach my $tool (@{$usertools}) {
         if ($userenv->{$context.'.'.$tool} ne '') {
             $oldaccess->{$tool} = &mt('custom');
@@ -2576,9 +2720,9 @@ sub tool_changes {
                 } else {
                     $newaccess->{$tool} = $oldaccess->{$tool};
                     if ($userenv->{$context.'.'.$tool}) {
-                         $newaccesstext->{$tool} = &mt("availability set to 'on'");
+                        $newaccesstext->{$tool} = &mt("availability set to 'on'");
                     } else {
-                         $newaccesstext->{$tool} = &mt("availability set to 'off'");
+                        $newaccesstext->{$tool} = &mt("availability set to 'off'");
                     }
                 }
             }
@@ -2672,8 +2816,8 @@ sub update_roles {
 	    if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                 my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
 # Delete custom role
-                $r->print(&mt('Deleting custom role [_1] by [_2]:[_3] in [_4]',
-                      $rolename,$rnam,$rdom,$url).': <b>'.
+                $r->print(&mt('Deleting custom role [_1] by [_2] in [_3]',
+                      $rolename,$rnam.':'.$rdom,$url).': <b>'.
                       &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
                          $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
                          0,1,$context).'</b><br />');
@@ -2724,8 +2868,8 @@ sub update_roles {
                 my $result = &Apache::lonnet::assigncustomrole(
                                $env{'form.ccdomain'}, $env{'form.ccuname'},
                                $url,$rdom,$rnam,$rolename,0,$now,undef,$context);
-                $r->print(&mt('Re-enabling custom role [_1] by [_2]:[_3] in [_4] : [_5]',
-                          $rolename,$rnam,$rdom,$url,'<b>'.$result.'</b>').'<br />');
+                $r->print(&mt('Re-enabling custom role [_1] by [_2] in [_3]: [_4]',
+                          $rolename,$rnam.':'.$rdom,$url,'<b>'.$result.'</b>').'<br />');
                 if (!grep(/^cr$/,@rolechanges)) {
                     push(@rolechanges,'cr');
                 }
@@ -2975,6 +3119,10 @@ sub tool_admin {
         if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
             $canchange = 1;
         }
+    } elsif ($context eq 'reqcrsotherdom') {
+        if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
+            $canchange = 1;
+        }
     } elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
         # Current user has quota modification privileges
         $canchange = 1;
@@ -3638,141 +3786,160 @@ END
 sub print_main_menu {
     my ($permission,$context) = @_;
     my %links = (
-                       domain => {
-                                   upload => 'Upload a File of Users',
-                                   singleuser => 'Add/Modify a Single User',
-                                   listusers => 'Manage Multiple Users',
-                                 },
-                       author => {
-                                   upload => 'Upload a File of Co-authors',
-                                   singleuser => 'Add/Modify a Single Co-author',
-                                   listusers => 'Display Co-authors and Manage Multiple Users',
-                                 },
-                       course => {
-                                   upload => 'File of Course Users',
-                                   singleuser => 'Single Course User',
-                                   listusers => 'Course User Lists',
-                                 },
-                     );
-  my @menu = ( {categorytitle => 'Add Users',
-	     items =>
-	     [{
-	         linktext => $links{$context}{'upload'},
-	         icon => 'sctr.png',
-	         #help => 'Course_Create_Class_List',
-	         url => '/adm/createuser?action=upload',
-	         permission => $permission->{'cusr'},
-	         linktitle => 'Upload a CSV or a text file containing users.',
-	     },
-	     {
-	         linktext => $links{$context}{'singleuser'},
-	         icon => 'edit-redo.png',
-	         #help => 'Course_Change_Privileges',
-	         url => '/adm/createuser?action=singleuser',
-	         permission => $permission->{'cusr'},
-	         linktitle => 'Add a user with a certain role to this course.',
-	     }]},
-	     {categorytitle => 'Administration',
-	     items =>
-	     [{	
-	         linktext => $links{$context}{'listusers'},
-                 icon => 'edit-find.png',
-                 #help => 'Course_View_Class_List',
-                 url => '/adm/createuser?action=listusers',
-	         permission => ($permission->{'view'} || $permission->{'cusr'}),
-	         linktitle => 'Show and manage users of this course.',
-	     }]},
-	     {categorytitle => 'Configuration',
-	     items =>
-	     [
-	     ]},
-	   );
-			
+                domain => {
+                            upload     => 'Upload a File of Users',
+                            singleuser => 'Add/Modify a User',
+                            listusers  => 'Manage Users',
+                            },
+                author => {
+                            upload     => 'Upload a File of Co-authors',
+                            singleuser => 'Add/Modify a Co-author',
+                            listusers  => 'Manage Co-authors',
+                            },
+                course => {
+                            upload     => 'Upload a File of Course Users',
+                            singleuser => 'Add/Modify a Course User',
+                            listusers  => 'Manage Course Users',
+                            },
+                );
+  my @menu = ( {categorytitle => 'Single Users', 
+         items =>
+         [
+            {
+             linktext => $links{$context}{'singleuser'},
+             icon => 'edit-redo.png',
+             #help => 'Course_Change_Privileges',
+             url => '/adm/createuser?action=singleuser',
+             permission => $permission->{'cusr'},
+             linktitle => 'Add a user with a certain role to this course.',
+            },
+         ]},
+
+         {categorytitle => 'Multiple Users',
+         items => 
+         [
+            {
+             linktext => $links{$context}{'upload'},
+             icon => 'sctr.png',
+             #help => 'Course_Create_Class_List',
+             url => '/adm/createuser?action=upload',
+             permission => $permission->{'cusr'},
+             linktitle => 'Upload a CSV or a text file containing users.',
+            },
+            {
+             linktext => $links{$context}{'listusers'},
+             icon => 'edit-find.png',
+             #help => 'Course_View_Class_List',
+             url => '/adm/createuser?action=listusers',
+             permission => ($permission->{'view'} || $permission->{'cusr'}),
+             linktitle => 'Show and manage users of this course.',
+            },
+
+         ]},
+
+         {categorytitle => 'Administration',
+         items => [ ]},
+       );
+            
     if ($context eq 'domain'){
-		
-		push(@{ $menu[1]->{items} },
-		{	linktext => 'Custom Roles',
-			icon => 'emblem-photos.png',
-			#help => 'Course_Editing_Custom_Roles',
-			url => '/adm/createuser?action=custom',
-			permission => $permission->{'custom'},
-			linktitle => 'Configure a custom role.',
-		});
-		
+        
+        push(@{ $menu[2]->{items} }, #Category: Administration
+            {
+             linktext => 'Custom Roles',
+             icon => 'emblem-photos.png',
+             #help => 'Course_Editing_Custom_Roles',
+             url => '/adm/createuser?action=custom',
+             permission => $permission->{'custom'},
+             linktitle => 'Configure a custom role.',
+            },
+        );
+        
     }elsif ($context eq 'course'){
-    	my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
-	
-        push(@{ $menu[0]->{items} },
-		{	linktext => 'Single Student',
-            		#help => 'Course_Add_Student',
-			icon => 'list-add.png',
-            		url => '/adm/createuser?action=singlestudent',
-			permission => $permission->{'cusr'},
-            		linktitle => 'Add a user with the role student to this course.',
-        	});
-		
-        push(@{ $menu[1]->{items} },  
-		{	linktext => 'Drop Students',
-			icon => 'edit-undo.png',
-           		#help => 'Course_Drop_Student',
-           		url => '/adm/createuser?action=drop',
-			permission => $permission->{'cusr'},
-           		linktitle =>'Remove a student from this course.',
-        	},
-		{	linktext => 'Custom Roles',
-			icon => 'emblem-photos.png',
-           		#help => 'Course_Editing_Custom_Roles',
-           		url => '/adm/createuser?action=custom',
-			permission => $permission->{'custom'},
-			linktitle => 'Configure a custom role.',
-        	});
+        my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
+    
+        push(@{ $menu[0]->{items} }, #Category: Single Users
+            {   
+             linktext => 'Add/Modify a Student',
+             #help => 'Course_Add_Student',
+             icon => 'list-add.png',
+             url => '/adm/createuser?action=singlestudent',
+             permission => $permission->{'cusr'},
+             linktitle => 'Add a user with the role student to this course.',
+            },
+        );
+        
+        push(@{ $menu[1]->{items} }, #Category: Multiple Users 
+            {
+             linktext => 'Drop Students',
+             icon => 'edit-undo.png',
+             #help => 'Course_Drop_Student',
+             url => '/adm/createuser?action=drop',
+             permission => $permission->{'cusr'},
+             linktitle =>'Remove a student from this course.',
+            },
+        );
+        push(@{ $menu[2]->{items} }, #Category: Administration
+            {    
+             linktext => 'Custom Roles',
+             icon => 'emblem-photos.png',
+             #help => 'Course_Editing_Custom_Roles',
+             url => '/adm/createuser?action=custom',
+             permission => $permission->{'custom'},
+             linktitle => 'Configure a custom role.',
+            },
+            {
+             linktext => 'Course Groups',
+             icon => 'conf.png',
+             #help => 'Course_Manage_Group',
+             url => '/adm/coursegroups?refpage=cusr',
+             permission => $permission->{'grp_manage'},
+             linktitle => 'Manage course groups.',
+            },
+            {
+             linktext => 'Change Logs',
+             icon => 'document-properties.png',
+             #help => 'Course_User_Logs',
+             url => '/adm/createuser?action=changelogs',
+             permission => $permission->{'cusr'},
+             linktitle => 'View change log.',
+            },
+        );
         if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
-            push(@{ $menu[1]->{items} },
-                    {   linktext => 'Enrollment Requests',
-                        icon => 'selfenrl-queue.png',
-                        #help => 'Course_Approve_Selfenroll',
-                        url => '/adm/createuser?action=selfenrollqueue',
-                        permission => $permission->{'cusr'},
-                        linktitle =>'Approve or reject enrollment requests.',
-                });
+            push(@{ $menu[2]->{items} },
+                    {   
+                     linktext => 'Enrollment Requests',
+                     icon => 'selfenrl-queue.png',
+                     #help => 'Course_Approve_Selfenroll',
+                     url => '/adm/createuser?action=selfenrollqueue',
+                     permission => $permission->{'cusr'},
+                     linktitle =>'Approve or reject enrollment requests.',
+                    },
+            );
         }
-		
+        
         if (!exists($permission->{'cusr_section'})){
-        	
-		push(@{ $menu[2]->{items} },
-		{	linktext => 'Automated Enrollment',
-			icon => 'roles.png',
-         		#help => 'Course_Automated_Enrollment',
-        		permission => (&Apache::lonnet::auto_run($cnum,$cdom)
-                                	&& $permission->{'cusr'}),
-			url  => '/adm/populate',
-			linktitle => 'Automated enrollment manager.',
-		},
-		{	linktext => 'User Self-Enrollment',
-			icon => 'cstr.png',
-	       		#help => 'Course_Self_Enrollment',
-			url => '/adm/createuser?action=selfenroll',
-			permission => $permission->{'cusr'},
-			linktitle => 'Configure user self enrollment.',
-       		});
-		
-	}
-
-	push(@{ $menu[2]->{items} },
-	{	linktext => 'Course Groups',
-		icon => 'conf.png',
-        	#help => 'Course_Manage_Group',
-           	url => '/adm/coursegroups?refpage=cusr',
-		permission => $permission->{'grp_manage'},
-		linktitle => 'Manage course groups.',
-        },
-        {	linktext => 'Change Logs',
-		icon => 'document-properties.png',
-        	#help => 'Course_User_Logs',
-        	url => '/adm/createuser?action=changelogs',
-		permission => $permission->{'cusr'},
-		linktitle => 'View change log.',
-        });
+            
+            push(@{ $menu[2]->{items} },
+                {
+                 linktext => 'Automated Enrollment',
+                 icon => 'roles.png',
+                 #help => 'Course_Automated_Enrollment',
+                 permission => (&Apache::lonnet::auto_run($cnum,$cdom)
+                                     && $permission->{'cusr'}),
+                 url  => '/adm/populate',
+                 linktitle => 'Automated enrollment manager.',
+                },
+                {
+                 linktext => 'User Self-Enrollment',
+                 icon => 'cstr.png',
+                 #help => 'Course_Self_Enrollment',
+                 url => '/adm/createuser?action=selfenroll',
+                 permission => $permission->{'cusr'},
+                 linktitle => 'Configure user self enrollment.',
+                },
+            );
+        
+        }
     };
 return Apache::lonhtmlcommon::generate_menu(@menu);
 #               { text => 'View Log-in History',
@@ -4005,9 +4172,7 @@ ENDSCRIPT
             if (ref($lt) eq 'HASH') {
                 $title = $lt->{$item};
             }
-            $output .= 
-                &Apache::lonhtmlcommon::row_title($title,
-                             'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n";
+            $output .= &Apache::lonhtmlcommon::row_title($title);
             if ($item eq 'types') {
                 my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'};
                 my $showdomdesc = 1;
@@ -4948,7 +5113,7 @@ sub role_display_filter {
                &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.6.99.0 or later are displayed.');
     if ($version) {
         $output .= ' '.&mt('This server is version [_3].','<b>','</b>',$version);    }
-    $output .= '</span><hr noshade><br />';
+    $output .= '</span><hr /><br />';
     return $output;
 }
 
@@ -5361,7 +5526,7 @@ sub build_search_response {
                                 .&mt("You are not authorized to create new users in your current role's domain - [_1]."
                                     ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')
                                 .'<br />'
-                                .&mt('Contact the [_1]helpdesk[_2] if you need to create a new user.'
+                                .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'
                                     ,' <a'.$helplink.'>'
                                     ,'</a>')
                                 .'<br /><br />';
@@ -5756,7 +5921,7 @@ sub update_selfenroll_config {
                         }
                     } else {
                         my @differences =  
-                            &compare_arrays(\@currnotified,\@newnotified);
+                            &Apache::loncommon::compare_arrays(\@currnotified,\@newnotified);
                         if (@differences > 0) {
                             if (@newnotified > 0) {
                                 $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
@@ -5766,7 +5931,7 @@ sub update_selfenroll_config {
                         }
                     }
                 } else {
-                    my @differences = &compare_arrays(\@currnotified,\@newnotified);
+                    my @differences = &Apache::loncommon::compare_arrays(\@currnotified,\@newnotified);
                     if (@differences > 0) {
                         if (@newnotified > 0) {
                             $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
@@ -5956,22 +6121,6 @@ sub update_selfenroll_config {
     return;
 }
 
-sub compare_arrays {
-    my ($arrayref1,$arrayref2) = @_;
-    my (@difference,%count);
-    @difference = ();
-    %count = ();
-    if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) { 
-        foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; }
-        foreach my $element (keys(%count)) {
-            if ($count{$element} == 1) {
-                push(@difference,$element);
-            }
-        }
-    }
-    return @difference;
-}
-
 sub get_selfenroll_titles {
     my @row = ('types','registered','enroll_dates','access_dates','section',
                'approval','limit');