--- loncom/interface/loncreateuser.pm	2010/09/20 00:51:14	1.349
+++ loncom/interface/loncreateuser.pm	2013/01/01 19:53:26	1.372
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.349 2010/09/20 00:51:14 raeburn Exp $
+# $Id: loncreateuser.pm,v 1.372 2013/01/01 19:53:26 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -111,11 +111,11 @@ sub initialize_authen_forms {
 
 sub auth_abbrev {
     my %abv_auth = (
-                     krb5     => 'krb',
-                     krb4     => 'krb',
-                     internal => 'int',
-                     localuth => 'loc',
-                     unix     => 'fsys',
+                     krb5      => 'krb',
+                     krb4      => 'krb',
+                     internal  => 'int',
+                     localauth => 'loc',
+                     unix      => 'fsys',
                    );
     return %abv_auth;
 }
@@ -223,6 +223,7 @@ sub build_tools_display {
     my %lt = &Apache::lonlocal::texthash (
                    'blog'       => "Personal User Blog",
                    'aboutme'    => "Personal Information Page",
+                   'webdav'     => "WebDAV access to authoring spaces (if SSL and author/co-author)",
                    'portfolio'  => "Personal User Portfolio",
                    'avai'       => "Available",
                    'cusa'       => "availability",
@@ -232,6 +233,7 @@ sub build_tools_display {
                    'official'   => 'Can request creation of official courses',
                    'unofficial' => 'Can request creation of unofficial courses',
                    'community'  => 'Can request creation of communities',
+                   'requestauthor'  => 'Can request author space',
     );
     if ($context eq 'requestcourses') {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
@@ -246,10 +248,21 @@ sub build_tools_display {
         %domconfig =
             &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain);
         $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain);
+    } elsif ($context eq 'requestauthor') {
+        %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
+                                                    'requestauthor');
+        @usertools = ('requestauthor');
+        @options =('norequest','approval','automatic');
+        %reqtitles = &requestauthor_titles();
+        %reqdisplay = &requestauthor_display();
+        $colspan = ' colspan="2"';
+        %domconfig =
+            &Apache::lonnet::get_dom('configuration',['requestauthor'],$ccdomain);
     } else {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
-                          'tools.aboutme','tools.portfolio','tools.blog');
-        @usertools = ('aboutme','blog','portfolio');
+                          'tools.aboutme','tools.portfolio','tools.blog',
+                          'tools.webdav');
+        @usertools = ('aboutme','blog','webdav','portfolio');
     }
     foreach my $item (@usertools) {
         my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off,
@@ -259,7 +272,12 @@ sub build_tools_display {
         $curr_access =  
             &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef,
                                               $context);
-        if ($userenv{$context.'.'.$item} ne '') {
+        if ($context eq 'requestauthor') {
+            if ($userenv{$context} ne '') {
+                $cust_on = ' checked="checked" ';
+                $cust_off = '';
+            }  
+        } elsif ($userenv{$context.'.'.$item} ne '') {
             $cust_on = ' checked="checked" ';
             $cust_off = '';
         }
@@ -269,6 +287,12 @@ sub build_tools_display {
             } else {
                 $custom_access = &mt('Currently from custom setting.');
             }
+        } elsif ($context eq 'requestauthor') {
+            if ($userenv{$context} eq '') {
+                $custom_access = &mt('Currently from default setting.');
+            } else {
+                $custom_access = &mt('Currently from custom setting.');
+            }
         } else {
             if ($userenv{$context.'.'.$item} eq '') {
                 $custom_access =
@@ -290,15 +314,27 @@ sub build_tools_display {
                    '   <td'.$colspan.'>'.$lt{$item}.'</td>'."\n".
                    '  </tr>'."\n".
                    &Apache::loncommon::start_data_table_row()."\n";
-        if ($context eq 'requestcourses') {
+        if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
             my ($curroption,$currlimit);
-            if ($userenv{$context.'.'.$item} ne '') {
-                $curroption = $userenv{$context.'.'.$item};
+            my $envkey = $context.'.'.$item;
+            if ($context eq 'requestauthor') {
+                $envkey = $context;
+            }
+            if ($userenv{$envkey} ne '') {
+                $curroption = $userenv{$envkey};
             } else {
                 my (@inststatuses);
-                $curroption =
-                    &Apache::loncoursequeueadmin::get_processtype($ccuname,$ccdomain,$isadv,$ccdomain,
-                                                               $item,\@inststatuses,\%domconfig);
+                if ($context eq 'requestcourses') {
+                    $curroption =
+                        &Apache::loncoursequeueadmin::get_processtype('course',$ccuname,$ccdomain,
+                                                                      $isadv,$ccdomain,$item,
+                                                                      \@inststatuses,\%domconfig);
+                } else {
+                     $curroption = 
+                         &Apache::loncoursequeueadmin::get_processtype('requestauthor',$ccuname,$ccdomain,
+                                                                       $isadv,$ccdomain,undef,
+                                                                       \@inststatuses,\%domconfig);
+                }
             }
             if (!$curroption) {
                 $curroption = 'norequest';
@@ -336,28 +372,36 @@ sub build_tools_display {
                         $checked = ' checked="checked"';
                     }
                 }
+                my $name = 'crsreq_'.$item;
+                if ($context eq 'requestauthor') {
+                    $name = $item;
+                }
                 $custdisp .= '<tr><td><span class="LC_nobreak"><label>'.
-                             '<input type="radio" name="crsreq_'.$item.
-                             '" value="'.$val.'"'.$checked.' />'.
+                             '<input type="radio" name="'.$name.'" '.
+                             'value="'.$val.'"'.$checked.' />'.
                              $reqtitles{$option}.'</label>&nbsp;';
                 if ($option eq 'autolimit') {
-                    $custdisp .= '<input type="text" name="crsreq_'.
-                                 $item.'_limit" size="1" '.
+                    $custdisp .= '<input type="text" name="'.$name.
+                                 '_limit" size="1" '.
                                  'value="'.$currlimit.'" /></span><br />'.
                                  $reqtitles{'unlimited'};
-                 } else {
-                     $custdisp .= '</span>';
-                 }
-                 $custdisp .= '</td></tr>';
+                } else {
+                    $custdisp .= '</span>';
+                }
+                $custdisp .= '</td></tr>';
             }
             $custdisp .= '</table>';
             $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp;
         } else {
             $currdisp = ($curr_access?&mt('Yes'):&mt('No'));
+            my $name = $context.'_'.$item;
+            if ($context eq 'requestauthor') {
+                $name = $context;
+            }
             $custdisp = '<span class="LC_nobreak"><label>'.
-                        '<input type="radio" name="'.$context.'_'.$item.'"'.
-                        ' value="1"'. $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.
-                        '<input type="radio" name="'.$context.'_'.$item.'" value="0" '.
+                        '<input type="radio" name="'.$name.'"'.
+                        ' value="1" '.$tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.
+                        '<input type="radio" name="'.$name.'" value="0" '.
                         $tool_off.'/>'.&mt('Off').'</label></span>';
             $custradio = ('&nbsp;'x2).'--'.$lt{'cusa'}.':&nbsp;'.$custdisp.
                           '</span>';
@@ -453,6 +497,17 @@ sub coursereq_externaluser {
     return $output;
 }
 
+sub domainrole_req {
+    my ($ccuname,$ccdomain) = @_;
+    return '<br /><h3>'.
+           &mt('User Can Request Assignment of Domain Roles?').
+           '</h3>'."\n".
+           &Apache::loncommon::start_data_table().
+           &build_tools_display($ccuname,$ccdomain,
+                                'requestauthor').
+           &Apache::loncommon::end_data_table();
+}
+
 sub courserequest_titles {
     my %titles = &Apache::lonlocal::texthash (
                                    official   => 'Official',
@@ -476,10 +531,84 @@ sub courserequest_display {
    return %titles;
 }
 
+sub requestauthor_titles {
+    my %titles = &Apache::lonlocal::texthash (
+                                   norequest  => 'Not allowed',
+                                   approval   => 'Approval by Dom. Coord.',
+                                   automatic  => 'Automatic approval',
+                 );
+    return %titles;
+
+}
+
+sub requestauthor_display {
+    my %titles = &Apache::lonlocal::texthash (
+                                   approval   => 'Yes, need approval',
+                                   automatic  => 'Yes, automatic approval',
+                                   norequest  => 'No',
+   );
+   return %titles;
+}
+
+sub curr_requestauthor {
+    my ($uname,$udom,$isadv,$inststatuses,$domconfig) = @_;
+    return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));
+    if ($uname eq '' || $udom eq '') {
+        $uname = $env{'user.name'};
+        $udom = $env{'user.domain'};
+        $isadv = $env{'user.adv'};
+    }
+    my (%userenv,%settings,$val);
+    my @options = ('automatic','approval');
+    %userenv =
+        &Apache::lonnet::userenvironment($udom,$uname,'requestauthor','inststatus');
+    if ($userenv{'requestauthor'}) {
+        $val = $userenv{'requestauthor'};
+        @{$inststatuses} = ('_custom_');
+    } else {
+        my %alltasks;
+        if (ref($domconfig->{'requestauthor'}) eq 'HASH') {
+            %settings = %{$domconfig->{'requestauthor'}};
+            if (($isadv) && ($settings{'_LC_adv'} ne '')) {
+                $val = $settings{'_LC_adv'};
+                @{$inststatuses} = ('_LC_adv_');
+            } else {
+                if ($userenv{'inststatus'} ne '') {
+                    @{$inststatuses} = split(',',$userenv{'inststatus'});
+                } else {
+                    @{$inststatuses} = ('default');
+                }
+                foreach my $status (@{$inststatuses}) {
+                    if (exists($settings{$status})) {
+                        my $value = $settings{$status};
+                        next unless ($value);
+                        unless (exists($alltasks{$value})) {
+                            if (ref($alltasks{$value}) eq 'ARRAY') {
+                                unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {
+                                    push(@{$alltasks{$value}},$status);
+                                }
+                            } else {
+                                @{$alltasks{$value}} = ($status);
+                            }
+                        }
+                    }
+                }
+                foreach my $option (@options) {
+                    if ($alltasks{$option}) {
+                        $val = $option;
+                        last;
+                    }
+                }
+            }
+        }
+    }
+    return $val;
+}
+
 # =================================================================== Phase one
 
 sub print_username_entry_form {
-    my ($r,$context,$response,$srch,$forcenewuser,$crstype) = @_;
+    my ($r,$context,$response,$srch,$forcenewuser,$crstype,$brcrum) = @_;
     my $defdom=$env{'request.role.domain'};
     my $formtoset = 'crtuser';
     if (exists($env{'form.startrolename'})) {
@@ -503,31 +632,36 @@ sub print_username_entry_form {
         && (&Apache::lonnet::allowed('mcr','/'))) {
         $jscript .= &customrole_javascript();
     }
-    my %loaditems = (
-                'onload' => "javascript:setFormElements(document.$formtoset)",
-                    );
-    my %breadcrumb_text = &singleuser_breadcrumb($crstype);
-    my $start_page =
-	&Apache::loncommon::start_page('User Management',
-				       $jscript,{'add_entries' => \%loaditems,});
-    if ($env{'form.action'} eq 'custom') {
-        &Apache::lonhtmlcommon::add_breadcrumb
-          ({href=>"javascript:backPage(document.crtuser)",
-            text=>"Pick custom role",});
-    } else {
-        &Apache::lonhtmlcommon::add_breadcrumb
-          ({href=>"javascript:backPage(document.crtuser)",
-            text=>$breadcrumb_text{'search'},
-            faq=>282,bug=>'Instructor Interface',});
-    }
     my $helpitem = 'Course_Change_Privileges';
     if ($env{'form.action'} eq 'custom') {
         $helpitem = 'Course_Editing_Custom_Roles';
     } elsif ($env{'form.action'} eq 'singlestudent') {
         $helpitem = 'Course_Add_Student';
     }
-    my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                     $helpitem);
+    my %breadcrumb_text = &singleuser_breadcrumb($crstype);
+    if ($env{'form.action'} eq 'custom') {
+        push(@{$brcrum},
+                 {href=>"javascript:backPage(document.crtuser)",       
+                  text=>"Pick custom role",
+                  help => $helpitem,}
+                 );
+    } else {
+        push (@{$brcrum},
+                  {href => "javascript:backPage(document.crtuser)",
+                   text => $breadcrumb_text{'search'},
+                   help => $helpitem,
+                   faq  => 282,
+                   bug  => 'Instructor Interface',}
+                  );
+    }
+    my %loaditems = (
+                'onload' => "javascript:setFormElements(document.$formtoset)",
+                    );
+    my $args = {bread_crumbs           => $brcrum,
+                bread_crumbs_component => 'User Management',
+                add_entries            => \%loaditems,};
+    $r->print(&Apache::loncommon::start_page('User Management',$jscript,$args));
+
     my %lt=&Apache::lonlocal::texthash(
                     'srst' => 'Search for a user and enroll as a student',
                     'srme' => 'Search for a user and enroll as a member',
@@ -538,7 +672,7 @@ sub print_username_entry_form {
                     'nr'   => "role name",
                     'cre'  => "Next",
 				       );
-    $r->print($start_page."\n".$crumbs);
+
     if ($env{'form.action'} eq 'custom') {
         if (&Apache::lonnet::allowed('mcr','/')) {
             my $newroletext = &mt('Define new custom role:');
@@ -591,7 +725,6 @@ sub print_username_entry_form {
         }
         $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response,$crstype));
     }
-    $r->print(&Apache::loncommon::end_page());
 }
 
 sub customrole_javascript {
@@ -634,7 +767,6 @@ END
 
 sub entry_form {
     my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_;
-    my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my ($usertype,$inexact);
     if (ref($srch) eq 'HASH') {
         if (($srch->{'srchin'} eq 'dom') &&
@@ -642,9 +774,10 @@ sub entry_form {
             ($srch->{'srchtype'} eq 'exact') &&
             ($srch->{'srchdomain'} ne '') &&
             ($srch->{'srchterm'} ne '')) {
+            my (%curr_rules,%got_rules);
             my ($rules,$ruleorder) =
                 &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');
-            $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules);
+            $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules,\%curr_rules,\%got_rules);
         } else {
             $inexact = 1;
         }
@@ -738,19 +871,13 @@ sub user_modification_js {
 <script type="text/javascript" language="Javascript">
 // <![CDATA[
 
-    function pclose() {
-        parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
-                 "height=350,width=350,scrollbars=no,menubar=no");
-        parmwin.close();
-    }
-
     $pjump_def
     $dc_setcourse_code
 
     function dateset() {
         eval("document.cu."+document.cu.pres_marker.value+
             ".value=document.cu.pres_value.value");
-        pclose();
+        modalWindow.close();
     }
 
     $nondc_setsection_code
@@ -761,7 +888,7 @@ END
 
 # =================================================================== Phase two
 sub print_user_selection_page {
-    my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype) = @_;
+    my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype,$brcrum) = @_;
     my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $sortby = $env{'form.sortby'};
 
@@ -802,25 +929,30 @@ ENDSCRIPT
     if ($context eq 'requestcrs') {
         $r->print('<div>');
     } else {
-        $r->print(&Apache::loncommon::start_page('User Management',$jscript));
-
         my %breadcrumb_text = &singleuser_breadcrumb($crstype);
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>"javascript:backPage(document.usersrchform,'','')",
-              text=>$breadcrumb_text{'search'},
-              faq=>282,bug=>'Instructor Interface',},
-             {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
-              text=>$breadcrumb_text{'userpicked'},
-              faq=>282,bug=>'Instructor Interface',});
+        my $helpitem;
+        if ($env{'form.action'} eq 'singleuser') {
+            $helpitem = 'Course_Change_Privileges';
+        } elsif ($env{'form.action'} eq 'singlestudent') {
+            $helpitem = 'Course_Add_Student';
+        }
+        push (@{$brcrum},
+                  {href => "javascript:backPage(document.usersrchform,'','')",
+                   text => $breadcrumb_text{'search'},
+                   faq  => 282,
+                   bug  => 'Instructor Interface',},
+                  {href => "javascript:backPage(document.usersrchform,'get_user_info','select')",
+                   text => $breadcrumb_text{'userpicked'},
+                   faq  => 282,
+                   bug  => 'Instructor Interface',
+                   help => $helpitem}
+                  );
+        $r->print(&Apache::loncommon::start_page('User Management',$jscript,{bread_crumbs => $brcrum}));
         if ($env{'form.action'} eq 'singleuser') {
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                          'Course_Change_Privileges'));
             $r->print("<b>$lt{'usrch'}</b><br />");
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
             $r->print('<h3>'.$lt{'usel'}.'</h3>');
         } elsif ($env{'form.action'} eq 'singlestudent') {
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                          'Course_Add_Student'));
             $r->print($jscript."<b>");
             if ($crstype eq 'Community') {
                 $r->print($lt{'memsrch'});
@@ -897,12 +1029,12 @@ ENDSCRIPT
     if ($context eq 'requestcrs') {
         $r->print($opener_elements.'</form></div>');
     } else {
-        $r->print($response.'</form>'.&Apache::loncommon::end_page());
+        $r->print($response.'</form>');
     }
 }
 
 sub print_user_query_page {
-    my ($r,$caller) = @_;
+    my ($r,$caller,$brcrum) = @_;
 # FIXME - this is for a network-wide name search (similar to catalog search)
 # To use frames with similar behavior to catalog/portfolio search.
 # To be implemented. 
@@ -910,11 +1042,11 @@ sub print_user_query_page {
 }
 
 sub print_user_modification_page {
-    my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype) = @_;
+    my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype,$brcrum) = @_;
     if (($ccuname eq '') || ($ccdomain eq '')) {
         my $usermsg = &mt('No username and/or domain provided.');
         $env{'form.phase'} = '';
-	&print_username_entry_form($r,$context,$usermsg,'','',$crstype);
+	&print_username_entry_form($r,$context,$usermsg,'','',$crstype,$brcrum);
         return;
     }
     my ($form,$formname);
@@ -933,7 +1065,8 @@ sub print_user_modification_page {
         my ($rules,$ruleorder) =
             &Apache::lonnet::inst_userrules($ccdomain,'username');
             $usertype =
-                &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules);
+                &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules,
+                                                      \%curr_rules,\%got_rules);
         my $cancreate =
             &Apache::lonuserutils::can_create_user($ccdomain,$context,
                                                    $usertype);
@@ -945,7 +1078,9 @@ sub print_user_modification_page {
             );
             my $response;
             if ($env{'form.origform'} eq 'crtusername') {
-                $response =  '<span class="LC_warning">'.&mt('No match found for the username [_1] in LON-CAPA domain: [_2]','<b>'.$ccuname.'</b>',$ccdomain).
+                $response = '<span class="LC_warning">'.
+                            &mt('No match found for the username [_1] in LON-CAPA domain: [_2]',
+                                '<b>'.$ccuname.'</b>',$ccdomain).
                             '</span><br />';
             }
             $response .= '<p class="LC_warning">'
@@ -955,7 +1090,7 @@ sub print_user_modification_page {
                             ,'<a href="'.$helplink.'">','</a>')
                         .'</p><br />';
             $env{'form.phase'} = '';
-            &print_username_entry_form($r,$context,$response,undef,undef,$crstype);
+            &print_username_entry_form($r,$context,$response,undef,undef,$crstype,$brcrum);
             return;
         }
         $newuser = 1;
@@ -979,7 +1114,7 @@ sub print_user_modification_page {
                             'username');
                     }
                     $env{'form.phase'} = '';
-                    &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype);
+                    &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype,$brcrum);
                     return;
                 }
             }
@@ -1000,34 +1135,37 @@ sub print_user_modification_page {
 
     my $js = &validation_javascript($context,$ccdomain,$pjump_def,
                                $groupslist,$newuser,$formname,\%loaditem);
-    my $args = {'add_entries' => \%loaditem};  
-    if ($env{'form.popup'}) {
-       $args->{'no_nav_bar'} = 1; 
-    }
-    my $start_page = 
-	&Apache::loncommon::start_page('User Management',$js,$args);
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);
-    &Apache::lonhtmlcommon::add_breadcrumb
-     ({href=>"javascript:backPage($form)",
-       text=>$breadcrumb_text{'search'},
-       faq=>282,bug=>'Instructor Interface',});
-
-    if ($env{'form.phase'} eq 'userpicked') {
-        &Apache::lonhtmlcommon::add_breadcrumb
-     ({href=>"javascript:backPage($form,'get_user_info','select')",
-       text=>$breadcrumb_text{'userpicked'},
-       faq=>282,bug=>'Instructor Interface',});
-    }
-    &Apache::lonhtmlcommon::add_breadcrumb
-      ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')",
-        text=>$breadcrumb_text{'modify'},
-        faq=>282,bug=>'Instructor Interface',});
     my $helpitem = 'Course_Change_Privileges';
     if ($env{'form.action'} eq 'singlestudent') {
         $helpitem = 'Course_Add_Student';
     }
-    my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                     $helpitem);
+    push (@{$brcrum},
+        {href => "javascript:backPage($form)",
+         text => $breadcrumb_text{'search'},
+         faq  => 282,
+         bug  => 'Instructor Interface',});
+    if ($env{'form.phase'} eq 'userpicked') {
+       push(@{$brcrum},
+              {href => "javascript:backPage($form,'get_user_info','select')",
+               text => $breadcrumb_text{'userpicked'},
+               faq  => 282,
+               bug  => 'Instructor Interface',});
+    }
+    push(@{$brcrum},
+            {href => "javascript:backPage($form,'$env{'form.phase'}','modify')",
+             text => $breadcrumb_text{'modify'},
+             faq  => 282,
+             bug  => 'Instructor Interface',
+             help => $helpitem});
+    my $args = {'add_entries'           => \%loaditem,
+                'bread_crumbs'          => $brcrum,
+                'bread_crumbs_component' => 'User Management'};
+    if ($env{'form.popup'}) {
+        $args->{'no_nav_bar'} = 1;
+    }
+    my $start_page =
+        &Apache::loncommon::start_page('User Management',$js,$args);
 
     my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="$formname">
@@ -1059,12 +1197,15 @@ ENDFORMINFO
         }
     }
     if ($newuser) {
-        my $portfolioform;
+        my ($portfolioform,$domroleform);
         if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||
             (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {
             # Current user has quota or user tools modification privileges
             $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);
         }
+        if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) {
+            $domroleform = '<br />'.&domainrole_req($ccuname,$ccdomain);
+        }
         &initialize_authen_forms($ccdomain,$formname);
         my %lt=&Apache::lonlocal::texthash(
                 'cnu'            => 'Create New User',
@@ -1076,7 +1217,6 @@ ENDFORMINFO
         );
 	$r->print(<<ENDTITLE);
 $start_page
-$crumbs
 $response
 $forminfo
 <script type="text/javascript" language="Javascript">
@@ -1111,7 +1251,8 @@ $lt{'hs'}: $home_server_pick
             $r->print($home_server_pick);
         }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
-            $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
+            $r->print('<br /><h3>'.
+                      &mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table().
                       &build_tools_display($ccuname,$ccdomain,
                                            'requestcourses').
@@ -1175,7 +1316,7 @@ ENDAUTH
         } else {
             $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); 
         }
-        $r->print($portfolioform);
+        $r->print($portfolioform.$domroleform);
         if ($env{'form.action'} eq 'singlestudent') {
             $r->print(&date_sections_select($context,$newuser,$formname,
                                             $permission));
@@ -1190,7 +1331,6 @@ ENDAUTH
 				       );
 	$r->print(<<ENDCHANGEUSER);
 $start_page
-$crumbs
 $forminfo
 <h2>
 ENDCHANGEUSER
@@ -1210,10 +1350,10 @@ ENDCHANGEUSER
                                    $inst_results{$ccuname.':'.$ccdomain});
         $r->print($personal_table);
         if ($showforceid) {
-            $r->print(&Apache::lonuserutils::forceid_change($context));
+            $r->print('<table>'.&Apache::lonuserutils::forceid_change($context).'</table>');
         }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
-            $r->print('<h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
+            $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table());
             if ($env{'request.role.domain'} eq $ccdomain) {
                 $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
@@ -1224,12 +1364,19 @@ ENDCHANGEUSER
             $r->print(&Apache::loncommon::end_data_table());
         }
         $r->print('</div>');
-        my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);
-        my ($user_quota_text,$user_tools_text,$user_reqcrs_text);
+        my @order = ('auth','quota','tools','requestauthor');
+        my %user_text;
+        my ($isadv,$isauthor) = 
+            &Apache::lonnet::is_advanced_user($ccuname,$ccdomain);
+        if ((!$isauthor) && 
+            (&Apache::lonnet::allowed('cau',$env{'request.role.domain'}))) {
+            $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);
+        }
+        $user_text{'auth'} =  &user_authentication($ccuname,$ccdomain,$formname);
         if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
             (&Apache::lonnet::allowed('mut',$ccdomain))) {
             # Current user has quota modification privileges
-            $user_quota_text = &portfolio_quota($ccuname,$ccdomain);
+            $user_text{'quota'} = &portfolio_quota($ccuname,$ccdomain);
         }
         if (!&Apache::lonnet::allowed('mpq',$ccdomain)) {
             if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
@@ -1241,7 +1388,7 @@ ENDCHANGEUSER
                     'youd'  => "You do not have privileges to modify the portfolio quota for this user.",
                     'ichr'  => "If a change is required, contact a domain coordinator for the domain",
                 );
-                $user_quota_text = <<ENDNOPORTPRIV;
+                $user_text{'quota'} = <<ENDNOPORTPRIV;
 <h3>$lt{'dska'}</h3>
 $lt{'youd'} $lt{'ichr'}: $ccdomain
 ENDNOPORTPRIV
@@ -1251,46 +1398,34 @@ ENDNOPORTPRIV
             if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) {
                 my %lt=&Apache::lonlocal::texthash(
                     'utav'  => "User Tools Availability",
-                    'yodo'  => "You do not have privileges to modify Portfolio, Blog or Personal Information Page settings for this user.",
+                    'yodo'  => "You do not have privileges to modify Portfolio, Blog, WebDAV, or Personal Information Page settings for this user.",
                     'ifch'  => "If a change is required, contact a domain coordinator for the domain",
                 );
-                $user_tools_text = <<ENDNOTOOLSPRIV;
+                $user_text{'tools'} = <<ENDNOTOOLSPRIV;
 <h3>$lt{'utav'}</h3>
 $lt{'yodo'} $lt{'ifch'}: $ccdomain
 ENDNOTOOLSPRIV
             }
         }
-        if ($user_auth_text ne '') {
-            $r->print('<div class="LC_left_float">'.$user_auth_text);
-            if ($user_quota_text ne '') {
-                $r->print($user_quota_text);
-            }
-            if ($user_tools_text ne '') {
-                $r->print($user_tools_text);
-            }
-            if ($env{'form.action'} eq 'singlestudent') {
-                $r->print(&date_sections_select($context,$newuser,$formname));
-            }
-        } elsif ($user_quota_text ne '') {
-            $r->print('<div class="LC_left_float">'.$user_quota_text);
-            if ($user_tools_text ne '') {
-                $r->print($user_tools_text);
-            }
-            if ($env{'form.action'} eq 'singlestudent') {
-                $r->print(&date_sections_select($context,$newuser,$formname));
-            }
-        } elsif ($user_tools_text ne '') {
-            $r->print('<div class="LC_left_float">'.$user_tools_text);
-            if ($env{'form.action'} eq 'singlestudent') {
-                $r->print(&date_sections_select($context,$newuser,$formname));
-            }
-        } else {
-            if ($env{'form.action'} eq 'singlestudent') {
-                $r->print('<div class="LC_left_float">'.
-                          &date_sections_select($context,$newuser,$formname));
+        my $gotdiv = 0; 
+        foreach my $item (@order) {
+            if ($user_text{$item} ne '') {
+                unless ($gotdiv) {
+                    $r->print('<div class="LC_left_float">');
+                    $gotdiv = 1;
+                }
+                $r->print('<br />'.$user_text{$item});
             }
         }
-        $r->print('</div><div class="LC_clear_float_footer"></div>');
+        if ($env{'form.action'} eq 'singlestudent') {
+            unless ($gotdiv) {
+                $r->print('<div class="LC_left_float">');
+            }
+            $r->print(&date_sections_select($context,$newuser,$formname));
+        } 
+        if ($gotdiv) {
+            $r->print('</div><div class="LC_clear_float_footer"></div>');
+        }
         if ($env{'form.action'} ne 'singlestudent') {
             &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,
                                     $roledom,$crstype);
@@ -1311,7 +1446,7 @@ ENDNOTOOLSPRIV
             $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain);
         }
         if ($context eq 'domain') {
-            my $add_domainroles = &new_domain_roles($r);
+            my $add_domainroles = &new_domain_roles($r,$ccdomain);
             if (!$addrolesdisplay) {
                 $addrolesdisplay = $add_domainroles;
             }
@@ -1336,8 +1471,7 @@ ENDNOTOOLSPRIV
     }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
     $r->print('<input type="hidden" name="currstate" value="" />');
-    $r->print('<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />');
-    $r->print("</form>".&Apache::loncommon::end_page());
+    $r->print('<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" /></form>');
     return;
 }
 
@@ -1517,7 +1651,7 @@ sub display_existing_roles {
                 $allowed=1;
             }
             unless ($allowed) {
-                my $isowner = &is_courseowner($cid,$coursedata{'internal.courseowner'});
+                my $isowner = &Apache::lonuserutils::is_courseowner($cid,$coursedata{'internal.courseowner'});
                 if ($isowner) {
                     if (($role_code eq 'co') && ($class eq 'Community')) {
                         $allowed = 1;
@@ -1567,7 +1701,7 @@ sub display_existing_roles {
                     $allowed=1;
                 }
             }
-            if ($role_code eq 'ca' || $role_code eq 'au') {
+            if ($role_code eq 'ca' || $role_code eq 'au' || $role_code eq 'aa') {
                 $class='Construction Space';
             } elsif ($role_code eq 'su') {
                 $class='System';
@@ -1754,7 +1888,7 @@ sub new_coauthor_roles {
 }
 
 sub new_domain_roles {
-    my ($r) = @_;
+    my ($r,$ccdomain) = @_;
     my $addrolesdisplay = 0;
     #
     # Domain level
@@ -1772,6 +1906,7 @@ sub new_domain_roles {
     foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {
         foreach my $role (@allroles) {
             next if ($role eq 'ad');
+            next if (($role eq 'au') && ($ccdomain ne $thisdomain));
             if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
                my $plrole=&Apache::lonnet::plaintext($role);
                my %lt=&Apache::lonlocal::texthash(
@@ -2179,7 +2314,7 @@ sub get_inststatuses {
 
 # ================================================================= Phase Three
 sub update_user_data {
-    my ($r,$context,$crstype) = @_; 
+    my ($r,$context,$crstype,$brcrum) = @_; 
     my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $env{'form.ccdomain'});
     # Error messages
@@ -2204,36 +2339,39 @@ sub update_user_data {
                   '// ]]>'."\n".
                   '</script>'."\n";
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);
-    my $args;
-    if ($env{'form.popup'}) {
-        $args->{'no_nav_bar'} = 1;
-    } else {
-        $args = undef;
-    }
-    $r->print(&Apache::loncommon::start_page($title,$jscript,$args));
-    &Apache::lonhtmlcommon::add_breadcrumb
-       ({href=>"javascript:backPage(document.userupdate)",
-         text=>$breadcrumb_text{'search'},
-         faq=>282,bug=>'Instructor Interface',});
+    push (@{$brcrum},
+             {href => "javascript:backPage(document.userupdate)",
+              text => $breadcrumb_text{'search'},
+              faq  => 282,
+              bug  => 'Instructor Interface',}
+             );
     if ($env{'form.prevphase'} eq 'userpicked') {
-        &Apache::lonhtmlcommon::add_breadcrumb
-           ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')",
-             text=>$breadcrumb_text{'userpicked'},
-             faq=>282,bug=>'Instructor Interface',});
-    }
-    &Apache::lonhtmlcommon::add_breadcrumb
-       ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",
-         text=>$breadcrumb_text{'modify'},
-         faq=>282,bug=>'Instructor Interface',},
-        {href=>"/adm/createuser",
-         text=>"Result",
-         faq=>282,bug=>'Instructor Interface',});
+        push(@{$brcrum},
+               {href => "javascript:backPage(document.userupdate,'get_user_info','select')",
+                text => $breadcrumb_text{'userpicked'},
+                faq  => 282,
+                bug  => 'Instructor Interface',});
+    }
     my $helpitem = 'Course_Change_Privileges';
     if ($env{'form.action'} eq 'singlestudent') {
         $helpitem = 'Course_Add_Student';
     }
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                 $helpitem));
+    push(@{$brcrum}, 
+            {href => "javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",
+             text => $breadcrumb_text{'modify'},
+             faq  => 282,
+             bug  => 'Instructor Interface',},
+            {href => "/adm/createuser",
+             text => "Result",
+             faq  => 282,
+             bug  => 'Instructor Interface',
+             help => $helpitem});
+    my $args = {bread_crumbs          => $brcrum,
+                bread_crumbs_component => 'User Management'};
+    if ($env{'form.popup'}) {
+        $args->{'no_nav_bar'} = 1;
+    }
+    $r->print(&Apache::loncommon::start_page($title,$jscript,$args));
     $r->print(&update_result_form($uhome));
     # Check Inputs
     if (! $env{'form.ccuname'} ) {
@@ -2294,18 +2432,20 @@ sub update_user_data {
         # If they are creating a new user but have not specified login
         # information this will be caught below.
     } else {
-	    $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);    
-	    return;
+            $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);
+            return;
     }
 
     $r->print('<h3>'.&mt('User [_1] in domain [_2]',
-			 $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
-    $r->print('<p class="LC_info">'.&mt('Please be patient').'</p>');
+                        $env{'form.ccuname'}.' ('.&Apache::loncommon::plainname($env{'form.ccuname'},
+                        $env{'form.ccdomain'}).')', $env{'form.ccdomain'}).'</h3>');
+    my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,2);
 
     my (%alerts,%rulematch,%inst_results,%curr_rules);
     my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
-    my @usertools = ('aboutme','blog','portfolio');
+    my @usertools = ('aboutme','blog','webdav','portfolio');
     my @requestcourses = ('official','unofficial','community');
+    my @requestauthor = ('requestauthor');
     my ($othertitle,$usertypes,$types) = 
         &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
     my %canmodify_status =
@@ -2360,6 +2500,7 @@ sub update_user_data {
                 }
             }
         }
+        &Apache::lonhtmlcommon::Increment_PrgWin($r, \%prog_state);
 	# Call modifyuser
 	my $result = &Apache::lonnet::modifyuser
 	    ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cid'},
@@ -2402,6 +2543,12 @@ sub update_user_data {
                                                       \%changeHash,'requestcourses');
                     }
                 }
+                if ($env{'form.customrequestauthor'} == 1) {
+                    $newcustom{'requestauthor'} = $env{'form.requestauthor'};
+                    $changed{'requestauthor'} = &tool_admin('requestauthor',
+                                                    $newcustom{'requestauthor'},
+                                                    \%changeHash,'requestauthor');
+                }
             }
             if ($canmodify_status{'inststatus'}) {
                 if (exists($env{'form.inststatus'})) {
@@ -2443,9 +2590,8 @@ sub update_user_data {
 	    $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end);    
 	}
     }
-
     $r->rflush(); # Finish display of header before time consuming actions start
-
+    &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state);
     ##
     my (@userroles,%userupdate,$cnum,$cdom,%namechanged);
     if ($context eq 'course') {
@@ -2457,10 +2603,11 @@ sub update_user_data {
         my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation',
              'id','permanentemail','portfolioquota','inststatus','tools.aboutme',
-             'tools.blog','tools.portfolio','requestcourses.official',
-             'requestcourses.unofficial','requestcourses.community',
-             'reqcrsotherdom.official','reqcrsotherdom.unofficial',
-             'reqcrsotherdom.community'],
+             'tools.blog','tools.webdav','tools.portfolio',
+             'requestcourses.official','requestcourses.unofficial',
+             'requestcourses.community','reqcrsotherdom.official',
+             'reqcrsotherdom.unofficial','reqcrsotherdom.community',
+             'requestauthor'],
               $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) { 
@@ -2588,7 +2735,7 @@ sub update_user_data {
             $olddefquota,$oldsettingstatus,$newdefquota,$newsettingstatus);
         @disporder = ('inststatus');
         if ($env{'request.role.domain'} eq $env{'form.ccdomain'}) {
-            push(@disporder,'requestcourses');
+            push(@disporder,'requestcourses','requestauthor');
         } else {
             push(@disporder,'reqcrsotherdom');
         }
@@ -2612,6 +2759,9 @@ sub update_user_data {
         if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
             $canshow{'inststatus'} = 1;
         }
+        if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) {
+            $canshow{'requestauthor'} = 1;
+        }
         my (%changeHash,%changed);
         if ($oldinststatus eq '') {
             $oldsettings{'inststatus'} = $othertitle; 
@@ -2701,6 +2851,7 @@ sub update_user_data {
             if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
                 &tool_changes('requestcourses',\@requestcourses,\%oldsettings,\%oldsettingstext,
                               \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
+                &tool_changes('requestauthor',\@requestauthor,\%oldsettings,\%oldsettingstext,\%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
             } else {
                 &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,
                               \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
@@ -2728,13 +2879,22 @@ sub update_user_data {
                                 || ($key eq 'community')) {
                                 $newenvhash{'environment.requestcourses.'.$key} =
                                     $changeHash{'requestcourses.'.$key};
-                                if ($changeHash{'requestcourses.'.$key} ne '') {
+                                if ($changeHash{'requestcourses.'.$key}) {
                                     $newenvhash{'environment.canrequest.'.$key} = 1;
                                 } else {
                                     $newenvhash{'environment.canrequest.'.$key} =
           &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
                                             $key,'reload','requestcourses');
                                 }
+                            } elsif ($key eq 'requestauthor') {
+                                $newenvhash{'environment.'.$key} = $changeHash{$key};
+                                if ($changeHash{$key}) {
+                                    $newenvhash{'environment.canrequest.author'} = 1;
+                                } else {
+                                    $newenvhash{'environment.canrequest.author'} =
+          &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
+                                            $key,'reload','requestauthor');
+                                }
                             } elsif ($key ne 'quota') {
                                 $newenvhash{'environment.tools.'.$key} = 
                                     $changeHash{'tools.'.$key};
@@ -2743,7 +2903,8 @@ sub update_user_data {
                                         $changeHash{'tools.'.$key};
                                 } else {
                                     $newenvhash{'environment.availabletools.'.$key} =
-          &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},                                            $key,'reload','tools');
+          &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
+          $key,'reload','tools');
                                 }
                             }
                         }
@@ -2776,7 +2937,7 @@ sub update_user_data {
                 ((keys(%changed) > 0) && $chgresult eq 'ok')) {
             # Tell the user we changed the name
                 &display_userinfo($r,1,\@disporder,\%canshow,\@requestcourses,
-                                  \@usertools,\%userenv,\%changed,\%namechanged,
+                                  \@usertools,\@requestauthor,\%userenv,\%changed,\%namechanged,
                                   \%oldsettings, \%oldsettingstext,\%newsettings,
                                   \%newsettingstext);
                 if ($env{'form.cid'} ne $userenv{'id'}) {
@@ -2809,7 +2970,7 @@ sub update_user_data {
             # or ability to request creation of courses, 
             # but we can still tell them what the name and quota and availabilities are  
             &display_userinfo($r,undef,\@disporder,\%canshow,\@requestcourses,
-                              \@usertools,\%userenv,\%changed,\%namechanged,\%oldsettings,
+                              \@usertools,\@requestauthor,\%userenv,\%changed,\%namechanged,\%oldsettings,
                               \%oldsettingstext,\%newsettings,\%newsettingstext);
         }
         if (@mod_disallowed) {
@@ -2846,6 +3007,7 @@ sub update_user_data {
                   .&Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules)
                   .'</span>');
     }
+    &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype);
         $r->print('<p><a href="javascript:backPage(document.userupdate)">');
@@ -2877,22 +3039,21 @@ sub update_user_data {
         if ($env{'form.popup'}) {
             $r->print('<p><a href="javascript:window.close()">'.&mt('Close window').'</a></p>');
         } else {
-            $r->print('<p><a href="javascript:backPage(document.userupdate,'."'$env{'form.prevphase'}','modify'".')">'
-                     .&mt('Modify this user: [_1]','<span class="LC_cusr_emph">'.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')</span>').'</a>'
-                     .('&nbsp;'x5).'<a href="javascript:backPage(document.userupdate)">'
-                     .&mt('Create/Modify Another User').'</a></p>');
+            $r->print('<br />'.&Apache::lonhtmlcommon::actionbox(['<a href="javascript:backPage(document.userupdate,'."'$env{'form.prevphase'}','modify'".')">'
+                     .&mt('Modify this user: [_1]','<span class="LC_cusr_emph">'.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')</span>').'</a>',
+                     '<a href="javascript:backPage(document.userupdate)">'.&mt('Create/Modify Another User').'</a>']));
         }
     }
-    $r->print(&Apache::loncommon::end_page());
 }
 
 sub display_userinfo {
-    my ($r,$changed,$order,$canshow,$requestcourses,$usertools,$userenv,
-        $changedhash,$namechangedhash,$oldsetting,$oldsettingtext,
+    my ($r,$changed,$order,$canshow,$requestcourses,$usertools,$requestauthor,
+        $userenv,$changedhash,$namechangedhash,$oldsetting,$oldsettingtext,
         $newsetting,$newsettingtext) = @_;
     return unless (ref($order) eq 'ARRAY' &&
                    ref($canshow) eq 'HASH' && 
                    ref($requestcourses) eq 'ARRAY' && 
+                   ref($requestauthor) eq 'ARRAY' &&
                    ref($usertools) eq 'ARRAY' && 
                    ref($userenv) eq 'HASH' &&
                    ref($changedhash) eq 'HASH' &&
@@ -2901,7 +3062,7 @@ sub display_userinfo {
                    ref($newsetting) eq 'HASH' &&
                    ref($newsettingtext) eq 'HASH');
     my %lt=&Apache::lonlocal::texthash(
-         'ui'             => 'User Information (unchanged)',
+         'ui'             => 'User Information',
          'uic'            => 'User Information Changed',
          'firstname'      => 'First Name',
          'middlename'     => 'Middle Name',
@@ -2911,82 +3072,48 @@ sub display_userinfo {
          'permanentemail' => 'Permanent e-mail address',
          'quota'          => 'Disk space allocated to portfolio files',
          'blog'           => 'Blog Availability',
+         'webdav'         => 'WebDAV Availability',
          'aboutme'        => 'Personal Information Page Availability',
          'portfolio'      => 'Portfolio Availability',
          'official'       => 'Can Request Official Courses',
          'unofficial'     => 'Can Request Unofficial Courses',
          'community'      => 'Can Request Communities',
+         'requestauthor'  => 'Can Request Author Role',
          'inststatus'     => "Affiliation",
          'prvs'           => 'Previous Value:',
          'chto'           => 'Changed To:'
     );
-    my $title = $lt{'ui'}; 
-    if ($changed) {
-        $title = $lt{'uic'};
-    }
-    $r->print('<h4>'.$title.'</h4>'.
-              &Apache::loncommon::start_data_table().
-              &Apache::loncommon::start_data_table_header_row());
     if ($changed) {
+        $r->print('<h3>'.$lt{'uic'}.'</h3>'.
+                &Apache::loncommon::start_data_table().
+                &Apache::loncommon::start_data_table_header_row());
         $r->print("<th>&nbsp;</th>\n");
-    }
-    my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
-    foreach my $item (@userinfo) {
-        $r->print("<th>$lt{$item}</th>\n");
-    }
-    foreach my $entry (@{$order}) {
-        if ($canshow->{$entry}) {
-            if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {
-                foreach my $item (@{$requestcourses}) {
-                    $r->print("<th>$lt{$item}</th>\n");
-                }
-            } elsif ($entry eq 'tools') {
-                foreach my $item (@{$usertools}) {
-                    $r->print("<th>$lt{$item}</th>\n");
-                }
-            } else {
-                $r->print("<th>$lt{$entry}</th>\n");
-            }
-        }
-    }
-    $r->print(&Apache::loncommon::end_data_table_header_row().
-             &Apache::loncommon::start_data_table_row());
-    if ($changed) {
-        $r->print('<td><b>'.$lt{'prvs'}.'</b></td>'."\n");
-    }
-    foreach my $item (@userinfo) {
-        $r->print('<td>'.$userenv->{$item}.' </td>'."\n");
-    }
-    foreach my $entry (@{$order}) {
-        if ($canshow->{$entry}) {
-            if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {
-                foreach my $item (@{$requestcourses}) {
-                    $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");
-                }
-            } elsif ($entry eq 'tools') {
-                foreach my $item (@{$usertools}) {
-                    $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");
-                }
-            } else {
-                $r->print("<td>$oldsetting->{$entry} $oldsettingtext->{$entry} </td>\n");
-            }
-        }
-    }
-    $r->print(&Apache::loncommon::end_data_table_row());
-    if ($changed) {
-        $r->print(&Apache::loncommon::start_data_table_row().
-                  '<td><span class="LC_nobreak"><b>'.$lt{'chto'}.'</b></span></td>'."\n");
+        $r->print('<th><b>'.$lt{'prvs'}.'</b></th>');
+        $r->print('<th><span class="LC_nobreak"><b>'.$lt{'chto'}.'</b></span></th>');
+        $r->print(&Apache::loncommon::end_data_table_header_row());
+        my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
+        
+
         foreach my $item (@userinfo) {
             my $value = $env{'form.c'.$item};
-            if ($namechangedhash->{$item}) {
-                $value = '<span class="LC_cusr_emph">'.$value.'</span>';
+            #show changes only:
+            unless($value eq $userenv->{$item}){
+                $r->print(&Apache::loncommon::start_data_table_row());
+
+                $r->print("<td>$lt{$item}</td>\n");
+                $r->print('<td>'.$userenv->{$item}.' </td>');
+                $r->print("<td>$value </td>\n");
+
+                $r->print(&Apache::loncommon::end_data_table_row());
             }
-            $r->print("<td>$value </td>\n");
         }
         foreach my $entry (@{$order}) {
-            if ($canshow->{$entry}) {
+            if ($canshow->{$entry} && ($newsetting->{$entry} ne $newsetting->{$entry})) {
+                $r->print(&Apache::loncommon::start_data_table_row());
                 if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {
                     foreach my $item (@{$requestcourses}) {
+                        $r->print("<td>$lt{$item}</td>\n");
+                        $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");
                         my $value = $newsetting->{$item}.' '.$newsettingtext->{$item};
                         if ($changedhash->{$item}) {
                             $value = '<span class="LC_cusr_emph">'.$value.'</span>';
@@ -2995,6 +3122,8 @@ sub display_userinfo {
                     }
                 } elsif ($entry eq 'tools') {
                     foreach my $item (@{$usertools}) {
+                        $r->print("<td>$lt{$item}</td>\n");
+                        $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");
                         my $value = $newsetting->{$item}.' '.$newsettingtext->{$item};
                         if ($changedhash->{$item}) {
                             $value = '<span class="LC_cusr_emph">'.$value.'</span>';
@@ -3002,17 +3131,22 @@ sub display_userinfo {
                         $r->print("<td>$value </td>\n");
                     }
                 } else {
+                    $r->print("<td>$lt{$entry}</td>\n");
+                    $r->print("<td>$oldsetting->{$entry} $oldsettingtext->{$entry} </td>\n");
                     my $value = $newsetting->{$entry}.' '.$newsettingtext->{$entry};
                     if ($changedhash->{$entry}) {
                         $value = '<span class="LC_cusr_emph">'.$value.'</span>';
                     }
                     $r->print("<td>$value </td>\n");
                 }
+                $r->print(&Apache::loncommon::end_data_table_row());
             }
         }
-        $r->print(&Apache::loncommon::end_data_table_row());
+        $r->print(&Apache::loncommon::end_data_table().'<br />');
+    } else {
+        $r->print('<h3>'.$lt{'ui'}.'</h3>'.
+                  '<p>'.&mt('No changes made to user information').'</p>');
     }
-    $r->print(&Apache::loncommon::end_data_table().'<br />');
     return;
 }
 
@@ -3111,25 +3245,29 @@ sub tool_changes {
         return;
     }
     foreach my $tool (@{$usertools}) {
-        my $newval;
+        my ($newval,$envkey);
+        $envkey = $context.'.'.$tool;
         if ($context eq 'requestcourses') {
             $newval = $env{'form.crsreq_'.$tool};
             if ($newval eq 'autolimit') {
                 $newval .= '='.$env{'form.crsreq_'.$tool.'_limit'};
             }
+        } elsif ($context eq 'requestauthor') {
+            $newval = $env{'form.'.$context};
+            $envkey = $context;
         } else {
             $newval = $env{'form.'.$context.'_'.$tool};
         }
-        if ($userenv->{$context.'.'.$tool} ne '') {
+        if ($userenv->{$envkey} ne '') {
             $oldaccess->{$tool} = &mt('custom');
-            if ($userenv->{$context.'.'.$tool}) {
+            if ($userenv->{$envkey}) {
                 $oldaccesstext->{$tool} = &mt("availability set to 'on'");
             } else {
                 $oldaccesstext->{$tool} = &mt("availability set to 'off'");
             }
-            $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
+            $changeHash->{$envkey} = $userenv->{$envkey};
             if ($env{'form.custom'.$tool} == 1) {
-                if ($newval ne $userenv->{$context.'.'.$tool}) {
+                if ($newval ne $userenv->{$envkey}) {
                     $changed->{$tool} = &tool_admin($tool,$newval,$changeHash,
                                                     $context);
                     if ($changed->{$tool}) {
@@ -3205,14 +3343,20 @@ sub update_roles {
 		    &Apache::lonnet::revokerole($env{'form.ccdomain'},
 						$env{'form.ccuname'},
 						$scope,$role,'','',$context);
-	        $r->print(&mt('Revoking [_1] in [_2]: [_3]',
-			      $role,$scope,'<b>'.$result.'</b>').'<br />');
+                $r->print(&Apache::lonhtmlcommon::confirm_success(
+                            &mt('Revoking [_1] in [_2]',
+                                &Apache::lonnet::plaintext($role),
+                                &Apache::loncommon::show_role_extent($scope,$context,$role)),
+                                $result ne "ok").'<br />');
+                if ($result ne "ok") {
+                    $r->print(&mt('Error: [_1]',$result).'<br />');
+                }
 		if ($role eq 'st') {
 		    my $result = 
                         &Apache::lonuserutils::classlist_drop($scope,
                             $env{'form.ccuname'},$env{'form.ccdomain'},
 			    $now);
-		    $r->print($result);
+                    $r->print(&Apache::lonhtmlcommon::confirm_success($result));
 		}
                 if (!grep(/^\Q$role\E$/,@rolechanges)) {
                     push(@rolechanges,$role);
@@ -3220,11 +3364,15 @@ sub update_roles {
 	    }
 	    if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {
 # Revoke custom role
-		$r->print(&mt('Revoking custom role:').
-                      ' '.$4.' by '.$3.':'.$2.' in '.$1.': <b>'.
-                      &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
-				  $env{'form.ccuname'},$1,$2,$3,$4,'','',$context).
-		'</b><br />');
+                my $result = &Apache::lonnet::revokecustomrole(
+                    $env{'form.ccdomain'},$env{'form.ccuname'},$1,$2,$3,$4,'','',$context);
+                $r->print(&Apache::lonhtmlcommon::confirm_success(
+                            &mt('Revoking custom role [_1] by [_2] in [_3]',
+                                $4,$3.':'.$2,&Apache::loncommon::show_role_extent($1,$context,'cr')),
+                            $result ne 'ok').'<br />');
+                if ($result ne "ok") {
+                    $r->print(&mt('Error: [_1]',$result).'<br />');
+                }
                 if (!grep(/^cr$/,@rolechanges)) {
                     push(@rolechanges,'cr');
                 }
@@ -3238,14 +3386,21 @@ sub update_roles {
 						$env{'form.ccuname'},
 						$scope,$role,$now,0,1,'',
                                                 $context);
-	        $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
-			      '<b>'.$result.'</b>').'<br />');
+                $r->print(&Apache::lonhtmlcommon::confirm_success(
+                            &mt('Deleting [_1] in [_2]',
+                                &Apache::lonnet::plaintext($role),
+                                &Apache::loncommon::show_role_extent($scope,$context,$role)),
+                            $result ne 'ok').'<br />');
+                if ($result ne "ok") {
+                    $r->print(&mt('Error: [_1]',$result).'<br />');
+                }
+
 		if ($role eq 'st') {
 		    my $result = 
                         &Apache::lonuserutils::classlist_drop($scope,
                             $env{'form.ccuname'},$env{'form.ccdomain'},
 			    $now);
-		    $r->print($result);
+		    $r->print(&Apache::lonhtmlcommon::confirm_success($result));
 		}
                 if (!grep(/^\Q$role\E$/,@rolechanges)) {
                     push(@rolechanges,$role);
@@ -3254,11 +3409,17 @@ 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] 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 />');
+                my $result =
+                    &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
+                        $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
+                        0,1,$context);
+                $r->print(&Apache::lonhtmlcommon::confirm_success(&mt('Deleting custom role [_1] by [_2] in [_3]',
+                      $rolename,$rnam.':'.$rdom,&Apache::loncommon::show_role_extent($1,$context,'cr')),
+                      $result ne "ok").'<br />');
+                if ($result ne "ok") {
+                    $r->print(&mt('Error: [_1]',$result).'<br />');
+                }
+
                 if (!grep(/^cr$/,@rolechanges)) {
                     push(@rolechanges,'cr');
                 }
@@ -3279,22 +3440,26 @@ sub update_roles {
                             if ($result eq 'refused' && $logmsg) {
                                 $output = $logmsg;
                             } else { 
-                                $output = "Error: $result\n";
+                                $output = &mt('Error: [_1]',$result)."\n";
                             }
                         } else {
-                            $output = &mt('Assigning').' '.$role.' in '.$url.
-                                      &mt('starting').' '.localtime($now).
-                                      ': <br />'.$logmsg.'<br />'.
-                                      &mt('Add to classlist').': <b>ok</b><br />';
+                            $output = &Apache::lonhtmlcommon::confirm_success(&mt('Assigning [_1] in [_2] starting [_3]',
+                                        &Apache::lonnet::plaintext($role),
+                                        &Apache::loncommon::show_role_extent($url,$context,'st'),
+                                        &Apache::lonlocal::locallocaltime($now))).'<br />'.$logmsg.'<br />';
                         }
                     }
                 } else {
 		    my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                $env{'form.ccuname'},$url,$role,0,$now,'','',
                                $context);
-		    $output = &mt('Re-enabling [_1] in [_2]: [_3]',
-			      $role,$url,'<b>'.$result.'</b>').'<br />';
-		}
+                        $output = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling [_1] in [_2]',
+                                        &Apache::lonnet::plaintext($role),
+                                        &Apache::loncommon::show_role_extent($url,$context,$role)),$result ne "ok").'<br />';
+                    if ($result ne "ok") {
+                        $output .= &mt('Error: [_1]',$result).'<br />';
+                    }
+                }
                 $r->print($output);
                 if (!grep(/^\Q$role\E$/,@rolechanges)) {
                     push(@rolechanges,$role);
@@ -3306,8 +3471,13 @@ 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] in [_3]: [_4]',
-                          $rolename,$rnam.':'.$rdom,$url,'<b>'.$result.'</b>').'<br />');
+                $r->print(&Apache::lonhtmlcommon::confirm_success(
+                    &mt('Re-enabling custom role [_1] by [_2] in [_3]',
+                        $rolename,$rnam.':'.$rdom,&Apache::loncommon::show_role_extent($1,$context,'cr')),
+                    $result ne "ok").'<br />');
+                if ($result ne "ok") {
+                    $r->print(&mt('Error: [_1]',$result).'<br />');
+                }
                 if (!grep(/^cr$/,@rolechanges)) {
                     push(@rolechanges,'cr');
                 }
@@ -3447,7 +3617,7 @@ sub update_roles {
 # Flush the course logs so reverse user roles immediately updated
     $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
     if (@rolechanges == 0) {
-        $r->print(&mt('No roles to modify'));
+        $r->print('<p>'.&mt('No roles to modify').'</p>');
     }
     return @rolechanges;
 }
@@ -3527,7 +3697,7 @@ sub get_defaultquota_text {
 sub update_result_form {
     my ($uhome) = @_;
     my $outcome = 
-    '<form name="userupdate" method="post" />'."\n";
+    '<form name="userupdate" method="post" action="">'."\n";
     foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') {
         $outcome .= '<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n";
     }
@@ -3573,6 +3743,10 @@ sub tool_admin {
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $canchange = 1;
         }
+    } elsif ($context eq 'requestauthor') {
+        if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) {
+            $canchange = 1;
+        }
     } elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
         # Current user has quota modification privileges
         $canchange = 1;
@@ -3581,7 +3755,11 @@ sub tool_admin {
     if ($canchange) {
         if (ref($changeHash) eq 'HASH') {
             $toolchanged = 1;
-            $changeHash->{$context.'.'.$tool} = $settool;
+            if ($tool eq 'requestauthor') {
+                $changeHash->{$context} = $settool;
+            } else {
+                $changeHash->{$context.'.'.$tool} = $settool;
+            }
         }
     }
     return $toolchanged;
@@ -3623,7 +3801,7 @@ sub build_roles {
 # ========================================================== Custom Role Editor
 
 sub custom_role_editor {
-    my ($r) = @_;
+    my ($r,$brcrum) = @_;
     my $action = $env{'form.customroleaction'};
     my $rolename; 
     if ($action eq 'new') {
@@ -3632,11 +3810,6 @@ sub custom_role_editor {
         $rolename=$env{'form.rolename'};
     }
 
-    $rolename=~s/[^A-Za-z0-9]//gs;
-    if (!$rolename || $env{'form.phase'} eq 'pickrole') {
-	&print_username_entry_form($r);
-        return;
-    }
     my ($crstype,$context);
     if ($env{'request.course.id'}) {
         $crstype = &Apache::loncommon::course_type();
@@ -3645,6 +3818,13 @@ sub custom_role_editor {
         $context = 'domain';
         $crstype = $env{'form.templatecrstype'};
     }
+
+    $rolename=~s/[^A-Za-z0-9]//gs;
+    if (!$rolename || $env{'form.phase'} eq 'pickrole') {
+	&print_username_entry_form($r,undef,undef,undef,undef,$crstype,$brcrum);
+        return;
+    }
+
 # ------------------------------------------------------- What can be assigned?
     my %full=();
     my %courselevel=();
@@ -3752,25 +3932,28 @@ sub custom_role_editor {
     $head_script .= "\n".$jsback."\n"
                    .'// ]]>'."\n"
                    .'</script>'."\n";
-    $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
-   &Apache::lonhtmlcommon::add_breadcrumb
-     ({href=>"javascript:backPage(document.form1,'pickrole','')",
-       text=>"Pick custom role",
-       faq=>282,bug=>'Instructor Interface',},
-      {href=>"javascript:backPage(document.form1,'','')",
-         text=>"Edit custom role",
-         faq=>282,bug=>'Instructor Interface',});
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                  'Course_Editing_Custom_Roles'));
-
-    $r->print($body_top);
+    push (@{$brcrum},
+              {href => "javascript:backPage(document.form1,'pickrole','')",
+               text => "Pick custom role",
+               faq  => 282,bug=>'Instructor Interface',},
+              {href => "javascript:backPage(document.form1,'','')",
+               text => "Edit custom role",
+               faq  => 282,
+               bug  => 'Instructor Interface',
+               help => 'Course_Editing_Custom_Roles'}
+              );
+    my $args = { bread_crumbs          => $brcrum,
+                 bread_crumbs_component => 'User Management'};
+ 
+    $r->print(&Apache::loncommon::start_page('Custom Role Editor',
+                                             $head_script,$args).
+              $body_top);
     my %lt=&Apache::lonlocal::texthash(
 		    'prv'  => "Privilege",
 		    'crl'  => "Course Level",
                     'dml'  => "Domain Level",
                     'ssl'  => "System Level");
 
-
     $r->print('<div class="LC_left_float">'
              .'<form action=""><fieldset>'
              .'<legend>'.&mt('Select a Template').'</legend>'
@@ -3821,8 +4004,7 @@ ENDCCF
    '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.
    '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".   
    '<input type="reset" value="'.&mt("Reset").'" />'."\n".
-   '<input type="submit" value="'.&mt('Save').'" /></form>'.
-	      &Apache::loncommon::end_page());
+   '<input type="submit" value="'.&mt('Save').'" /></form>');
 }
 # --------------------------------------------------------
 sub make_script_template {
@@ -3900,11 +4082,11 @@ sub make_button_code {
 }
 # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {
-    my ($r,$context) = @_;
+    my ($r,$context,$brcrum) = @_;
     my $rolename=$env{'form.rolename'};
     $rolename=~s/[^A-Za-z0-9]//gs;
     if (!$rolename) {
-	&custom_role_editor($r);
+	&custom_role_editor($r,$brcrum);
         return;
     }
     my ($jsback,$elements) = &crumb_utilities();
@@ -3913,20 +4095,24 @@ sub set_custom_role {
                  .$jsback."\n"
                  .'// ]]>'."\n"
                  .'</script>'."\n";
-
-    $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
-    &Apache::lonhtmlcommon::add_breadcrumb
-        ({href=>"javascript:backPage(document.customresult,'pickrole','')",
-          text=>"Pick custom role",
-          faq=>282,bug=>'Instructor Interface',},
-         {href=>"javascript:backPage(document.customresult,'selected_custom_edit','')",
-          text=>"Edit custom role",
-          faq=>282,bug=>'Instructor Interface',},
-         {href=>"javascript:backPage(document.customresult,'set_custom_roles','')",
-          text=>"Result",
-          faq=>282,bug=>'Instructor Interface',});
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
-                                                  'Course_Editing_Custom_Roles'));
+    push(@{$brcrum},
+        {href => "javascript:backPage(document.customresult,'pickrole','')",
+         text => "Pick custom role",
+         faq  => 282,
+         bug  => 'Instructor Interface',},
+        {href => "javascript:backPage(document.customresult,'selected_custom_edit','')",
+         text => "Edit custom role",
+         faq  => 282,
+         bug  => 'Instructor Interface',},
+        {href => "javascript:backPage(document.customresult,'set_custom_roles','')",
+         text => "Result",
+         faq  => 282,
+         bug  => 'Instructor Interface',
+         help => 'Course_Editing_Custom_Roles'},
+        );
+    my $args = { bread_crumbs           => $brcrum,
+                 bread_crumbs_component => 'User Management'}; 
+    $r->print(&Apache::loncommon::start_page('Save Custom Role',$jscript,$args));
 
     my ($rdummy,$roledef)=
 	&Apache::lonnet::get('roles',["rolesdef_$rolename"]);
@@ -3983,7 +4169,6 @@ sub set_custom_role {
     }
     $r->print('<p><a href="javascript:backPage(document.customresult,'."'pickrole'".')">'.&mt('Create or edit another custom role').'</a></p><form name="customresult" method="post">');
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'</form>');
-    $r->print(&Apache::loncommon::end_page());
 }
 
 # ================================================================ Main Handler
@@ -4007,17 +4192,24 @@ sub handler {
         ['action','state','callingform','roletype','showrole','bulkaction','popup','phase',
          'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();
+    my $args;
+    my $brcrum = [];
+    my $bread_crumbs_component = 'User Management';
     if ($env{'form.action'} ne 'dateselect') {
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>"/adm/createuser",
-              text=>"User Management",
-              help=>'Course_Create_Class_List,Course_Change_Privileges,Course_View_Class_List,Course_Editing_Custom_Roles,Course_Add_Student,Course_Drop_Student,Course_Automated_Enrollment,Course_Self_Enrollment,Course_Manage_Group'});
+        $brcrum = [{href=>"/adm/createuser",
+                    text=>"User Management",
+                    help=>'Course_Create_Class_List,Course_Change_Privileges,Course_View_Class_List,Course_Editing_Custom_Roles,Course_Add_Student,Course_Drop_Student,Course_Automated_Enrollment,Course_Self_Enrollment,Course_Manage_Group'}
+                  ];
     }
     #SD Following files not added to help, because the corresponding .tex-files seem to
     #be missing: Course_Approve_Selfenroll,Course_User_Logs,
     my ($permission,$allowed) = 
         &Apache::lonuserutils::get_permission($context,$crstype);
     if (!$allowed) {
+        if ($context eq 'course') {
+            $r->internal_redirect('/adm/viewclasslist');
+            return OK;
+        }
         $env{'user.error.msg'}=
             "/adm/createuser:cst:0:0:Cannot create/modify user data ".
                                  "or view user status.";
@@ -4029,17 +4221,20 @@ sub handler {
 
     # Main switch on form.action and form.state, as appropriate
     if (! exists($env{'form.action'})) {
-        $r->print(&header());
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
+        $args = {bread_crumbs => $brcrum,
+                 bread_crumbs_component => $bread_crumbs_component}; 
+        $r->print(&header(undef,$args));
         $r->print(&print_main_menu($permission,$context,$crstype));
-        $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
-        $r->print(&header());
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=upload&state=',
-              text=>"Upload Users List"});
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List',
-                                                   'Course_Create_Class_List'));
+        push(@{$brcrum},
+              { href => '/adm/createuser?action=upload&state=',
+                text => 'Upload Users List',
+                help => 'Course_Create_Class_List',
+              });
+        $bread_crumbs_component = 'Upload Users List';
+        $args = {bread_crumbs           => $brcrum,
+                 bread_crumbs_component => $bread_crumbs_component};
+        $r->print(&header(undef,$args));
         $r->print('<form name="studentform" method="post" '.
                   'enctype="multipart/form-data" '.
                   ' action="/adm/createuser">'."\n");
@@ -4055,7 +4250,6 @@ sub handler {
         } else {
             &Apache::lonuserutils::print_first_users_upload_form($r,$context);
         }
-        $r->print('</form>'.&Apache::loncommon::end_page());
     } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'}
              eq 'singlestudent')) && ($permission->{'cusr'})) {
         my $phase = $env{'form.phase'};
@@ -4070,15 +4264,19 @@ sub handler {
             if ($env{'form.phase'} eq 'createnewuser') {
                 my $response;
                 if ($env{'form.srchterm'} !~ /^$match_username$/) {
-                    my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
+                    my $response =
+                        '<span class="LC_warning">'
+                       .&mt('You must specify a valid username. Only the following are allowed:'
+                           .' letters numbers - . @')
+                       .'</span>';
                     $env{'form.phase'} = '';
-                    &print_username_entry_form($r,$context,$response,$srch,undef,$crstype);
+                    &print_username_entry_form($r,$context,$response,$srch,undef,$crstype,$brcrum);
                 } else {
                     my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
                     my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
                     &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,
-                                                  $permission,$crstype);
+                                                  $permission,$crstype,$brcrum);
                 }
             } elsif ($env{'form.phase'} eq 'get_user_info') {
                 my ($currstate,$response,$forcenewuser,$results) = 
@@ -4088,7 +4286,8 @@ sub handler {
                 }
                 if ($currstate eq 'select') {
                     &print_user_selection_page($r,$response,$srch,$results,
-                                               \@search,$context,undef,$crstype);
+                                               \@search,$context,undef,$crstype,
+                                               $brcrum);
                 } elsif ($currstate eq 'modify') {
                     my ($ccuname,$ccdomain);
                     if (($srch->{'srchby'} eq 'uname') && 
@@ -4106,58 +4305,91 @@ sub handler {
                     }
                     &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,
-                                                  $permission,$crstype);
+                                                  $permission,$crstype,$brcrum);
                 } elsif ($currstate eq 'query') {
-                    &print_user_query_page($r,'createuser');
+                    &print_user_query_page($r,'createuser',$brcrum);
                 } else {
                     $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,
-                                               $forcenewuser,$crstype);
+                                               $forcenewuser,$crstype,$brcrum);
                 }
             } elsif ($env{'form.phase'} eq 'userpicked') {
                 my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
                 my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
                 &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
-                                              $context,$permission,$crstype);
+                                              $context,$permission,$crstype,
+                                              $brcrum);
             }
         } elsif ($env{'form.phase'} eq 'update_user_data') {
-            &update_user_data($r,$context,$crstype);
+            &update_user_data($r,$context,$crstype,$brcrum);
         } else {
-            &print_username_entry_form($r,$context,undef,$srch,undef,$crstype);
+            &print_username_entry_form($r,$context,undef,$srch,undef,$crstype,
+                                       $brcrum);
         }
     } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
         if ($env{'form.phase'} eq 'set_custom_roles') {
-            &set_custom_role($r,$context);
+            &set_custom_role($r,$context,$brcrum);
         } else {
-            &custom_role_editor($r);
+            &custom_role_editor($r,$brcrum);
+        }
+    } elsif (($env{'form.action'} eq 'processauthorreq') &&
+             ($permission->{'cusr'}) && 
+             (&Apache::lonnet::allowed('cau',$env{'request.role.domain'}))) {
+        push(@{$brcrum},
+                 {href => '/adm/createuser?action=processauthorreq',
+                  text => 'Authoring space requests',
+                  help => 'Domain_Role_Approvals'});
+        $bread_crumbs_component = 'Authoring requests';
+        if ($env{'form.state'} eq 'done') {
+            push(@{$brcrum},
+                     {href => '/adm/createuser?action=authorreqqueue',
+                      text => 'Result',
+                      help => 'Domain_Role_Approvals'});
+            $bread_crumbs_component = 'Authoring request result';
+        }
+        $args = { bread_crumbs           => $brcrum,
+                  bread_crumbs_component => $bread_crumbs_component};
+        $r->print(&header(undef,$args));
+        if (!exists($env{'form.state'})) {
+            $r->print(&Apache::loncoursequeueadmin::display_queued_requests('requestauthor',
+                                                                            $env{'request.role.domain'}));
+        } elsif ($env{'form.state'} eq 'done') {
+            $r->print('<h3>'.&mt('Authoring request processing').'</h3>'."\n");
+            $r->print(&Apache::loncoursequeueadmin::update_request_queue('requestauthor',
+                                                                         $env{'request.role.domain'}));
         }
     } elsif (($env{'form.action'} eq 'listusers') && 
              ($permission->{'view'} || $permission->{'cusr'})) {
         if ($env{'form.phase'} eq 'bulkchange') {
-            &Apache::lonhtmlcommon::add_breadcrumb
-                ({href=>'/adm/createuser?action=listusers',
-                  text=>"List Users"},
-                {href=>"/adm/createuser",
-                  text=>"Result"});
+            push(@{$brcrum},
+                    {href => '/adm/createuser?action=listusers',
+                     text => "List Users"},
+                    {href => "/adm/createuser",
+                     text => "Result",
+                     help => 'Course_View_Class_List'});
+            $bread_crumbs_component = 'Update Users';
+            $args = {bread_crumbs           => $brcrum,
+                     bread_crumbs_component => $bread_crumbs_component};
+            $r->print(&header(undef,$args));
             my $setting = $env{'form.roletype'};
             my $choice = $env{'form.bulkaction'};
-            $r->print(&header());
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users",
-                                                          'Course_View_Class_List'));
             if ($permission->{'cusr'}) {
                 &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice,$crstype);
-                $r->print(&Apache::loncommon::end_page());
             } else {
                 $r->print(&mt('You are not authorized to make bulk changes to user roles'));
                 $r->print('<p><a href="/adm/createuser?action=listusers">'.&mt('Display User Lists').'</a>');
-                $r->print(&Apache::loncommon::end_page());
             }
         } else {
-            &Apache::lonhtmlcommon::add_breadcrumb
-                ({href=>'/adm/createuser?action=listusers',
-                  text=>"List Users"});
+            push(@{$brcrum},
+                    {href => '/adm/createuser?action=listusers',
+                     text => "List Users",
+                     help => 'Course_View_Class_List'});
+            $bread_crumbs_component = 'List Users';
+            $args = {bread_crumbs           => $brcrum,
+                     bread_crumbs_component => $bread_crumbs_component};
             my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
             my $formname = 'studentform';
+            my $hidecall = "hide_searching();";
             if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') ||
                 ($env{'form.roletype'} eq 'community'))) {
                 if ($env{'form.roletype'} eq 'course') {
@@ -4174,132 +4406,143 @@ sub handler {
                                    );
                     $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements);
                 }
-                $jscript .= &verify_user_display();
+                $jscript .= &verify_user_display($context)."\n".
+                            &Apache::loncommon::check_uncheck_jscript();
                 my $js = &add_script($jscript).$cb_jscript;
                 my $loadcode = 
                     &Apache::lonuserutils::course_selector_loadcode($formname);
                 if ($loadcode ne '') {
-                    $r->print(&header($js,{'onload' => $loadcode,}));
+                    $args->{add_entries} = {onload => "$loadcode;$hidecall"};
                 } else {
-                    $r->print(&header($js));
+                    $args->{add_entries} = {onload => $hidecall};
                 }
+                $r->print(&header($js,$args));
             } else {
-                $r->print(&header(&add_script(&verify_user_display())));
+                $args->{add_entries} = {onload => $hidecall};
+                $jscript = &verify_user_display($context).
+                           &Apache::loncommon::check_uncheck_jscript(); 
+                $r->print(&header(&add_script($jscript),$args));
             }
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
-                                                          'Course_View_Class_List'));
             &Apache::lonuserutils::print_userlist($r,undef,$permission,$context,
                          $formname,$totcodes,$codetitles,$idlist,$idlist_titles);
-            $r->print(&Apache::loncommon::end_page());
         }
     } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
-        $r->print(&header());
         my $brtext;
         if ($crstype eq 'Community') {
             $brtext = 'Drop Members';
         } else {
             $brtext = 'Drop Students';
         }
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=drop',
-              text=>$brtext});
+        push(@{$brcrum},
+                {href => '/adm/createuser?action=drop',
+                 text => $brtext,
+                 help => 'Course_Drop_Student'});
+        if ($env{'form.state'} eq 'done') {
+            push(@{$brcrum},
+                     {href=>'/adm/createuser?action=drop',
+                      text=>"Result"});
+        }
+        $bread_crumbs_component = $brtext;
+        $args = {bread_crumbs           => $brcrum,
+                 bread_crumbs_component => $bread_crumbs_component}; 
+        $r->print(&header(undef,$args));
         if (!exists($env{'form.state'})) {
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,
-                                                          'Course_Drop_Student'));
-
             &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype);
         } elsif ($env{'form.state'} eq 'done') {
-            &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=drop',
-              text=>"Result"});
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,
-                                                          'Course_Drop_Student'));
             &Apache::lonuserutils::update_user_list($r,$context,undef,
                                                     $env{'form.action'});
         }
-        $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'dateselect') {
         if ($permission->{'cusr'}) {
-            $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
+            $r->print(&header(undef,{'no_nav_bar' => 1}).
                       &Apache::lonuserutils::date_section_selector($context,
-                                                                   $permission,$crstype).
-                      &Apache::loncommon::end_page());
+                                                                   $permission,$crstype));
         } else {
-            $r->print(&header().
-                     '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'. 
-                     &Apache::loncommon::end_page());
+            $r->print(&header(undef,{'no_nav_bar' => 1}).
+                     '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'); 
         }
     } elsif ($env{'form.action'} eq 'selfenroll') {
-        $r->print(&header());
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=selfenroll',
-              text=>"Configure Self-enrollment"});
+        push(@{$brcrum},
+                {href => '/adm/createuser?action=selfenroll',
+                 text => "Configure Self-enrollment",
+                 help => 'Course_Self_Enrollment'});
         if (!exists($env{'form.state'})) {
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Configure Self-enrollment',
-                                                          'Course_Self_Enrollment'));
+            $args = { bread_crumbs           => $brcrum,
+                      bread_crumbs_component => 'Configure Self-enrollment'};
+            $r->print(&header(undef,$args));
             $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
             &print_selfenroll_menu($r,$context,$permission);
         } elsif ($env{'form.state'} eq 'done') {
-            &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=selfenroll',
-              text=>"Result"});
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enrollment result',
-                                                          'Course_Self_Enrollment'));
+            push (@{$brcrum},
+                      {href=>'/adm/createuser?action=selfenroll',
+                       text=>"Result"});
+            $args = { bread_crumbs           => $brcrum,
+                      bread_crumbs_component => 'Self-enrollment result'};
+            $r->print(&header(undef,$args));
             $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
             &update_selfenroll_config($r,$context,$permission);
         }
-        $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'selfenrollqueue') {
-        $r->print(&header());
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=selfenrollqueue',
-              text=>"Enrollment requests"});
+        push(@{$brcrum},
+                 {href => '/adm/createuser?action=selfenrollqueue',
+                  text => 'Enrollment requests',
+                  help => 'Course_Self_Enrollment'});
+        $bread_crumbs_component = 'Enrollment requests';
+        if ($env{'form.state'} eq 'done') {
+            push(@{$brcrum},
+                     {href => '/adm/createuser?action=selfenrollqueue',
+                      text => 'Result',
+                      help => 'Course_Self_Enrollment'});
+            $bread_crumbs_component = 'Enrollment result';
+        }
+        $args = { bread_crumbs           => $brcrum,
+                  bread_crumbs_component => $bread_crumbs_component};
+        $r->print(&header(undef,$args));
         my $cid = $env{'request.course.id'};
         my $cdom = $env{'course.'.$cid.'.domain'};
         my $cnum = $env{'course.'.$cid.'.num'};
         my $coursedesc = $env{'course.'.$cid.'.description'};
         if (!exists($env{'form.state'})) {
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests',
-                                                          'Course_SelfEnrollment_Approval'));
             $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");
             $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,
                                                                        $cdom,$cnum));
         } elsif ($env{'form.state'} eq 'done') {
-            &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=selfenrollqueue',
-              text=>"Result"});
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result',
-                                                          'Course_Self_Enrollment'));
             $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");
             $r->print(&Apache::loncoursequeueadmin::update_request_queue($context,
                           $cdom,$cnum,$coursedesc));
         }
-        $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'changelogs') {
-        $r->print(&header());
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/createuser?action=changelogs',
-              text=>"User Management Logs"});
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Changes',
-                                                      'Course_User_Logs'));
-            &print_userchangelogs_display($r,$context,$permission);
-        $r->print(&Apache::loncommon::end_page());        
+        my $helpitem;
+        if ($context eq 'course') {
+            $helpitem = 'Course_User_Logs';
+        }
+        push (@{$brcrum},
+                 {href => '/adm/createuser?action=changelogs',
+                  text => 'User Management Logs',
+                  help => $helpitem});
+        $bread_crumbs_component = 'User Changes';
+        $args = { bread_crumbs           => $brcrum,
+                  bread_crumbs_component => $bread_crumbs_component};
+        $r->print(&header(undef,$args));
+        &print_userchangelogs_display($r,$context,$permission);
     } else {
-        $r->print(&header());
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
+        $bread_crumbs_component = 'User Management';
+        $args = { bread_crumbs           => $brcrum,
+                  bread_crumbs_component => $bread_crumbs_component};
+        $r->print(&header(undef,$args));
         $r->print(&print_main_menu($permission,$context,$crstype));
-        $r->print(&Apache::loncommon::end_page());
     }
+    $r->print(&Apache::loncommon::end_page());
     return OK;
 }
 
 sub header {
-    my ($jscript,$loaditems,$args) = @_;
+    my ($jscript,$args) = @_;
     my $start_page;
-    if (ref($loaditems) eq 'HASH') {
-        $start_page=&Apache::loncommon::start_page('User Management',$jscript,{'add_entries' => $loaditems});
-    } else {
+    if (ref($args) eq 'HASH') {
         $start_page=&Apache::loncommon::start_page('User Management',$jscript,$args);
+    } else {
+        $start_page=&Apache::loncommon::start_page('User Management',$jscript);
     }
     return $start_page;
 }
@@ -4314,14 +4557,69 @@ sub add_script {
 }
 
 sub verify_user_display {
+    my ($context) = @_;
+    my $photos;
+    if (($context eq 'course') && $env{'request.course.id'}) {
+        $photos = $env{'course.'.$env{'request.course.id'}.'.internal.showphoto'};
+    }
     my $output = <<"END";
 
+function hide_searching() {
+    if (document.getElementById('searching')) {
+        document.getElementById('searching').style.display = 'none';
+    }
+    return;
+}
+
 function display_update() {
     document.studentform.action.value = 'listusers';
     document.studentform.phase.value = 'display';
     document.studentform.submit();
 }
 
+function updateCols(caller) {
+    var context = '$context';
+    var photos = '$photos';
+    if (caller == 'Status') {
+        if (document.studentform.Status.options[document.studentform.Status.selectedIndex].value == 'Any') {
+            document.getElementById('showcolstatus').checked = true;
+            document.getElementById('showcolstatus').disabled = '';
+            document.getElementById('showcolstart').checked = true;
+            document.getElementById('showcolend').checked = true;
+        } else {
+            document.getElementById('showcolstatus').checked = false;
+            document.getElementById('showcolstatus').disabled = 'disabled';
+            document.getElementById('showcolstart').checked = false;
+            document.getElementById('showcolend').checked = false;
+        }
+    }
+    if (caller == 'output') {
+        if (photos == 1) {
+            if (document.getElementById('showcolphoto')) {
+                var photoitem = document.getElementById('showcolphoto');
+                if (document.studentform.output.options[document.studentform.output.selectedIndex].value == 'html') {
+                    photoitem.checked = true;
+                    photoitem.disabled = '';
+                } else {
+                    photoitem.checked = false;
+                    photoitem.disabled = 'disabled';
+                }
+            }
+        }
+    }
+    if (caller == 'showrole') {
+        if ((document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value == 'Any') ||
+            (document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value == 'cr')) {
+            document.getElementById('showcolrole').checked = true;
+            document.getElementById('showcolrole').disabled = '';
+        } else {
+            document.getElementById('showcolrole').checked = false;
+            document.getElementById('showcolrole').disabled = 'disabled';
+        }
+    }
+    return;
+}
+
 END
     return $output;
 
@@ -4352,12 +4650,12 @@ sub print_main_menu {
                 course => {
                             upload     => 'Upload a File of Course Users',
                             singleuser => 'Add/Modify a Course User',
-                            listusers  => 'Manage Course Users',
+                            listusers  => 'List and Modify Multiple Course Users',
                             },
                 community => {
                             upload     => 'Upload a File of Community Users',
                             singleuser => 'Add/Modify a Community User',
-                            listusers  => 'Manage Community Users',
+                            listusers  => 'List and Modify Multiple Community Users',
                            },
                 );
      my %linktitles = (
@@ -4428,6 +4726,22 @@ sub print_main_menu {
              permission => $permission->{'custom'},
              linktitle => 'Configure a custom role.',
             },
+            {
+             linktext => 'Authoring Space Requests',
+             icon => 'selfenrl-queue.png',
+             #help => 'Domain_Role_Approvals',
+             url => '/adm/createuser?action=processauthorreq',
+             permission => $permission->{'cusr'},
+             linktitle => 'Approve or reject author role requests',
+            },
+            {
+             linktext => 'Change Log',
+             icon => 'document-properties.png',
+             #help => 'Course_User_Logs',
+             url => '/adm/createuser?action=changelogs',
+             permission => $permission->{'cusr'},
+             linktitle => 'View change log.',
+            },
         );
         
     }elsif ($context eq 'course'){
@@ -4544,8 +4858,19 @@ sub print_main_menu {
                 },
             );
         }
-    };
-return Apache::lonhtmlcommon::generate_menu(@menu);
+    } elsif ($context eq 'author') {
+        push(@{ $menu[2]->{items} }, #Category: Administration
+            {
+             linktext => 'Change Log',
+             icon => 'document-properties.png',
+             #help => 'Course_User_Logs',
+             url => '/adm/createuser?action=changelogs',
+             permission => $permission->{'cusr'},
+             linktitle => 'View change log.',
+            },
+        );
+    }
+    return Apache::lonhtmlcommon::generate_menu(@menu);
 #               { text => 'View Log-in History',
 #                 help => 'Course_User_Logins',
 #                 action => 'logins',
@@ -5235,18 +5560,35 @@ sub selfenroll_date_forms {
 
 sub print_userchangelogs_display {
     my ($r,$context,$permission) = @_;
-    my $formname = 'roleslog';
-    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
-    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
-    my $crstype = &Apache::loncommon::course_type();
-    my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
+    my $formname = 'rolelog';
+    my ($username,$domain,$crstype,%roleslog);
+    if ($context eq 'domain') {
+        $domain = $env{'request.role.domain'};
+        %roleslog=&Apache::lonnet::dump_dom('nohist_rolelog',$domain);
+    } else {
+        if ($context eq 'course') { 
+            $domain = $env{'course.'.$env{'request.course.id'}.'.domain'};
+            $username = $env{'course.'.$env{'request.course.id'}.'.num'};
+            $crstype = &Apache::loncommon::course_type();
+            my %saveable_parameters = ('show' => 'scalar',);
+            &Apache::loncommon::store_course_settings('roles_log',
+                                                      \%saveable_parameters);
+            &Apache::loncommon::restore_course_settings('roles_log',
+                                                        \%saveable_parameters);
+        } elsif ($context eq 'author') {
+            $domain = $env{'user.domain'}; 
+            if ($env{'request.role'} =~ m{^au\./\Q$domain\E/$}) {
+                $username = $env{'user.name'};
+            } else {
+                undef($domain);
+            }
+        }
+        if ($domain ne '' && $username ne '') { 
+            %roleslog=&Apache::lonnet::dump('nohist_rolelog',$domain,$username);
+        }
+    }
     if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
 
-    my %saveable_parameters = ('show' => 'scalar',);
-    &Apache::loncommon::store_course_settings('roles_log',
-                                              \%saveable_parameters);
-    &Apache::loncommon::restore_course_settings('roles_log',
-                                                \%saveable_parameters);
     # set defaults
     my $now = time();
     my $defstart = $now - (7*24*3600); #7 days ago 
@@ -5288,7 +5630,8 @@ sub print_userchangelogs_display {
 
     # Form Header
     $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">'.
-              &role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype));
+              &role_display_filter($context,$formname,$domain,$username,\%curr,
+                                   $version,$crstype));
 
     # Create navigation
     my ($nav_script,$nav_links) = &userlogdisplay_nav($formname,\%curr,$more_records);
@@ -5301,9 +5644,13 @@ sub print_userchangelogs_display {
        .'<th>'.&mt('When').'</th>'
        .'<th>'.&mt('Who made the change').'</th>'
        .'<th>'.&mt('Changed User').'</th>'
-       .'<th>'.&mt('Role').'</th>'
-       .'<th>'.&mt('Section').'</th>'
-       .'<th>'.&mt('Context').'</th>'
+       .'<th>'.&mt('Role').'</th>';
+
+    if ($context eq 'course') {
+        $tableheader .= '<th>'.&mt('Section').'</th>';
+    }
+    $tableheader .=
+        '<th>'.&mt('Context').'</th>'
        .'<th>'.&mt('Start').'</th>'
        .'<th>'.&mt('End').'</th>'
        .&Apache::loncommon::end_data_table_header_row();
@@ -5372,7 +5719,7 @@ sub print_userchangelogs_display {
         if ($roleslog{$id}{'logentry'}{'selfenroll'}) {
             $chgcontext = 'selfenroll';
         }
-        my %lt = &rolechg_contexts($crstype);
+        my %lt = &rolechg_contexts($context,$crstype);
         if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
             $chgcontext = $lt{$chgcontext};
         }
@@ -5382,9 +5729,12 @@ sub print_userchangelogs_display {
            .'<td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td>'
            .'<td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td>'
            .'<td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td>'
-           .'<td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'</td>'
-           .'<td>'.$sec.'</td>'
-           .'<td>'.$chgcontext.'</td>'
+           .'<td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'</td>');
+        if ($context eq 'course') { 
+            $r->print('<td>'.$sec.'</td>');
+        }
+        $r->print(
+            '<td>'.$chgcontext.'</td>'
            .'<td>'.$rolestart.'</td>'
            .'<td>'.$roleend.'</td>'
            .&Apache::loncommon::end_data_table_row()."\n");
@@ -5452,9 +5802,11 @@ ENDSCRIPT
 }
 
 sub role_display_filter {
-    my ($formname,$cdom,$cnum,$curr,$version,$crstype) = @_;
-    my $context = 'course';
-    my $lctype = lc($crstype);
+    my ($context,$formname,$cdom,$cnum,$curr,$version,$crstype) = @_;
+    my $lctype;
+    if ($context eq 'course') {
+        $lctype = lc($crstype);
+    }
     my $nolink = 1;
     my $output = '<table><tr><td valign="top">'.
                  '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
@@ -5469,7 +5821,7 @@ sub role_display_filter {
         &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',
                                             $curr->{'rolelog_end_date'},undef,
                                             undef,undef,undef,undef,undef,undef,$nolink);
-    my %lt = &rolechg_contexts($crstype);
+    my %lt = &rolechg_contexts($context,$crstype);
     $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br />'.
                '<table><tr><td>'.&mt('After:').
                '</td><td>'.$startform.'</td></tr>'.
@@ -5483,7 +5835,7 @@ sub role_display_filter {
         $output .= ' selected="selected"';
     }
     $output .=  '>'.&mt('Any').'</option>'."\n";
-    my @roles = &Apache::lonuserutils::course_roles($context,undef,1,$lctype);
+    my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype);
     foreach my $role (@roles) {
         my $plrole;
         if ($role eq 'cr') {
@@ -5501,13 +5853,23 @@ sub role_display_filter {
                '<td>&nbsp;&nbsp;</td>'.
                '<td valign="top"><b>'.
                &mt('Context:').'</b><br /><select name="chgcontext">';
-    foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll','requestcourses') {
+    my @posscontexts;
+    if ($context eq 'course') {
+        @posscontexts = ('any','auto','updatenow','createcourse','course','domain','selfenroll','requestcourses');
+    } elsif ($context eq 'domain') {
+        @posscontexts = ('any','domain','requestauthor','domconfig','server');
+    } else {
+        @posscontexts = ('any','author','domain');
+    } 
+    foreach my $chgtype (@posscontexts) {
         my $selstr = '';
         if ($curr->{'chgcontext'} eq $chgtype) {
             $selstr = ' selected="selected"';
         }
-        if (($chgtype eq 'auto') || ($chgtype eq 'updatenow')) {
-            next if (!&Apache::lonnet::auto_run($cnum,$cdom));
+        if ($context eq 'course') {
+            if (($chgtype eq 'auto') || ($chgtype eq 'updatenow')) {
+                next if (!&Apache::lonnet::auto_run($cnum,$cdom));
+            }
         }
         $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";
     }
@@ -5520,9 +5882,14 @@ sub role_display_filter {
               .'</p>';
 
     # Server version info
+    my $needsrev = '2.11.0';
+    if ($context eq 'course') {
+        $needsrev = '2.7.0';
+    }
+    
     $output .= '<p class="LC_info">'
               .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
-                  ,'2.6.99.0');
+                  ,$needsrev);
     if ($version) {
         $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
     }
@@ -5531,8 +5898,10 @@ sub role_display_filter {
 }
 
 sub rolechg_contexts {
-    my ($crstype) = @_;
-    my %lt = &Apache::lonlocal::texthash (
+    my ($context,$crstype) = @_;
+    my %lt;
+    if ($context eq 'course') {
+        %lt = &Apache::lonlocal::texthash (
                                              any          => 'Any',
                                              auto         => 'Automated enrollment',
                                              updatenow    => 'Roster Update',
@@ -5542,11 +5911,26 @@ sub rolechg_contexts {
                                              selfenroll   => 'Self-enrolled',
                                              requestcourses => 'Course Request',
                                          );
-    if ($crstype eq 'Community') {
-        $lt{'createcourse'} = &mt('Community Creation');
-        $lt{'course'} = &mt('User Management in community');
-        $lt{'requestcourses'} = &mt('Community Request');
-    }
+        if ($crstype eq 'Community') {
+            $lt{'createcourse'} = &mt('Community Creation');
+            $lt{'course'} = &mt('User Management in community');
+            $lt{'requestcourses'} = &mt('Community Request');
+        }
+    } elsif ($context eq 'domain') {
+        %lt = &Apache::lonlocal::texthash (
+                                             any           => 'Any',
+                                             domain        => 'User Management in domain',
+                                             requestauthor => 'Authoring Request',
+                                             server        => 'Command line script (DC role)',
+                                             domconfig     => 'Self-enrolled',
+                                         );
+    } else {
+        %lt = &Apache::lonlocal::texthash (
+                                             any    => 'Any',
+                                             domain => 'User Management in domain',
+                                             author => 'User Management by author',
+                                         );
+    } 
     return %lt;
 }
 
@@ -6067,7 +6451,7 @@ sub course_level_table {
 	my $thiscourse=$protectedcourse;
 	$thiscourse=~s:_:/:g;
 	my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
-        my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'});
+        my $isowner = &Apache::lonuserutils::is_courseowner($protectedcourse,$coursedata{'internal.courseowner'});
 	my $area=$coursedata{'description'};
         my $crstype=$coursedata{'type'};
 	if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
@@ -6174,8 +6558,8 @@ sub course_level_dc {
     my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="dccourse" value="" />';
-    my $courseform='<b>'.&Apache::loncommon::selectcourse_link
-            ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course/Community','crstype').'</b>';
+    my $courseform=&Apache::loncommon::selectcourse_link
+            ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Select','crstype');
     my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser');
     my %lt=&Apache::lonlocal::texthash(
                     'rol'  => "Role",
@@ -6185,15 +6569,17 @@ sub course_level_dc {
                     'sta'  => "Start",
                     'end'  => "End",
                     'ssd'  => "Set Start Date",
-                    'sed'  => "Set End Date"
+                    'sed'  => "Set End Date",
+                    'scc'  => "Course/Community"
                   );
     my $header = '<h4>'.&mt('Course/Community Level').'</h4>'.
                  &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().
-                 '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
+                 '<th>'.$lt{'scc'}.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                  &Apache::loncommon::end_data_table_header_row();
     my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
-                     '<td><br /><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n".
+                     '<td><br /><span class="LC_nobreak"><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc','','','','crstype'".')" />'.
+                     $courseform.('&nbsp;' x4).'</span></td>'."\n".
                      '<td valign><br /><select name="role">'."\n";
     foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);
@@ -6559,7 +6945,7 @@ sub update_selfenroll_config {
     my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
     if (ref($visactions) eq 'HASH') {
         if (!$visible) {
-            $r->print('<br />'.$visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
+            $r->print('<br /><span class="LC_warning">'.$visactions->{'miss'}.'</span><br />'.$visactions->{'yous'}.
                       '<br />');
             if (ref($vismsgs) eq 'ARRAY') {
                 $r->print('<br />'.$visactions->{'take'}.'<ul>');
@@ -6589,21 +6975,6 @@ sub get_selfenroll_titles {
     return (\@row,\%lt);
 }
 
-sub is_courseowner {
-    my ($thiscourse,$courseowner) = @_;
-    if ($courseowner eq '') {
-        if ($env{'request.course.id'} eq $thiscourse) {
-            $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
-        }
-    }
-    if ($courseowner ne '') {
-        if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) {
-            return 1;
-        }
-    }
-    return;
-}
-
 #---------------------------------------------- end functions for &phase_two
 
 #--------------------------------- functions for &phase_two and &phase_three