Diff for /loncom/interface/loncreateuser.pm between versions 1.421 and 1.432

version 1.421, 2016/11/12 00:16:24 version 1.432, 2017/01/28 03:48:44
Line 536  sub domainrole_req { Line 536  sub domainrole_req {
            &Apache::loncommon::end_data_table();             &Apache::loncommon::end_data_table();
 }  }
   
 sub domadhocroles {  
     my ($ccuname,$ccdomain) = @_;  
     my $confname = &Apache::lonnet::get_domainconfiguser($env{'request.role.domain'});  
     my %existing=&Apache::lonnet::dump('roles',$env{'request.role.domain'},  
                                        $confname,'rolesdef_');  
     my ($output,$canmodify);  
     if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {  
         $canmodify = 1;  
     }  
     if (keys(%existing) > 0) {  
         my @current;  
         my $curradhoc = 'adhocroles.'.$env{'request.role.domain'};  
         my %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,$curradhoc);  
         if ($userenv{$curradhoc}) {  
             @current = split(/,/,$userenv{$curradhoc});  
         }  
         if (!$canmodify && !@current) {  
             return;  
         }  
         my %customroles;  
         foreach my $key (keys(%existing)) {  
             if ($key=~/^rolesdef\_(\w+)$/) {  
                 my $rolename = $1;  
                 my %privs;  
                 ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key});  
                 $customroles{$rolename} = \%privs;  
             }  
         }  
         $output = '<br /><h3>'.  
                   &mt('Ad Hoc Course Roles Selectable via Helpdesk Role').  
                   '</h3>'."\n".  
                   &Apache::loncommon::start_data_table().  
                   &Apache::loncommon::start_data_table_header_row();  
         if ($canmodify) {  
             $output .= '<th>'.&mt('Action').'</th>';  
         }  
         $output .= '<th>'.&mt('Role').'</th>'.  
                    '<th>'.&mt('Privileges in Course').'<th>'.  
                    &Apache::loncommon::end_data_table_header_row();  
         foreach my $key (sort(keys(%customroles))) {  
             next if ((!$canmodify) && (!grep(/^\Q$key\E$/,@current)));  
             $output .= &Apache::loncommon::start_data_table_row();  
             if ($canmodify) {  
                 if (grep(/^\Q$key\E$/,@current)) {  
                     $output .= '<td><label>'.  
                                '<input type="checkbox" name="adhocroledel" value="'.$key.'" />'.  
                                &mt('Delete').'</label>'.  
                                '</td>';  
                 } else {  
                     $output .= '<td><label>'.  
                                '<input type="checkbox" name="adhocroleadd" value="'.$key.'" />'.  
                                &mt('Add').'</label>'.  
                                '</td>';  
                 }  
             }  
             $output .= '<td>'.$key.'</td><td>';  
             foreach my $level ('course','domain','system') {  
                 if ($customroles{$key}{$level}) {  
                     my $suffix;  
                     if (($level eq 'domain') || ($level eq 'system')) {  
                         $suffix = '&nbsp;('.&mt($level).')';  
                     }  
                     my @privs = split(/:/,$customroles{$key}{$level});  
                     foreach my $item (@privs) {  
                         next if ($item eq '');  
                         my ($priv,$cond) = split(/\&/,$item);  
                         $output .= &Apache::lonnet::plaintext($priv,'Course').$suffix.'<br />';  
                     }  
                 }  
             }  
             $output .= '</td>'.  
                        &Apache::loncommon::end_data_table_row();  
         }  
         $output .= &Apache::loncommon::end_data_table();  
     }  
     return $output;  
 }  
   
 sub courserequest_titles {  sub courserequest_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                                    official   => 'Official',                                     official   => 'Official',
Line 757  sub print_username_entry_form { Line 679  sub print_username_entry_form {
     } elsif ($env{'form.action'} eq 'accesslogs') {      } elsif ($env{'form.action'} eq 'accesslogs') {
         $helpitem = 'Domain_User_Access_Logs';          $helpitem = 'Domain_User_Access_Logs';
     }      }
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$defdom);
     if ($env{'form.action'} eq 'custom') {      if ($env{'form.action'} eq 'custom') {
         push(@{$brcrum},          push(@{$brcrum},
                  {href=>"javascript:backPage(document.crtuser)",                          {href=>"javascript:backPage(document.crtuser)",       
Line 785  sub print_username_entry_form { Line 707  sub print_username_entry_form {
                     'srst' => 'Search for a user and enroll as a student',                      'srst' => 'Search for a user and enroll as a student',
                     'srme' => 'Search for a user and enroll as a member',                      'srme' => 'Search for a user and enroll as a member',
                     'srad' => 'Search for a user and modify/add user information or roles',                      'srad' => 'Search for a user and modify/add user information or roles',
                       'srvu' => 'Search for a user and view user information and roles',
                     'srva' => 'Search for a user and view access log information',                      'srva' => 'Search for a user and view access log information',
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
Line 840  sub print_username_entry_form { Line 763  sub print_username_entry_form {
             }              }
         } elsif ($env{'form.action'} eq 'accesslogs') {          } elsif ($env{'form.action'} eq 'accesslogs') {
             $actiontext = $lt{'srva'};              $actiontext = $lt{'srva'};
           } elsif (($env{'form.action'} eq 'singleuser') &&
                    ($context eq 'domain') && (!&Apache::lonnet::allowed('mau',$defdom))) {
               $actiontext = $lt{'srvu'};
         }          }
         $r->print("<h3>$actiontext</h3>");          $r->print("<h3>$actiontext</h3>");
         if ($env{'form.origform'} ne 'crtusername') {          if ($env{'form.origform'} ne 'crtusername') {
Line 933  ENDBLOCK Line 859  ENDBLOCK
     } else {      } else {
         $output = '<p>'.$userpicker.'</p>';          $output = '<p>'.$userpicker.'</p>';
     }      }
     if (($env{'form.phase'} eq '') && ($env{'form.action'} ne 'accesslogs')) {      if (($env{'form.phase'} eq '') && ($env{'form.action'} ne 'accesslogs') &&
           (!(($env{'form.action'} eq 'singleuser') && ($context eq 'domain') &&
           (!&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))))) {
         my $defdom=$env{'request.role.domain'};          my $defdom=$env{'request.role.domain'};
         my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');          my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
Line 1050  ENDSCRIPT Line 978  ENDSCRIPT
                                        'stusrch'        => "User Search to enroll student",                                         'stusrch'        => "User Search to enroll student",
                                        'memsrch'        => "User Search to enroll member",                                         'memsrch'        => "User Search to enroll member",
                                        'srcva'          => "Search for a user and view access log information",                                         'srcva'          => "Search for a user and view access log information",
                                          'usrvu'          => "User Search to view user roles",
                                        'usel'           => "Select a user to add/modify roles",                                         'usel'           => "Select a user to add/modify roles",
                                          'suvr'           => "Select a user to view roles",
                                        'stusel'         => "Select a user to enroll as a student",                                         'stusel'         => "Select a user to enroll as a student",
                                        'memsel'         => "Select a user to enroll as a member",                                         'memsel'         => "Select a user to enroll as a member",
                                        'vacsel'         => "Select a user to view access log",                                         'vacsel'         => "Select a user to view access log",
Line 1063  ENDSCRIPT Line 993  ENDSCRIPT
     if ($context eq 'requestcrs') {      if ($context eq 'requestcrs') {
         $r->print('<div>');          $r->print('<div>');
     } else {      } else {
         my %breadcrumb_text = &singleuser_breadcrumb($crstype);          my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$srch->{'srchdomain'});
         my $helpitem;          my $helpitem;
         if ($env{'form.action'} eq 'singleuser') {          if ($env{'form.action'} eq 'singleuser') {
             $helpitem = 'Course_Change_Privileges';              $helpitem = 'Course_Change_Privileges';
Line 1083  ENDSCRIPT Line 1013  ENDSCRIPT
                   );                    );
         $r->print(&Apache::loncommon::start_page('User Management',$jscript,{bread_crumbs => $brcrum}));          $r->print(&Apache::loncommon::start_page('User Management',$jscript,{bread_crumbs => $brcrum}));
         if ($env{'form.action'} eq 'singleuser') {          if ($env{'form.action'} eq 'singleuser') {
             $r->print("<b>$lt{'usrch'}</b><br />");              my $readonly;
               if (($context eq 'domain') && (!&Apache::lonnet::allowed('mau',$srch->{'srchdomain'}))) {
                   $readonly = 1;
                   $r->print("<b>$lt{'usrvu'}</b><br />");
               } else {
                   $r->print("<b>$lt{'usrch'}</b><br />");
               }
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));              $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
             $r->print('<h3>'.$lt{'usel'}.'</h3>');              if ($readonly) {
                   $r->print('<h3>'.$lt{'suvr'}.'</h3>');
               } else {
                   $r->print('<h3>'.$lt{'usel'}.'</h3>');
               }
         } elsif ($env{'form.action'} eq 'singlestudent') {          } elsif ($env{'form.action'} eq 'singlestudent') {
             $r->print($jscript."<b>");              $r->print($jscript."<b>");
             if ($crstype eq 'Community') {              if ($crstype eq 'Community') {
Line 1279  sub print_user_modification_page { Line 1219  sub print_user_modification_page {
   
     my $js = &validation_javascript($context,$ccdomain,$pjump_def,$crstype,      my $js = &validation_javascript($context,$ccdomain,$pjump_def,$crstype,
                                $groupslist,$newuser,$formname,\%loaditem);                                 $groupslist,$newuser,$formname,\%loaditem);
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$ccdomain);
     my $helpitem = 'Course_Change_Privileges';      my $helpitem = 'Course_Change_Privileges';
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         $helpitem = 'Course_Add_Student';          $helpitem = 'Course_Add_Student';
Line 1345  ENDFORMINFO Line 1285  ENDFORMINFO
     }      }
     my $title = '';      my $title = '';
     if ($newuser) {      if ($newuser) {
         my ($portfolioform,$domroleform,$adhocroleform);          my ($portfolioform,$domroleform);
         if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||          if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||
             (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {              (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {
             # Current user has quota or user tools modification privileges              # Current user has quota or user tools modification privileges
Line 1355  ENDFORMINFO Line 1295  ENDFORMINFO
             ($ccdomain eq $env{'request.role.domain'})) {              ($ccdomain eq $env{'request.role.domain'})) {
             $domroleform = '<br />'.&domainrole_req($ccuname,$ccdomain);              $domroleform = '<br />'.&domainrole_req($ccuname,$ccdomain);
         }          }
         if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {  
             $adhocroleform = &domadhocroles($ccuname,$ccdomain);  
             if ($adhocroleform) {  
                 $adhocroleform = '<br />'.$adhocroleform;  
             }  
         }  
         &initialize_authen_forms($ccdomain,$formname);          &initialize_authen_forms($ccdomain,$formname);
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                 'lg'             => 'Login Data',                  'lg'             => 'Login Data',
Line 1471  ENDAUTH Line 1405  ENDAUTH
         } else {          } else {
             $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));               $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); 
         }          }
         $r->print($portfolioform.$domroleform.$adhocroleform);          $r->print($portfolioform.$domroleform);
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $r->print(&date_sections_select($context,$newuser,$formname,              $r->print(&date_sections_select($context,$newuser,$formname,
                                             $permission,$crstype,$ccuname,                                              $permission,$crstype,$ccuname,
Line 1501  ENDAUTH Line 1435  ENDAUTH
         $r->print('<div class="LC_left_float">');          $r->print('<div class="LC_left_float">');
         $r->print(&personal_data_display($ccuname,$ccdomain,$newuser,$context,          $r->print(&personal_data_display($ccuname,$ccdomain,$newuser,$context,
                                          $inst_results{$ccuname.':'.$ccdomain}));                                           $inst_results{$ccuname.':'.$ccdomain}));
         if ((&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) ||           if ((&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) ||
             (&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) {              (&Apache::lonnet::allowed('udp',$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());                        &Apache::loncommon::start_data_table());
Line 1514  ENDAUTH Line 1448  ENDAUTH
             $r->print(&Apache::loncommon::end_data_table());              $r->print(&Apache::loncommon::end_data_table());
         }          }
         $r->print('</div>');          $r->print('</div>');
         my @order = ('auth','quota','tools','requestauthor','adhocroles');          my @order = ('auth','quota','tools','requestauthor');
         my %user_text;          my %user_text;
         my ($isadv,$isauthor) =           my ($isadv,$isauthor) = 
             &Apache::lonnet::is_advanced_user($ccdomain,$ccuname);              &Apache::lonnet::is_advanced_user($ccdomain,$ccuname);
         if ((!$isauthor) &&           if ((!$isauthor) && 
             ((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) ||              ((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) ||
              (&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) &&               (&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) &&
             ($env{'request.role.domain'} eq $ccdomain)) {               ($env{'request.role.domain'} eq $ccdomain)) {
             $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);              $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);
         }          }
         if ((&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) ||   
             (&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) {  
             $user_text{'adhocroles'} = &domadhocroles($ccuname,$ccdomain);  
         }  
         $user_text{'auth'} =  &user_authentication($ccuname,$ccdomain,$formname);          $user_text{'auth'} =  &user_authentication($ccuname,$ccdomain,$formname);
         if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||          if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
             (&Apache::lonnet::allowed('mut',$ccdomain)) ||              (&Apache::lonnet::allowed('mut',$ccdomain)) ||
Line 1596  ENDNOTOOLSPRIV Line 1526  ENDNOTOOLSPRIV
         } elsif (($context eq 'course') && ((&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) ||          } elsif (($context eq 'course') && ((&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) ||
                  ($env{'request.course.sec'} &&                   ($env{'request.course.sec'} &&
                   &Apache::lonnet::allowed('vcl',$env{'request.course.id'}.'/'.$env{'request.course.sec'})))) {                    &Apache::lonnet::allowed('vcl',$env{'request.course.id'}.'/'.$env{'request.course.sec'})))) {
             $statuses = ['active'];                 $statuses = ['active'];
         }          }
         if ($env{'form.action'} ne 'singlestudent') {          if ($env{'form.action'} ne 'singlestudent') {
             &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,              &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,
Line 1654  ENDNOTOOLSPRIV Line 1584  ENDNOTOOLSPRIV
 }  }
   
 sub singleuser_breadcrumb {  sub singleuser_breadcrumb {
     my ($crstype) = @_;      my ($crstype,$context,$domain) = @_;
     my %breadcrumb_text;      my %breadcrumb_text;
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         if ($crstype eq 'Community') {          if ($crstype eq 'Community') {
Line 1662  sub singleuser_breadcrumb { Line 1592  sub singleuser_breadcrumb {
         } else {          } else {
             $breadcrumb_text{'search'} = 'Enroll a student';              $breadcrumb_text{'search'} = 'Enroll a student';
         }          }
         $breadcrumb_text{'userpicked'} = 'Select a user',          $breadcrumb_text{'userpicked'} = 'Select a user';
         $breadcrumb_text{'modify'} = 'Set section/dates',          $breadcrumb_text{'modify'} = 'Set section/dates';
     } elsif ($env{'form.action'} eq 'accesslogs') {      } elsif ($env{'form.action'} eq 'accesslogs') {
         $breadcrumb_text{'search'} = 'View access logs for a user';          $breadcrumb_text{'search'} = 'View access logs for a user';
         $breadcrumb_text{'userpicked'} = 'Select a user',          $breadcrumb_text{'userpicked'} = 'Select a user';
         $breadcrumb_text{'activity'} = 'Activity',          $breadcrumb_text{'activity'} = 'Activity';
       } elsif (($env{'form.action'} eq 'singleuser') && ($context eq 'domain') &&
                (!&Apache::lonnet::allowed('mau',$domain))) {
           $breadcrumb_text{'search'} = "View user's roles";
           $breadcrumb_text{'userpicked'} = 'Select a user';
           $breadcrumb_text{'modify'} = 'User roles';
     } else {      } else {
         $breadcrumb_text{'search'} = 'Create/modify a user';          $breadcrumb_text{'search'} = 'Create/modify a user';
         $breadcrumb_text{'userpicked'} = 'Select a user',          $breadcrumb_text{'userpicked'} = 'Select a user';
         $breadcrumb_text{'modify'} = 'Set user role',          $breadcrumb_text{'modify'} = 'Set user role';
     }      }
     return %breadcrumb_text;      return %breadcrumb_text;
 }  }
Line 1825  sub display_existing_roles { Line 1760  sub display_existing_roles {
         if ($active) {          if ($active) {
             next unless($showall || $showactive);              next unless($showall || $showactive);
         } else {          } else {
             next unless($showall || $showexpired);               next unless($showall || $showexpired);
         }          }
 # Is this a custom role? Get role owner and title.  # Is this a custom role? Get role owner and title.
         my ($croleudom,$croleuname,$croletitle)=          my ($croleudom,$croleuname,$croletitle)=
Line 1970  sub display_existing_roles { Line 1905  sub display_existing_roles {
             } else {              } else {
                 $row.='&nbsp;';                  $row.='&nbsp;';
             }              }
             $row.= '</td>';               $row.= '</td>';
         }          }
         my $plaintext='';          my $plaintext='';
         if (!$croletitle) {          if (!$croletitle) {
Line 2283  ENDBADAUTH Line 2218  ENDBADAUTH
                         $result = &mt('Currently Kerberos authenticated, Version [_1].',$krbver);                          $result = &mt('Currently Kerberos authenticated, Version [_1].',$krbver);
                     } else {                      } else {
                         $result = &mt('Currently Kerberos authenticated with domain [_1] Version [_2].',                          $result = &mt('Currently Kerberos authenticated with domain [_1] Version [_2].',
                                       $krbver,$krbrealm);                                        $krbrealm,$krbver);
                     }                      }
                 } elsif ($currentauth =~ /^internal:/) {                  } elsif ($currentauth =~ /^internal:/) {
                     $result = &mt('Currently internally authenticated.');                      $result = &mt('Currently internally authenticated.');
Line 2689  sub update_user_data { Line 2624  sub update_user_data {
                   $jsback."\n".                    $jsback."\n".
                   '// ]]>'."\n".                    '// ]]>'."\n".
                   '</script>'."\n";                    '</script>'."\n";
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$env{'form.ccdomain'});
     push (@{$brcrum},      push (@{$brcrum},
              {href => "javascript:backPage(document.userupdate)",               {href => "javascript:backPage(document.userupdate)",
               text => $breadcrumb_text{'search'},                text => $breadcrumb_text{'search'},
Line 2908  sub update_user_data { Line 2843  sub update_user_data {
                                                     $newcustom{'requestauthor'},                                                      $newcustom{'requestauthor'},
                                                     \%changeHash,'requestauthor');                                                      \%changeHash,'requestauthor');
                 }                  }
                 if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {  
                     my @adds = &Apache::loncommon::get_env_multiple('form.adhocroleadd');  
                     if (&adhocrole_changes(\%changeHash)) {  
                         $changed{'adhocroles.'.$env{'request.role.domain'}} = $changeHash{'adhocroles.'.$env{'request.role.domain'}};  
                     }  
                 }  
             }              }
             if ($canmodify_status{'inststatus'}) {              if ($canmodify_status{'inststatus'}) {
                 if (exists($env{'form.inststatus'})) {                  if (exists($env{'form.inststatus'})) {
Line 2977  sub update_user_data { Line 2906  sub update_user_data {
              'requestcourses.community','requestcourses.textbook',               'requestcourses.community','requestcourses.textbook',
              'reqcrsotherdom.official','reqcrsotherdom.unofficial',               'reqcrsotherdom.official','reqcrsotherdom.unofficial',
              'reqcrsotherdom.community','reqcrsotherdom.textbook',               'reqcrsotherdom.community','reqcrsotherdom.textbook',
              'reqcrsotherdom.placement','requestauthor',               'reqcrsotherdom.placement','requestauthor'],
              'adhocroles.'.$env{'request.role.domain'}],  
               $env{'form.ccdomain'},$env{'form.ccuname'});                $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
Line 3117  sub update_user_data { Line 3045  sub update_user_data {
                 &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus,$name);                  &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus,$name);
             ($newdefquota{$name},$newsettingstatus{$name}) = ($olddefquota{$name},$oldsettingstatus{$name});              ($newdefquota{$name},$newsettingstatus{$name}) = ($olddefquota{$name},$oldsettingstatus{$name});
         }          }
         push(@disporder,'adhocroles');  
         my %canshow;          my %canshow;
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $canshow{'quota'} = 1;              $canshow{'quota'} = 1;
Line 3136  sub update_user_data { Line 3063  sub update_user_data {
         if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) {
             $canshow{'requestauthor'} = 1;              $canshow{'requestauthor'} = 1;
         }          }
         if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {  
             $canshow{'adhocroles'} = 1;  
         }  
         my (%changeHash,%changed);          my (%changeHash,%changed);
         if ($oldinststatus eq '') {          if ($oldinststatus eq '') {
             $oldsettings{'inststatus'} = $othertitle;               $oldsettings{'inststatus'} = $othertitle; 
Line 3252  sub update_user_data { Line 3176  sub update_user_data {
                 &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,                  &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,
                               \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);                                \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
             }              }
             if ($userenv{'adhocroles.'.$env{'request.role.domain'}}) {  
                 $changeHash{'adhocroles.'.$env{'request.role.domain'}} = $userenv{'adhocroles.'.$env{'request.role.domain'}};  
             }  
             if (&adhocrole_changes(\%changeHash,\%userenv)) {  
                 $changed{'adhocroles'} = 1;  
                 $oldsettings{'adhocroles'} = $userenv{'adhocroles.'.$env{'request.role.domain'}};  
                 $newsettings{'adhocroles'} = $changeHash{'adhocroles.'.$env{'request.role.domain'}};  
             }  
         }          }
         foreach my $item (@userinfo) {          foreach my $item (@userinfo) {
             if ($env{'form.c'.$item} ne $userenv{$item}) {              if ($env{'form.c'.$item} ne $userenv{$item}) {
Line 3302  sub update_user_data { Line 3218  sub update_user_data {
           &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},            &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
                                             $key,'reload','requestauthor');                                              $key,'reload','requestauthor');
                                 }                                  }
                             } elsif ($key eq 'adhocroles') {  
                                 $newenvhash{'adhocroles.'.$env{'request.role.domain'}} =  
                                     $changeHash{'adhocroles.'.$env{'request.role.domain'}};  
                             } elsif ($key ne 'quota') {                              } elsif ($key ne 'quota') {
                                 $newenvhash{'environment.tools.'.$key} =                                   $newenvhash{'environment.tools.'.$key} = 
                                     $changeHash{'tools.'.$key};                                      $changeHash{'tools.'.$key};
Line 3497  sub display_userinfo { Line 3410  sub display_userinfo {
          'textbook'       => 'Can Request Textbook Courses',           'textbook'       => 'Can Request Textbook Courses',
          'placement'      => 'Can Request Placement Tests',           'placement'      => 'Can Request Placement Tests',
          'requestauthor'  => 'Can Request Author Role',           'requestauthor'  => 'Can Request Author Role',
          'adhocroles'     => 'Ad Hoc Roles Selectable via Helpdesk Role',  
          'inststatus'     => "Affiliation",           'inststatus'     => "Affiliation",
          'prvs'           => 'Previous Value:',           'prvs'           => 'Previous Value:',
          'chto'           => 'Changed To:'           'chto'           => 'Changed To:'
Line 3863  sub tool_changes { Line 3775  sub tool_changes {
     return;      return;
 }  }
   
 sub adhocrole_changes {  
     my ($changehashref,$userenv) = @_;  
     my @adds = &Apache::loncommon::get_env_multiple('form.adhocroleadd');  
     my @dels = &Apache::loncommon::get_env_multiple('form.adhocroledel');  
     my (@saved,@added,@alladhoc,$changed);  
     my $adhoc_key = 'adhocroles.'.$env{'request.role.domain'};  
     if (!$env{'form.makeuser'}) {  
         if (ref($userenv) eq 'HASH') {  
             my @current;  
             if ($userenv->{$adhoc_key}) {  
                 @current = split(/,/,$userenv->{$adhoc_key});  
                 if (@dels) {  
                     foreach my $curr (@current) {  
                         next if ($curr eq '');  
                         unless (grep(/\Q$curr\E$/,@dels)) {  
                             push(@saved,$curr);  
                         }  
                     }  
                     $changed = 1;  
                 } else {  
                     @saved = @current;  
                 }  
             }  
         }  
     }  
     if (@adds) {  
         my $confname = &Apache::lonnet::get_domainconfiguser($env{'request.role.domain'});  
         my %existing=&Apache::lonnet::dump('roles',$env{'request.role.domain'},  
                                            $confname,'rolesdef_');  
         foreach my $poss (@adds) {  
             if (exists($existing{'rolesdef_'.$poss})) {  
                 push(@added,$poss);  
                 $changed = 1;  
             }  
         }  
     }  
     if (@added) {  
         if (@saved) {  
             foreach my $add (@added) {  
                 unless (grep(/^\Q$add\E$/,@saved)) {  
                     push(@alladhoc,$add);  
                 }  
             }  
         } else {  
             push(@alladhoc,@added);  
         }  
     }  
     if (@saved) {  
         push(@alladhoc,@saved);  
     }  
     if (@alladhoc) {  
         my $adhocstr = join(',',sort(@alladhoc));  
         $changehashref->{$adhoc_key} = $adhocstr;  
     } elsif (@dels) {  
         &Apache::lonnet::del('environment',[$adhoc_key],$env{'form.ccdomain'},$env{'form.ccuname'});  
         delete($changehashref->{$adhoc_key});  
         if (($env{'form.ccdomain'} eq $env{'user.domain'}) &&  
             ($env{'form.ccuname'} eq $env{'user.name'})) {  
             &Apache::lonnet::delenv($adhoc_key);  
         }  
     }  
     return $changed;  
 }  
   
 sub update_roles {  sub update_roles {
     my ($r,$context,$showcredits) = @_;      my ($r,$context,$showcredits) = @_;
     my $now=time;      my $now=time;
Line 4536  sub custom_role_editor { Line 4384  sub custom_role_editor {
               );                );
     my $args = { bread_crumbs          => $brcrum,      my $args = { bread_crumbs          => $brcrum,
                  bread_crumbs_component => 'User Management'};                   bread_crumbs_component => 'User Management'};
    
     $r->print(&Apache::loncommon::start_page('Custom Role Editor',      $r->print(&Apache::loncommon::start_page('Custom Role Editor',
                                              $head_script,$args).                                               $head_script,$args).
               $body_top);                $body_top);
Line 5177  sub handler { Line 5024  sub handler {
             } elsif ($env{'form.state'} eq 'done') {              } elsif ($env{'form.state'} eq 'done') {
                 $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");                  $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");
                 $r->print(&Apache::loncoursequeueadmin::update_request_queue($context,                  $r->print(&Apache::loncoursequeueadmin::update_request_queue($context,
                                $cdom,$cnum,$coursedesc));                                $cdom,$cnum,$coursedesc));
             }              }
         } else {          } else {
             $r->print(&header(undef,{'no_nav_bar' => 1}).              $r->print(&header(undef,{'no_nav_bar' => 1}).
Line 5190  sub handler { Line 5037  sub handler {
             $r->print(&header(undef,{'no_nav_bar' => 1}).              $r->print(&header(undef,{'no_nav_bar' => 1}).
                      '<span class="LC_error">'.&mt('You do not have permission to view change logs').'</span>');                       '<span class="LC_error">'.&mt('You do not have permission to view change logs').'</span>');
         }          }
       } elsif ($env{'form.action'} eq 'helpdesk') {
           if (($permission->{'owner'}) || ($permission->{'co-owner'})) {
               if ($env{'form.state'} eq 'process') {
                   if ($permission->{'owner'}) {
                       &update_helpdeskaccess($r,$permission,$brcrum);
                   } else {
                       &print_helpdeskaccess_display($r,$permission,$brcrum);
                   }
               } else {
                   &print_helpdeskaccess_display($r,$permission,$brcrum);
               }
           } else {
               $r->print(&header(undef,{'no_nav_bar' => 1}).
                         '<span class="LC_error">'.&mt('You do not have permission to view helpdesk access').'</span>');
           }
     } else {      } else {
         $bread_crumbs_component = 'User Management';          $bread_crumbs_component = 'User Management';
         $args = { bread_crumbs           => $brcrum,          $args = { bread_crumbs           => $brcrum,
Line 5443  sub print_main_menu { Line 5305  sub print_main_menu {
                 );                  );
   if ($linkcontext eq 'domain') {    if ($linkcontext eq 'domain') {
       unless ($permission->{'cusr'}) {        unless ($permission->{'cusr'}) {
           $links{'domain'}{'singleuser'} = 'View a User';             $links{'domain'}{'singleuser'} = 'View a User';
           $linktitles{'domain'}{'singleuser'} = 'View information about a user in the domain';            $linktitles{'domain'}{'singleuser'} = 'View information about a user in the domain';
             
       }        }
   } elsif ($linkcontext eq 'course') {    } elsif ($linkcontext eq 'course') {
       unless ($permission->{'cusr'}) {        unless ($permission->{'cusr'}) {
Line 5506  sub print_main_menu { Line 5367  sub print_main_menu {
             {              {
              linktext => 'User Access Log',               linktext => 'User Access Log',
              icon => 'document-properties.png',               icon => 'document-properties.png',
              #help => 'User_Access_Logs',               #help => 'Domain_User_Access_Logs',
              url => '/adm/createuser?action=accesslogs',               url => '/adm/createuser?action=accesslogs',
              permission => $permission->{'activity'},               permission => $permission->{'activity'},
              linktitle => 'View user access log.',               linktitle => 'View user access log.',
Line 5602  sub print_main_menu { Line 5463  sub print_main_menu {
             },              },
         );          );
         push(@{ $menu[2]->{items} }, #Category: Administration          push(@{ $menu[2]->{items} }, #Category: Administration
             {                  {
                linktext => 'Helpdesk Access',
                icon => 'helpdesk-access.png',
                #help => 'Course_Helpdesk_Access',
                url => '/adm/createuser?action=helpdesk',
                permission => ($permission->{'owner'} || $permission->{'co-owner'}),
                linktitle => 'Helpdesk access options',
               },
               {
              linktext => 'Custom Roles',               linktext => 'Custom Roles',
              icon => 'emblem-photos.png',               icon => 'emblem-photos.png',
              #help => 'Course_Editing_Custom_Roles',               #help => 'Course_Editing_Custom_Roles',
Line 6191  ENDSCRIPT Line 6060  ENDSCRIPT
             } elsif ($item eq 'approval') {              } elsif ($item eq 'approval') {
                 my ($currnotified,$currapproval,%appchecked);                  my ($currnotified,$currapproval,%appchecked);
                 my %selfdescs = &Apache::lonuserutils::selfenroll_default_descs();                  my %selfdescs = &Apache::lonuserutils::selfenroll_default_descs();
                 if (ref($currsettings) eq 'HASH') {                   if (ref($currsettings) eq 'HASH') {
                     $currnotified = $currsettings->{'selfenroll_notifylist'};                      $currnotified = $currsettings->{'selfenroll_notifylist'};
                     $currapproval = $currsettings->{'selfenroll_approval'};                      $currapproval = $currsettings->{'selfenroll_approval'};
                 }                  }
Line 6725  ENDSCRIPT Line 6594  ENDSCRIPT
             }              }
         }          }
         if (($context eq 'course') && ($viewablesec ne '')) {          if (($context eq 'course') && ($viewablesec ne '')) {
             next if ($roleslog{$id}{'logentry'}{'section'} ne $viewablesec);               next if ($roleslog{$id}{'logentry'}{'section'} ne $viewablesec);
         }          }
         $count ++;          $count ++;
         next if ($count < $minshown);          next if ($count < $minshown);
Line 6814  sub print_useraccesslogs_display { Line 6683  sub print_useraccesslogs_display {
     my $form = 'document.accesslog';      my $form = 'document.accesslog';
   
 # set breadcrumbs  # set breadcrumbs
     my %breadcrumb_text = &singleuser_breadcrumb();      my %breadcrumb_text = &singleuser_breadcrumb('','domain',$udom);
     push (@{$brcrum},      my $prevphasestr;
         {href => "javascript:backPage($form)",      if ($env{'form.popup'}) {
          text => $breadcrumb_text{'search'}});          $brcrum = [];
     my (@prevphases,$prevphasestr);      } else {
     if ($env{'form.prevphases'}) {          push (@{$brcrum},
         @prevphases = split(/,/,$env{'form.prevphases'});              {href => "javascript:backPage($form)",
         $prevphasestr = $env{'form.prevphases'};               text => $breadcrumb_text{'search'}});
     }          my @prevphases;
     if (($env{'form.phase'} eq 'userpicked') || (grep(/^userpicked$/,@prevphases))) {          if ($env{'form.prevphases'}) {
         push(@{$brcrum},              @prevphases = split(/,/,$env{'form.prevphases'});
               {href => "javascript:backPage($form,'get_user_info','select')",              $prevphasestr = $env{'form.prevphases'};
                text => $breadcrumb_text{'userpicked'}});          }
         if ($env{'form.phase'} eq 'userpicked') {          if (($env{'form.phase'} eq 'userpicked') || (grep(/^userpicked$/,@prevphases))) {
             $prevphasestr = 'userpicked';              push(@{$brcrum},
                     {href => "javascript:backPage($form,'get_user_info','select')",
                      text => $breadcrumb_text{'userpicked'}});
               if ($env{'form.phase'} eq 'userpicked') {
                   $prevphasestr = 'userpicked';
               }
         }          }
     }      }
     push(@{$brcrum},      push(@{$brcrum},
              {href => '/adm/createuser?action=accesslogs',               {href => '/adm/createuser?action=accesslogs',
               text => 'User access logs',                text => 'User access logs',
               help => 'User_Access_Logs'});                help => 'Domain_User_Access_Logs'});
     my $bread_crumbs_component = 'User Access Logs';      my $bread_crumbs_component = 'User Access Logs';
     my $args = { bread_crumbs           => $brcrum,      my $args = { bread_crumbs           => $brcrum,
                  bread_crumbs_component => 'User Management'};                   bread_crumbs_component => 'User Management'};
       if ($env{'form.popup'}) {
           $args->{'no_nav_bar'} = 1;
           $args->{'bread_crumbs_nomenu'} = 1;
       }
   
 # set javascript  # set javascript
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
Line 6862  ENDSCRIPT Line 6740  ENDSCRIPT
     unless ($permission->{'activity'}) {      unless ($permission->{'activity'}) {
         $r->print('<p class="LC_warning">'          $r->print('<p class="LC_warning">'
                  .&mt('You do not have rights to display user access logs.')                   .&mt('You do not have rights to display user access logs.')
                  .'</p>'                   .'</p>');
                  .&earlyout_accesslog_form($formname,$prevphasestr,$udom));          if ($env{'form.popup'}) {
               $r->print('<p><a href="javascript:window.close()">'.&mt('Close window').'</a></p>');
           } else {
               $r->print(&earlyout_accesslog_form($formname,$prevphasestr,$udom));
           }
         return;          return;
     }      }
   
Line 6929  ENDSCRIPT Line 6811  ENDSCRIPT
     my ($nav_script,$nav_links);      my ($nav_script,$nav_links);
   
 # table header  # table header
     my $tableheader =      my $tableheader = '<h3>'.
         &Apache::loncommon::start_data_table_header_row()          &mt('User access logs for: [_1]',
               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom)).'</h3>'
          .&Apache::loncommon::start_data_table_header_row()
        .'<th>&nbsp;</th>'         .'<th>&nbsp;</th>'
        .'<th>'.&mt('When').'</th>'         .'<th>'.&mt('When').'</th>'
        .'<th>'.&mt('HostID').'</th>'         .'<th>'.&mt('HostID').'</th>'
Line 7043  ENDSCRIPT Line 6927  ENDSCRIPT
                  .'</p>');                   .'</p>');
     }      }
   
       if ($env{'form.popup'} == 1) {
           $r->print('<input type="hidden" name="popup" value="1" />'."\n");
       }
   
     # Form Footer      # Form Footer
     $r->print(      $r->print(
         '<input type="hidden" name="currstate" value="" />'          '<input type="hidden" name="currstate" value="" />'
Line 7125  sub activity_display_filter { Line 7013  sub activity_display_filter {
     # Update Display button      # Update Display button
     $output .= '<p>'      $output .= '<p>'
               .'<input type="submit" value="'.&mt('Update Display').'" />'                .'<input type="submit" value="'.&mt('Update Display').'" />'
               .'</p>';                .'</p><hr />';
     return $output;      return $output;
 }  }
   
Line 7302  sub rolechg_contexts { Line 7190  sub rolechg_contexts {
     return %lt;      return %lt;
 }  }
   
   sub print_helpdeskaccess_display {
       my ($r,$permission,$brcrum) = @_;
       my $formname = 'helpdeskaccess';
       my $helpitem = 'Course_Helpdesk_Access';
       push (@{$brcrum},
                {href => '/adm/createuser?action=helpdesk',
                 text => 'Helpdesk Access',
                 help => $helpitem});
       my $bread_crumbs_component = 'Helpdesk Staff Access';
       my $args = { bread_crumbs           => $brcrum,
                    bread_crumbs_component => $bread_crumbs_component};
   
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $confname = $cdom.'-domainconfig';
       my $crstype = &Apache::loncommon::course_type();
   
       my @accesstypes = ('all','none');
       my ($numstatustypes,@jsarray);
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($cdom);
       if (ref($types) eq 'ARRAY') {
           if (@{$types} > 0) {
               $numstatustypes = scalar(@{$types});
               push(@accesstypes,'status');
               @jsarray = ('bystatus');
           }
       }
       my %customroles = &get_domain_customroles($cdom,$confname);
       my %domhelpdesk = &Apache::lonnet::get_active_domroles($cdom,['dh','da']);
       if (keys(%domhelpdesk)) {
          push(@accesstypes,('inc','exc'));
          push(@jsarray,('notinc','notexc'));
       }
       push(@jsarray,'privs');
       my $hiddenstr = join("','",@jsarray);
       my $rolestr = join("','",sort(keys(%customroles)));
   
       my $jscript;
       my (%settings,%overridden);
       if (keys(%customroles)) {
           &get_adhocrole_settings($env{'request.course.id'},\@accesstypes,
                                   $types,\%customroles,\%settings,\%overridden);
           my %jsfull=();
           my %jslevels= (
                        course => {},
                        domain => {},
                        system => {},
                       );
           my %jslevelscurrent=(
                              course => {},
                              domain => {},
                              system => {},
                             );
           my (%privs,%jsprivs);
           &Apache::lonuserutils::custom_role_privs(\%privs,\%jsfull,\%jslevels,\%jslevelscurrent);
           foreach my $priv (keys(%jsfull)) {
               if ($jslevels{'course'}{$priv}) {
                   $jsprivs{$priv} = 1;
               }
           }
           my (%elements,%stored);
           foreach my $role (keys(%customroles)) {
               $elements{$role.'_access'} = 'radio';
               $elements{$role.'_incrs'} = 'radio';
               if ($numstatustypes) {
                   $elements{$role.'_status'} = 'checkbox';
               }
               if (keys(%domhelpdesk) > 0) {
                   $elements{$role.'_staff_inc'} = 'checkbox';
                   $elements{$role.'_staff_exc'} = 'checkbox';
               }
               $elements{$role.'_override'} = 'checkbox';
               if (ref($settings{$role}) eq 'HASH') {
                   if ($settings{$role}{'access'} ne '') {
                       my $curraccess = $settings{$role}{'access'};
                       $stored{$role.'_access'} = $curraccess;
                       $stored{$role.'_incrs'} = 1;
                       if ($curraccess eq 'status') {
                           if (ref($settings{$role}{'status'}) eq 'ARRAY') {
                               $stored{$role.'_status'} = $settings{$role}{'status'};
                           }
                       } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
                           if (ref($settings{$role}{$curraccess}) eq 'ARRAY') {
                               $stored{$role.'_staff_'.$curraccess} = $settings{$role}{$curraccess};
                           }
                       }
                   } else {
                       $stored{$role.'_incrs'} = 0;
                   }
                   $stored{$role.'_override'} = [];
                   if ($env{'course.'.$env{'request.course.id'}.'.internal.adhocpriv.'.$role}) {
                       if (ref($settings{$role}{'off'}) eq 'ARRAY') {
                           foreach my $priv (@{$settings{$role}{'off'}}) {
                               push(@{$stored{$role.'_override'}},$priv);
                           }
                       }
                       if (ref($settings{$role}{'on'}) eq 'ARRAY') {
                           foreach my $priv (@{$settings{$role}{'on'}}) {
                               unless (grep(/^$priv$/,@{$stored{$role.'_override'}})) {
                                   push(@{$stored{$role.'_override'}},$priv);
                               }
                           }
                       }
                   }
               } else {
                   $stored{$role.'_incrs'} = 0;
               }
           }
           $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements,\%stored);
       }
   
       my $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   $jscript;
   
   function switchRoleTab(caller,role) {
       if (document.getElementById(role+'_maindiv')) {
           if (caller.id != 'LC_current_minitab') {
               if (document.getElementById('LC_current_minitab')) {
                   document.getElementById('LC_current_minitab').id=null;
               }
               var roledivs = Array('$rolestr');
               if (roledivs.length > 0) {
                   for (var i=0; i<roledivs.length; i++) {
                       if (document.getElementById(roledivs[i]+'_maindiv')) {
                           document.getElementById(roledivs[i]+'_maindiv').style.display='none';
                       }
                   }
               }
               caller.id = 'LC_current_minitab';
               document.getElementById(role+'_maindiv').style.display='block';
           }
       }
       return false;
   }
   
   function helpdeskAccess(role) {
       var curraccess = null;
       if (document.$formname.elements[role+'_access'].length) {
           for (var i=0; i<document.$formname.elements[role+'_access'].length; i++) {
               if (document.$formname.elements[role+'_access'][i].checked) {
                   curraccess = document.$formname.elements[role+'_access'][i].value;
               }
           }
       }
       var shown = Array();
       var hidden = Array();
       if (curraccess == 'none') {
           hidden = Array ('$hiddenstr');
       } else {
           if (curraccess == 'status') {
               shown = Array ('bystatus','privs');
               hidden = Array ('notinc','notexc');
           } else {
               if (curraccess == 'exc') {
                   shown = Array ('notexc','privs');
                   hidden = Array ('notinc','bystatus');
               }
               if (curraccess == 'inc') {
                   shown = Array ('notinc','privs');
                   hidden = Array ('notexc','bystatus');
               }
               if (curraccess == 'all') {
                   shown = Array ('privs');
                   hidden = Array ('notinc','notexc','bystatus');
               }
           }
       }
       if (hidden.length > 0) {
           for (var i=0; i<hidden.length; i++) {
               if (document.getElementById(role+'_'+hidden[i])) {
                   document.getElementById(role+'_'+hidden[i]).style.display = 'none';
               }
           }
       }
       if (shown.length > 0) {
           for (var i=0; i<shown.length; i++) {
               if (document.getElementById(role+'_'+shown[i])) {
                   if (shown[i] == 'privs') {
                       document.getElementById(role+'_'+shown[i]).style.display = 'block';
                   } else {
                       document.getElementById(role+'_'+shown[i]).style.display = 'inline';
                   }
               }
           }
       }
       return;
   }
   
   function toggleAccess(role) {
       if ((document.getElementById(role+'_setincrs')) &&
           (document.getElementById(role+'_setindom'))) {
           for (var i=0; i<document.$formname.elements[role+'_incrs'].length; i++) {
               if (document.$formname.elements[role+'_incrs'][i].checked) {
                   if (document.$formname.elements[role+'_incrs'][i].value == 1) {
                       document.getElementById(role+'_setindom').style.display = 'none';
                       document.getElementById(role+'_setincrs').style.display = 'block';
                   } else {
                       document.getElementById(role+'_setincrs').style.display = 'none';
                       document.getElementById(role+'_setindom').style.display = 'block';
                   }
                   break;
               }
           }
       }
       return;
   }
   
   // ]]>
   </script>
   ENDJS
   
       $args->{add_entries} = {onload => "javascript:setFormElements(document.$formname)"};
   
       # print page header
       $r->print(&header($js,$args));
       # print form header
       $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">');
   
       if (keys(%customroles)) {
           my %lt = &Apache::lonlocal::texthash(
                       'aco'    => 'As course owner you may override the defaults set in the domain for role usage and/or privileges.',
                       'rou'    => 'Role usage',
                       'whi'    => 'Which helpdesk personnel may use this role?',
                       'udd'    => 'Use domain default',
                       'all'    => 'All',
                       'none'   => 'None',
                       'status' => 'Determined based on institutional status',
                       'inc'    => 'Include all, but exclude specific personnel',
                       'exc'    => 'Exclude all, but include specific personnel',
                       'hel'    => 'Helpdesk',
                       'rpr'    => 'Role privileges',
                    );
           $lt{'tfh'} = &mt("Custom [_1]ad hoc[_2] course roles available for use by the domain's helpdesk are as follows",'<i>','</i>');
           my %domconfig = &Apache::lonnet::get_dom('configuration',['helpsettings'],$cdom);
           my (%domcurrent,%ordered,%description,%domusage,$disabled);
           if (ref($domconfig{'helpsettings'}) eq 'HASH') {
               if (ref($domconfig{'helpsettings'}{'adhoc'}) eq 'HASH') {
                   %domcurrent = %{$domconfig{'helpsettings'}{'adhoc'}};
               }
           }
           my $count = 0;
           foreach my $role (sort(keys(%customroles))) {
               my ($order,$desc,$access_in_dom);
               if (ref($domcurrent{$role}) eq 'HASH') {
                   $order = $domcurrent{$role}{'order'};
                   $desc = $domcurrent{$role}{'desc'};
                   $access_in_dom = $domcurrent{$role}{'access'};
               }
               if ($order eq '') {
                   $order = $count;
               }
               $ordered{$order} = $role;
               if ($desc ne '') {
                   $description{$role} = $desc;
               } else {
                   $description{$role}= $role;
               }
               $count++;
           }
           %domusage = &domain_adhoc_access(\%customroles,\%domcurrent,\@accesstypes,$usertypes,$othertitle);
           my @roles_by_num = ();
           foreach my $item (sort {$a <=> $b } (keys(%ordered))) {
               push(@roles_by_num,$ordered{$item});
           }
           $r->print('<p>'.$lt{'tfh'}.': <i>'.join('</i>, <i>',map { $description{$_}; } @roles_by_num).'</i>.');
           if ($permission->{'owner'}) {
               $r->print('<br />'.$lt{'aco'}.'</p><p>');
               $r->print('<input type="hidden" name="state" value="process" />'.
                         '<input type="submit" value="'.&mt('Save changes').'" />');
           } else {
               if ($env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}) {
                   my ($ownername,$ownerdom) = split(/:/,$env{'course.'.$env{'request.course.id'}.'.internal.courseowner'});
                   $r->print('<br />'.&mt('The course owner -- [_1] -- can override the default access and/or privileges for these ad hoc roles.',
                                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($ownername,$ownerdom),$ownername,$ownerdom)));
               }
               $disabled = ' disabled="disabled"';
           }
           $r->print('</p>');
   
           $r->print('<div id="LC_minitab_header"><ul>');
           my $count = 0;
           my %visibility;
           foreach my $role (@roles_by_num) {
               my $id;
               if ($count == 0) {
                   $id=' id="LC_current_minitab"';
                   $visibility{$role} = ' style="display:block"';
               } else {
                   $visibility{$role} = ' style="display:none"';
               }
               $count ++;
               $r->print('<li'.$id.'><a href="#" onclick="javascript:switchRoleTab(this.parentNode,'."'$role'".');">'.$description{$role}.'</a></li>');
           }
           $r->print('</ul></div>');
   
           foreach my $role (@roles_by_num) {
               my %usecheck = (
                                all => ' checked="checked"',
                              );
               my %displaydiv = (
                                   status => 'none',
                                   inc    => 'none',
                                   exc    => 'none',
                                   priv   => 'block',
                                );
               my (%selected,$overridden,$incrscheck,$indomcheck,$indomvis,$incrsvis);
               if (ref($settings{$role}) eq 'HASH') {
                   if ($settings{$role}{'access'} ne '') {
                       $indomvis = ' style="display:none"';
                       $incrsvis = ' style="display:block"';
                       $incrscheck = ' checked="checked"';
                       if ($settings{$role}{'access'} ne 'all') {
                           $usecheck{$settings{$role}{'access'}} = $usecheck{'all'};
                           delete($usecheck{'all'});
                           if ($settings{$role}{'access'} eq 'status') {
                               my $access = 'status';
                               $displaydiv{$access} = 'inline';
                               if (ref($settings{$role}{$access}) eq 'ARRAY') {
                                   $selected{$access} = $settings{$role}{$access};
                               }
                           } elsif ($settings{$role}{'access'} =~ /^(inc|exc)$/) {
                               my $access = $1;
                               $displaydiv{$access} = 'inline';
                               if (ref($settings{$role}{$access}) eq 'ARRAY') {
                                   $selected{$access} = $settings{$role}{$access};
                               }
                           } elsif ($settings{$role}{'access'} eq 'none') {
                               $displaydiv{'priv'} = 'none';
                           }
                       }
                   } else {
                       $indomcheck = ' checked="checked"';
                       $indomvis = ' style="display:block"';
                       $incrsvis = ' style="display:none"';
                   }
               } else {
                   $indomcheck = ' checked="checked"';
                   $indomvis = ' style="display:block"';
                   $incrsvis = ' style="display:none"';
               }
               $r->print('<div class="LC_left_float" id="'.$role.'_maindiv"'.$visibility{$role}.'>'.
                         '<fieldset><legend>'.$lt{'rou'}.'</legend>'.
                         '<p>'.$lt{'whi'}.' <span class="LC_nobreak">'.
                         '<label><input type="radio" name="'.$role.'_incrs" value="1"'.$incrscheck.' onclick="toggleAccess('."'$role'".');"'.$disabled.'>'.
                         &mt('Set here in [_1]',lc($crstype)).'</label>'.
                         '<span>'.('&nbsp;'x2).
                         '<label><input type="radio" name="'.$role.'_incrs" value="0"'.$indomcheck.' onclick="toggleAccess('."'$role'".');"'.$disabled.'>'.
                         $lt{'udd'}.'</label><span></p>'.
                         '<div id="'.$role.'_setindom"'.$indomvis.'>'.
                         '<span class="LC_cusr_emph">'.$domusage{$role}.'</span></div>'.
                         '<div id="'.$role.'_setincrs"'.$incrsvis.'>');
               foreach my $access (@accesstypes) {
                   $r->print('<p><label><input type="radio" name="'.$role.'_access" value="'.$access.'" '.$usecheck{$access}.
                             ' onclick="helpdeskAccess('."'$role'".');"'.$disabled.' />'.$lt{$access}.'</label>');
                   if ($access eq 'status') {
                       $r->print('<div id="'.$role.'_bystatus" style="display:'.$displaydiv{$access}.'">'.
                                 &Apache::lonuserutils::adhoc_status_types($cdom,undef,$role,$selected{$access},
                                                                           $othertitle,$usertypes,$types,$disabled).
                                 '</div>');
                   } elsif (($access eq 'inc') && (keys(%domhelpdesk) > 0)) {
                       $r->print('<div id="'.$role.'_notinc" style="display:'.$displaydiv{$access}.'">'.
                                 &Apache::lonuserutils::adhoc_staff($access,undef,$role,$selected{$access},
                                                                    \%domhelpdesk,$disabled).
                                 '</div>');
                   } elsif (($access eq 'exc') && (keys(%domhelpdesk) > 0)) {
                       $r->print('<div id="'.$role.'_notexc" style="display:'.$displaydiv{$access}.'">'.
                                 &Apache::lonuserutils::adhoc_staff($access,undef,$role,$selected{$access},
                                                                    \%domhelpdesk,$disabled).
                                 '</div>');
                   }
                   $r->print('</p>');
               }
               $r->print('</div></fieldset>');
               my %full=();
               my %levels= (
                            course => {},
                            domain => {},
                            system => {},
                           );
               my %levelscurrent=(
                                  course => {},
                                  domain => {},
                                  system => {},
                                 );
               &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent);
               $r->print('<fieldset id="'.$role.'_privs" style="display:'.$displaydiv{'priv'}.'">'.
                         '<legend>'.$lt{'rpr'}.'</legend>'.
                         &role_priv_table($role,$permission,$crstype,\%full,\%levels,\%levelscurrent,$overridden{$role}).
                         '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>');
           }
           if ($permission->{'owner'}) {
               $r->print('<p><input type="submit" value="'.&mt('Save changes').'" /></p>');
           }
       } else {
           $r->print(&mt('Helpdesk roles have not yet been created in this domain.'));
       }
       # Form Footer
       $r->print('<input type="hidden" name="action" value="helpdesk" />'
                .'</form>');
       return;
   }
   
   sub domain_adhoc_access {
       my ($roles,$domcurrent,$accesstypes,$usertypes,$othertitle) = @_;
       my %domusage;
       return unless ((ref($roles) eq 'HASH') && (ref($domcurrent) eq 'HASH') && (ref($accesstypes) eq 'ARRAY'));
       foreach my $role (keys(%{$roles})) {
           if (ref($domcurrent->{$role}) eq 'HASH') {
               my $access = $domcurrent->{$role}{'access'};
               if (($access eq '') || (!grep(/^\Q$access\E$/,@{$accesstypes}))) {
                   $access = 'all';
                   $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role',&Apache::lonnet::plaintext('dh'),
                                                                                             &Apache::lonnet::plaintext('da'));
               } elsif ($access eq 'status') {
                   if (ref($domcurrent->{$role}{$access}) eq 'ARRAY') {
                       my @shown;
                       foreach my $type (@{$domcurrent->{$role}{$access}}) {
                           unless ($type eq 'default') {
                               if ($usertypes->{$type}) {
                                   push(@shown,$usertypes->{$type});
                               }
                           }
                       }
                       if (grep(/^default$/,@{$domcurrent->{$role}{$access}})) {
                           push(@shown,$othertitle);
                       }
                       if (@shown) {
                           my $shownstatus = join(' '.&mt('or').' ',@shown);
                           $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role, and institutional status: [_3]',
                                                  &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'),$shownstatus);
                       } else {
                           $domusage{$role} = &mt('No one in the domain');
                       }
                   }
               } elsif ($access eq 'inc') {
                   my @dominc = ();
                   if (ref($domcurrent->{$role}{'inc'}) eq 'ARRAY') {
                       foreach my $user (@{$domcurrent->{$role}{'inc'}}) {
                           my ($uname,$udom) = split(/:/,$user);
                           push(@dominc,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom));
                       }
                       my $showninc = join(', ',@dominc);
                       if ($showninc ne '') {
                           $domusage{$role} = &mt('Include any user in domain with active [_1] or [_2] role, except: [_3]',
                                                  &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'),$showninc);
                       } else {
                           $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role',
                                                  &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'));
                       }
                   }
               } elsif ($access eq 'exc') {
                   my @domexc = ();
                   if (ref($domcurrent->{$role}{'exc'}) eq 'ARRAY') {
                       foreach my $user (@{$domcurrent->{$role}{'exc'}}) {
                           my ($uname,$udom) = split(/:/,$user);
                           push(@domexc,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom));
                       }
                   }
                   my $shownexc = join(', ',@domexc);
                   if ($shownexc ne '') {
                       $domusage{$role} = &mt('Only the following in the domain with active [_1] or [_2] role: [_3]',
                                              &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'),$shownexc);
                   } else {
                       $domusage{$role} = &mt('No one in the domain');
                   }
               } elsif ($access eq 'none') {
                   $domusage{$role} = &mt('No one in the domain');
               } elsif ($access eq 'all') {
                   $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role',
                                          &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'));
               }
           } else {
               $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role',
                                      &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'));
           }
       }
       return %domusage;
   }
   
   sub get_domain_customroles {
       my ($cdom,$confname) = @_;
       my %existing=&Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_');
       my %customroles;
       foreach my $key (keys(%existing)) {
           if ($key=~/^rolesdef\_(\w+)$/) {
               my $rolename = $1;
               my %privs;
               ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key});
               $customroles{$rolename} = \%privs;
           }
       }
       return %customroles;
   }
   
   sub role_priv_table {
       my ($role,$permission,$crstype,$full,$levels,$levelscurrent,$overridden) = @_;
       return unless ((ref($full) eq 'HASH') && (ref($levels) eq 'HASH') &&
                      (ref($levelscurrent) eq 'HASH'));
       my %lt=&Apache::lonlocal::texthash (
                       'crl'  => 'Course Level Privilege',
                       'def'  => 'Domain Defaults',
                       'ove'  => 'Override in Course',
                       'ine'  => 'In effect',
                       'dis'  => 'Disabled',
                       'ena'  => 'Enabled',
                      );
       if ($crstype eq 'Community') {
           $lt{'ove'} = 'Override in Community',
       }
       my @status = ('Disabled','Enabled');
       my (%on,%off);
       if (ref($overridden) eq 'HASH') {
           if (ref($overridden->{'on'}) eq 'ARRAY') {
               map { $on{$_} = 1; } (@{$overridden->{'on'}});
           }
           if (ref($overridden->{'off'}) eq 'ARRAY') {
               map { $off{$_} = 1; } (@{$overridden->{'off'}});
           }
       }
       my $output=&Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().
                  '<th>'.$lt{'crl'}.'</th><th>'.$lt{'def'}.'</th><th>'.$lt{'ove'}.
                  '</th><th>'.$lt{'ine'}.'</th>'.
                  &Apache::loncommon::end_data_table_header_row();
       foreach my $priv (sort(keys(%{$full}))) {
           next unless ($levels->{'course'}{$priv});
           my $privtext = &Apache::lonnet::plaintext($priv,$crstype);
           my ($default,$ineffect);
           if ($levelscurrent->{'course'}{$priv}) {
               $default = '<img src="/adm/lonIcons/navmap.correct.gif" alt="'.$lt{'ena'}.'" />';
               $ineffect = $default;
           }
           my ($customstatus,$checked);
           $output .= &Apache::loncommon::start_data_table_row().
                      '<td>'.$privtext.'</td>'.
                      '<td>'.$default.'</td><td>';
           if (($levelscurrent->{'course'}{$priv}) && ($off{$priv})) {
               if ($permission->{'owner'}) {
                   $checked = ' checked="checked"';
               }
               $customstatus = '<img src="/adm/lonIcons/navmap.wrong.gif" alt="'.$lt{'dis'}.'" />';
               $ineffect = $customstatus;
           } elsif ((!$levelscurrent->{'course'}{$priv}) && ($on{$priv})) {
               if ($permission->{'owner'}) {
                   $checked = ' checked="checked"';
               }
               $customstatus = '<img src="/adm/lonIcons/navmap.correct.gif" alt="'.$lt{'ena'}.'" />';
               $ineffect = $customstatus;
           }
           if ($permission->{'owner'}) {
               $output .= '<input type="checkbox" name="'.$role.'_override" value="'.$priv.'"'.$checked.' />';
           } else {
               $output .= $customstatus;
           }
           $output .= '</td><td>'.$ineffect.'</td>'.
                      &Apache::loncommon::end_data_table_row();
       }
       $output .= &Apache::loncommon::end_data_table();
       return $output;
   }
   
   sub get_adhocrole_settings {
       my ($cid,$accesstypes,$types,$customroles,$settings,$overridden) = @_;
       return unless ((ref($accesstypes) eq 'ARRAY') && (ref($customroles) eq 'HASH') &&
                      (ref($settings) eq 'HASH') && (ref($overridden) eq 'HASH'));
       foreach my $role (split(/,/,$env{'course.'.$cid.'.internal.adhocaccess'})) {
           my ($curraccess,$rest) = split(/=/,$env{'course.'.$cid.'.internal.adhoc.'.$role});
           if (($curraccess ne '') && (grep(/^\Q$curraccess\E$/,@{$accesstypes}))) {
               $settings->{$role}{'access'} = $curraccess;
               if (($curraccess eq 'status') && (ref($types) eq 'ARRAY')) {
                   my @status = split(/,/,$rest);
                   my @currstatus;
                   foreach my $type (@status) {
                       if ($type eq 'default') {
                           push(@currstatus,$type);
                       } elsif (grep(/^\Q$type\E$/,@{$types})) {
                           push(@currstatus,$type);
                       }
                   }
                   if (@currstatus) {
                       $settings->{$role}{$curraccess} = \@currstatus;
                   } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
                       my @personnel = split(/,/,$rest);
                       $settings->{$role}{$curraccess} = \@personnel;
                   }
               }
           }
       }
       foreach my $role (keys(%{$customroles})) {
           if ($env{'course.'.$cid.'.internal.adhocpriv.'.$role}) {
               my %currentprivs;
               if (ref($customroles->{$role}) eq 'HASH') {
                   if (exists($customroles->{$role}{'course'})) {
                       my %full=();
                       my %levels= (
                                     course => {},
                                     domain => {},
                                     system => {},
                                   );
                       my %levelscurrent=(
                                           course => {},
                                           domain => {},
                                           system => {},
                                         );
                       &Apache::lonuserutils::custom_role_privs($customroles->{$role},\%full,\%levels,\%levelscurrent);
                       %currentprivs = %{$levelscurrent{'course'}};
                   }
               }
               foreach my $item (split(/,/,$env{'course.'.$cid.'.internal.adhocpriv.'.$role})) {
                   next if ($item eq '');
                   my ($rule,$rest) = split(/=/,$item);
                   next unless (($rule eq 'off') || ($rule eq 'on'));
                   foreach my $priv (split(/:/,$rest)) {
                       if ($priv ne '') {
                           if ($rule eq 'off') {
                               push(@{$overridden->{$role}{'off'}},$priv);
                               if ($currentprivs{$priv}) {
                                   push(@{$settings->{$role}{'off'}},$priv);
                               }
                           } else {
                               push(@{$overridden->{$role}{'on'}},$priv);
                               unless ($currentprivs{$priv}) {
                                   push(@{$settings->{$role}{'on'}},$priv);
                               }
                           }
                       }
                   }
               }
           }
       }
       return;
   }
   
   sub update_helpdeskaccess {
       my ($r,$permission,$brcrum) = @_;
       my $helpitem = 'Course_Helpdesk_Access';
       push (@{$brcrum},
                {href => '/adm/createuser?action=helpdesk',
                 text => 'Helpdesk Access',
                 help => $helpitem},
                {href => '/adm/createuser?action=helpdesk',
                 text => 'Result',
                 help => $helpitem}
            );
       my $bread_crumbs_component = 'Helpdesk Staff Access';
       my $args = { bread_crumbs           => $brcrum,
                    bread_crumbs_component => $bread_crumbs_component};
   
       # print page header
       $r->print(&header('',$args));
       unless ((ref($permission) eq 'HASH') && ($permission->{'owner'})) {
           $r->print('<p class="LC_error">'.&mt('You do not have permission to change helpdesk access.').'</p>');
           return;
       }
       my @accesstypes = ('all','none','status','inc','exc');
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $confname = $cdom.'-domainconfig';
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($cdom);
       my $crstype = &Apache::loncommon::course_type();
       my %customroles = &get_domain_customroles($cdom,$confname);
       my (%settings,%overridden);
       &get_adhocrole_settings($env{'request.course.id'},\@accesstypes,
                               $types,\%customroles,\%settings,\%overridden);
       my %domhelpdesk = &Apache::lonnet::get_active_domroles($cdom,['dh','da']);
       my (%changed,%storehash,@todelete);
   
       if (keys(%customroles)) {
           my (%newsettings,@incrs);
           foreach my $role (keys(%customroles)) {
               $newsettings{$role} = {
                                       access => '',
                                       status => '',
                                       exc    => '',
                                       inc    => '',
                                       on     => '',
                                       off    => '',
                                     };
               my %current;
               if (ref($settings{$role}) eq 'HASH') {
                   %current = %{$settings{$role}};
               }
               if (ref($overridden{$role}) eq 'HASH') {
                   $current{'overridden'} = $overridden{$role};
               }
               if ($env{'form.'.$role.'_incrs'}) {
                   my $access = $env{'form.'.$role.'_access'};
                   if (grep(/^\Q$access\E$/,@accesstypes)) {
                       push(@incrs,$role);
                       unless ($current{'access'} eq $access) {
                           $changed{$role}{'access'} = 1;
                           $storehash{'internal.adhoc.'.$role} = $access;
                       }
                       if ($access eq 'status') {
                           my @statuses = &Apache::loncommon::get_env_multiple('form.'.$role.'_status');
                           my @stored;
                           my @shownstatus;
                           if (ref($types) eq 'ARRAY') {
                               foreach my $type (sort(@statuses)) {
                                   if ($type eq 'default') {
                                       push(@stored,$type);
                                   } elsif (grep(/^\Q$type\E$/,@{$types})) {
                                       push(@stored,$type);
                                       push(@shownstatus,$usertypes->{$type});
                                   }
                               }
                               if (grep(/^default$/,@statuses)) {
                                   push(@shownstatus,$othertitle);
                               }
                               $storehash{'internal.adhoc.'.$role} .= '='.join(',',@stored);
                           }
                           $newsettings{$role}{'status'} = join(' '.&mt('or').' ',@shownstatus);
                           if (ref($current{'status'}) eq 'ARRAY') {
                               my @diffs = &Apache::loncommon::compare_arrays(\@stored,$current{'status'});
                               if (@diffs) {
                                   $changed{$role}{'status'} = 1;
                               }
                           } elsif (@stored) {
                               $changed{$role}{'status'} = 1;
                           }
                       } elsif (($access eq 'inc') || ($access eq 'exc')) {
                           my @personnel = &Apache::loncommon::get_env_multiple('form.'.$role.'_staff_'.$access);
                           my @newspecstaff;
                           my @stored;
                           my @currstaff;
                           foreach my $person (sort(@personnel)) {
                               if ($domhelpdesk{$person}) {
                                   push(@stored,$person);
                               }
                           }
                           if (ref($current{$access}) eq 'ARRAY') {
                               my @diffs = &Apache::loncommon::compare_arrays(\@stored,$current{$access});
                               if (@diffs) {
                                   $changed{$role}{$access} = 1;
                               }
                           } elsif (@stored) {
                               $changed{$role}{$access} = 1;
                           }
                           $storehash{'internal.adhoc.'.$role} .= '='.join(',',@stored);
                           foreach my $person (@stored) {
                               my ($uname,$udom) = split(/:/,$person);
                               push(@newspecstaff,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom,'lastname'),$uname,$udom));
                           }
                           $newsettings{$role}{$access} = join(', ',sort(@newspecstaff));
                       }
                       $newsettings{$role}{'access'} = $access;
                   }
               } else {
                   if (($current{'access'} ne '') && (grep(/^\Q$current{'access'}\E$/,@accesstypes))) {
                       $changed{$role}{'access'} = 1;
                       $newsettings{$role} = {};
                       push(@todelete,'internal.adhoc.'.$role);
                   }
               }
               if (($env{'form.'.$role.'_incrs'}) && ($env{'form.'.$role.'_access'} eq 'none')) {
                   if (ref($current{'overridden'}) eq 'HASH') {
                       push(@todelete,'internal.adhocpriv.'.$role);
                   }
               } else {
                   my %full=();
                   my %levels= (
                                course => {},
                                domain => {},
                                system => {},
                               );
                   my %levelscurrent=(
                                      course => {},
                                      domain => {},
                                      system => {},
                                     );
                   &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent);
                   my (@updatedon,@updatedoff,@override);
                   @override = &Apache::loncommon::get_env_multiple('form.'.$role.'_override');
                   if (@override) {
                       foreach my $priv (sort(keys(%full))) {
                           next unless ($levels{'course'}{$priv});
                           if (grep(/^\Q$priv\E$/,@override)) {
                               if ($levelscurrent{'course'}{$priv}) {
                                   push(@updatedoff,$priv);
                               } else {
                                   push(@updatedon,$priv);
                               }
                           }
                       }
                   }
                   if (@updatedon) {
                       $newsettings{$role}{'on'} = join('</li><li>', map { &Apache::lonnet::plaintext($_,$crstype) } (@updatedon));
                   }
                   if (@updatedoff) {
                       $newsettings{$role}{'off'} = join('</li><li>', map { &Apache::lonnet::plaintext($_,$crstype) } (@updatedoff));
                   }
                   if (ref($current{'overridden'}) eq 'HASH') {
                       if (ref($current{'overridden'}{'on'}) eq 'ARRAY') {
                           if (@updatedon) {
                               my @diffs = &Apache::loncommon::compare_arrays(\@updatedon,$current{'overridden'}{'on'});
                               if (@diffs) {
                                   $changed{$role}{'on'} = 1;
                               }
                           } else {
                               $changed{$role}{'on'} = 1;
                           }
                       } elsif (@updatedon) {
                           $changed{$role}{'on'} = 1;
                       }
                       if (ref($current{'overridden'}{'off'}) eq 'ARRAY') {
                           if (@updatedoff) {
                               my @diffs = &Apache::loncommon::compare_arrays(\@updatedoff,$current{'overridden'}{'off'});
                               if (@diffs) {
                                   $changed{$role}{'off'} = 1;
                               }
                           } else {
                               $changed{$role}{'off'} = 1;
                           }
                       } elsif (@updatedoff) {
                           $changed{$role}{'off'} = 1;
                       }
                   } else {
                       if (@updatedon) {
                           $changed{$role}{'on'} = 1;
                       }
                       if (@updatedoff) {
                           $changed{$role}{'off'} = 1;
                       }
                   }
                   if (ref($changed{$role}) eq 'HASH') {
                       if (($changed{$role}{'on'} || $changed{$role}{'off'})) {
                           my $newpriv;
                           if (@updatedon) {
                               $newpriv = 'on='.join(':',@updatedon);
                           }
                           if (@updatedoff) {
                               $newpriv .= ($newpriv ? ',' : '' ).'off='.join(':',@updatedoff);
                           }
                           if ($newpriv eq '') {
                               push(@todelete,'internal.adhocpriv.'.$role);
                           } else {
                               $storehash{'internal.adhocpriv.'.$role} = $newpriv;
                           }
                       }
                   }
               }
           }
           if (@incrs) {
               $storehash{'internal.adhocaccess'} = join(',',@incrs);
           } elsif (@todelete) {
               push(@todelete,'internal.adhocaccess');
           }
           if (keys(%changed)) {
               my ($putres,$delres);
               if (keys(%storehash)) {
                   $putres = &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum);
                   my %newenvhash;
                   foreach my $key (keys(%storehash)) {
                       $newenvhash{'course.'.$env{'request.course.id'}.'.'.$key} = $storehash{$key};
                   }
                   &Apache::lonnet::appenv(\%newenvhash);
               }
               if (@todelete) {
                   $delres = &Apache::lonnet::del('environment',\@todelete,$cdom,$cnum);
                   foreach my $key (@todelete) {
                       &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.'.$key);
                   }
               }
               if (($putres eq 'ok') || ($delres eq 'ok')) {
                   my %domconfig = &Apache::lonnet::get_dom('configuration',['helpsettings'],$cdom);
                   my (%domcurrent,%ordered,%description,%domusage);
                   if (ref($domconfig{'helpsettings'}) eq 'HASH') {
                       if (ref($domconfig{'helpsettings'}{'adhoc'}) eq 'HASH') {
                           %domcurrent = %{$domconfig{'helpsettings'}{'adhoc'}};
                       }
                   }
                   my $count = 0;
                   foreach my $role (sort(keys(%customroles))) {
                       my ($order,$desc);
                       if (ref($domcurrent{$role}) eq 'HASH') {
                           $order = $domcurrent{$role}{'order'};
                           $desc = $domcurrent{$role}{'desc'};
                       }
                       if ($order eq '') {
                           $order = $count;
                       }
                       $ordered{$order} = $role;
                       if ($desc ne '') {
                           $description{$role} = $desc;
                       } else {
                           $description{$role}= $role;
                       }
                       $count++;
                   }
                   my @roles_by_num = ();
                   foreach my $item (sort {$a <=> $b } (keys(%ordered))) {
                       push(@roles_by_num,$ordered{$item});
                   }
                   %domusage = &domain_adhoc_access(\%changed,\%domcurrent,\@accesstypes,$usertypes,$othertitle);
                   $r->print(&mt('Helpdesk access settings have been changed as follows').'<br />');
                   $r->print('<ul>');
                   foreach my $role (@roles_by_num) {
                       next unless (ref($changed{$role}) eq 'HASH');
                       $r->print('<li>'.&mt('Ad hoc role').': <b>'.$description{$role}.'</b>'.
                                 '<ul>');
                       if ($changed{$role}{'access'} || $changed{$role}{'status'} || $changed{$role}{'inc'} || $changed{$role}{'exc'}) {
                           $r->print('<li>');
                           if ($env{'form.'.$role.'_incrs'}) {
                               if ($newsettings{$role}{'access'} eq 'all') {
                                   $r->print(&mt('All helpdesk staff can access '.lc($crstype).' with this role.'));
                               } elsif ($newsettings{$role}{'access'} eq 'none') {
                                   $r->print(&mt('No helpdesk staff can access '.lc($crstype).' with this role.'));
                               } elsif ($newsettings{$role}{'access'} eq 'status') {
                                   if ($newsettings{$role}{'status'}) {
                                       my ($access,$rest) = split(/=/,$storehash{'internal.adhoc.'.$role});
                                       if (split(/,/,$rest) > 1) {
                                           $r->print(&mt('Helpdesk staff can use this role if their institutional type is one of: [_1].',
                                                         $newsettings{$role}{'status'}));
                                       } else {
                                           $r->print(&mt('Helpdesk staff can use this role if their institutional type is: [_1].',
                                                         $newsettings{$role}{'status'}));
                                       }
                                   } else {
                                       $r->print(&mt('No helpdesk staff can access '.lc($crstype).' with this role.'));
                                   }
                               } elsif ($newsettings{$role}{'access'} eq 'exc') {
                                   if ($newsettings{$role}{'exc'}) {
                                       $r->print(&mt('Helpdesk staff who can use this role are as follows:').' '.$newsettings{$role}{'exc'}.'.');
                                   } else {
                                       $r->print(&mt('No helpdesk staff can access '.lc($crstype).' with this role.'));
                                   }
                               } elsif ($newsettings{$role}{'access'} eq 'inc') {
                                   if ($newsettings{$role}{'inc'}) {
                                       $r->print(&mt('All helpdesk staff may use this role except the following:').' '.$newsettings{$role}{'inc'}.'.');
                                   } else {
                                       $r->print(&mt('All helpdesk staff may use this role.'));
                                   }
                               }
                           } else {
                               $r->print(&mt('Default access set in the domain now applies.').'<br />'.
                                         '<span class="LC_cusr_emph">'.$domusage{$role}.'</span>');
                           }
                           $r->print('</li>');
                       }
                       unless ($newsettings{$role}{'access'} eq 'none') {
                           if ($changed{$role}{'off'}) {
                               if ($newsettings{$role}{'off'}) {
                                   $r->print('<li>'.&mt('Privileges which are available by default for this ad hoc role, but are disabled for this specific '.lc($crstype).':').
                                             '<ul><li>'.$newsettings{$role}{'off'}.'</li></ul></li>');
                               } else {
                                   $r->print('<li>'.&mt('All privileges available by default for this ad hoc role are enabled.').'</li>');
                               }
                           }
                           if ($changed{$role}{'on'}) {
                               if ($newsettings{$role}{'on'}) {
                                   $r->print('<li>'.&mt('Privileges which are not available by default for this ad hoc role, but are enabled for this specific '.lc($crstype).':').
                                             '<ul><li>'.$newsettings{$role}{'on'}.'</li></ul></li>');
                               } else {
                                   $r->print('<li>'.&mt('None of the privileges unavailable by default for this ad hoc role are enabled.').'</li>');
                               }
                           }
                       }
                       $r->print('</ul></li>');
                   }
                   $r->print('</ul>');
               }
           } else {
               $r->print(&mt('No changes made to helpdesk access settings.'));
           }
       }
       return;
   }
   
 #-------------------------------------------------- functions for &phase_two  #-------------------------------------------------- functions for &phase_two
 sub user_search_result {  sub user_search_result {
     my ($context,$srch) = @_;      my ($context,$srch) = @_;
Line 7762  sub build_search_response { Line 8620  sub build_search_response {
                                 .&mt("Click 'Search'")                                  .&mt("Click 'Search'")
                                 .'</li></ul><br />';                                  .'</li></ul><br />';
                 } else {                  } else {
                     my $helplink = ' href="javascript:helpMenu('."'display'".')"';                      unless (($context eq 'domain') && ($env{'form.action'} eq 'singleuser')) {
                     $response .= '<br /><br />';                          my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                     if ($context eq 'requestcrs') {                          $response .= '<br /><br />';
                         $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom);                          if ($context eq 'requestcrs') {
                     } else {                              $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom);
                         $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);                          } else {
                               $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);
                           }
                           $response .= '<br />'
                                        .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'
                                           ,' <a'.$helplink.'>'
                                           ,'</a>')
                                        .'<br />';
                     }                      }
                     $response .= '<br />'  
                                  .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'  
                                     ,' <a'.$helplink.'>'  
                                     ,'</a>')  
                                  .'<br />';  
                 }                  }
             }              }
         }          }

Removed from v.1.421  
changed lines
  Added in v.1.432


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>