Diff for /loncom/interface/loncreateuser.pm between versions 1.276 and 1.295.2.26

version 1.276, 2009/02/03 05:28:00 version 1.295.2.26, 2010/01/19 23:41:43
Line 51  In LON-CAPA, roles are actually collecti Line 51  In LON-CAPA, roles are actually collecti
 Assistant", "Course Coordinator", and other such roles are really just  Assistant", "Course Coordinator", and other such roles are really just
 collection of privileges that are useful in many circumstances.  collection of privileges that are useful in many circumstances.
   
 Creating custom roles can be done by the Domain Coordinator through  Custom roles can be defined by a Domain Coordinator, Course Coordinator
 the Create User functionality. That screen will show all privileges  or Community Coordinator via the Manage User functionality.
 that can be assigned to users. For a complete list of privileges,  The custom role editor screen will show all privileges which can be
 please see C</home/httpd/lonTabs/rolesplain.tab>.  assigned to users. For a complete list of privileges, please see 
   C</home/httpd/lonTabs/rolesplain.tab>.
   
 Custom role definitions are stored in the C<roles.db> file of the role  Custom role definitions are stored in the C<roles.db> file of the creator
 author.  of the role.
   
 =cut  =cut
   
Line 68  use Apache::loncommon; Line 69  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
 use Apache::lonuserutils;  use Apache::lonuserutils;
   use Apache::loncoursequeueadmin;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 my $loginscript; # piece of javascript used in two separate instances  my $loginscript; # piece of javascript used in two separate instances
Line 109  sub initialize_authen_forms { Line 111  sub initialize_authen_forms {
   
 sub auth_abbrev {  sub auth_abbrev {
     my %abv_auth = (      my %abv_auth = (
                        krb5     => 'krb',
                      krb4     => 'krb',                       krb4     => 'krb',
                      internal => 'int',                       internal => 'int',
                      localuth => 'loc',                       localuth => 'loc',
Line 142  sub portfolio_quota { Line 145  sub portfolio_quota {
     $custom_off = ' checked="checked" ';      $custom_off = ' checked="checked" ';
     my $quota_javascript = <<"END_SCRIPT";      my $quota_javascript = <<"END_SCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function quota_changes(caller) {  function quota_changes(caller) {
     if (caller == "custom") {      if (caller == "custom") {
         if (document.cu.customquota[0].checked) {          if (document.cu.customquota[0].checked) {
Line 152  function quota_changes(caller) { Line 156  function quota_changes(caller) {
         document.cu.customquota[1].checked = true;          document.cu.customquota[1].checked = true;
     }      }
 }  }
   // ]]>
 </script>  </script>
 END_SCRIPT  END_SCRIPT
     if ($quotatype eq 'custom') {      if ($quotatype eq 'custom') {
Line 213  END_SCRIPT Line 218  END_SCRIPT
   
 sub build_tools_display {  sub build_tools_display {
     my ($ccuname,$ccdomain,$context) = @_;      my ($ccuname,$ccdomain,$context) = @_;
     my (@usertools,%userenv,$output);      my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,
           $colspan);
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                    'blog'       => "Personal User Blog",                     'blog'       => "Personal User Blog",
                    'aboutme'    => "Personal Information Page",                     'aboutme'    => "Personal Information Page",
Line 224  sub build_tools_display { Line 230  sub build_tools_display {
                    'usde'       => "Use default",                     'usde'       => "Use default",
                    'uscu'       => "Use custom",                     'uscu'       => "Use custom",
                    'official'   => 'Can request creation of official courses',                     'official'   => 'Can request creation of official courses',
                    'unofficial' => 'Can request creation of unofficial courses',                       'unofficial' => 'Can request creation of unofficial courses',
     );      );
     if ($context eq 'requestcourse') {      if ($context eq 'requestcourses') {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,          %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                       'requestcourse.official','requestcourse.unofficial');                        'requestcourses.official','requestcourses.unofficial');
         @usertools = ('official','unofficial');          @usertools = ('official','unofficial');
           @options =('norequest','approval','autolimit','validate');
           %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);
           %reqtitles = &courserequest_titles();
           %reqdisplay = &courserequest_display();
           $colspan = ' colspan="2"';
     } else {      } else {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,          %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                           'tools.aboutme','tools.portfolio','tools.blog');                            'tools.aboutme','tools.portfolio','tools.blog');
         @usertools = ('aboutme','blog','portfolio');          @usertools = ('aboutme','blog','portfolio');
     }      }
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off);          my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off,
               $currdisp,$custdisp,$custradio);
         $cust_off = 'checked="checked" ';          $cust_off = 'checked="checked" ';
         $tool_on = 'checked="checked" ';          $tool_on = 'checked="checked" ';
         $curr_access =            $curr_access =  
             &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef,              &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef,
                                               $context);                                                $context);
         if ($userenv{$context.'.'.$item} eq '') {          if ($userenv{$context.'.'.$item} ne '') {
             $custom_access = 'default';  
             if (!$curr_access) {  
                 $tool_off = 'checked="checked" ';  
                 $tool_on = '';  
             }  
         } else {  
             $custom_access = 'custom';  
             $cust_on = ' checked="checked" ';              $cust_on = ' checked="checked" ';
             $cust_off = '';              $cust_off = '';
             if ($userenv{$context.'.'.$item} == 0) {          }
                 $tool_off = 'checked="checked" ';          if ($context eq 'requestcourses') {
                 $tool_on = '';              if ($userenv{$context.'.'.$item} eq '') {
                   $custom_access = &mt('Currently from default setting.');
               } else {
                   $custom_access = &mt('Currently from custom setting.');
               }
           } else {
               if ($userenv{$context.'.'.$item} eq '') {
                   $custom_access =
                       &mt('Availability determined currently from default setting.');
                   if (!$curr_access) {
                       $tool_off = 'checked="checked" ';
                       $tool_on = '';
                   }
               } else {
                   $custom_access =
                       &mt('Availability determined currently from custom setting.');
                   if ($userenv{$context.'.'.$item} == 0) {
                       $tool_off = 'checked="checked" ';
                       $tool_on = '';
                   }
             }              }
         }          }
         $output .= '  <tr class="LC_info_row">'."\n".          $output .= '  <tr class="LC_info_row">'."\n".
                    '   <td>'.$lt{$item}.'</td>'."\n".                     '   <td'.$colspan.'>'.$lt{$item}.'</td>'."\n".
                    '  </tr>'."\n".                     '  </tr>'."\n".
                    &Apache::loncommon::start_data_table_row()."\n".                     &Apache::loncommon::start_data_table_row()."\n";
                    '  <td>'.&mt('Availability determined currently from [_1] setting.',$custom_access).          if ($context eq 'requestcourses') {
                    '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'avai'}.': '.              my ($curroption,$currlimit);
                    ($curr_access?&mt('Yes'):&mt('No')).'</td>'."\n".              $curroption = $userenv{$context.'.'.$item};
               if (!$curroption) {
                   $curroption = 'norequest';
               }
               if ($curroption =~ /^autolimit=(\d*)$/) {
                   $currlimit = $1;
                   if ($currlimit eq '') {
                       $currdisp = &mt('Yes, automatic creation');
                   } else {
                       $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit);
                   }
               } else {
                   $currdisp = $reqdisplay{$curroption};
               }
               $custdisp = '<table>';
               foreach my $option (@options) {
                   my $val = $option;
                   if ($option eq 'norequest') {
                       $val = 0;
                   }
                   if ($option eq 'validate') {
                       my $canvalidate = 0;
                       if (ref($validations{$item}) eq 'HASH') {
                           if ($validations{$item}{'_custom_'}) {
                               $canvalidate = 1;
                           }
                       }
                       next if (!$canvalidate);
                   }
                   my $checked = '';
                   if ($option eq $curroption) {
                       $checked = ' checked="checked"';
                   } elsif ($option eq 'autolimit') {
                       if ($curroption =~ /^autolimit/) {
                           $checked = ' checked="checked"';
                       }
                   }
                   $custdisp .= '<tr><td><span class="LC_nobreak"><label>'.
                                '<input type="radio" name="crsreq_'.$item.
                                '" value="'.$val.'"'.$checked.' />'.
                                $reqtitles{$option}.'</label>&nbsp;';
                   if ($option eq 'autolimit') {
                       $custdisp .= '<input type="text" name="crsreq_'.
                                    $item.'_limit" size="1" '.
                                    'value="'.$currlimit.'" /></span><br />'.
                                    $reqtitles{'unlimited'};
                    } else {
                        $custdisp .= '</span>';
                    }
                    $custdisp .= '</td></tr>';
               }
               $custdisp .= '</table>';
               $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp;
           } else {
               $currdisp = ($curr_access?&mt('Yes'):&mt('No'));
               $custdisp = '<span class="LC_nobreak"><label>'.
                           '<input type="radio" name="'.$context.'_'.$item.'"'.
                           ' value="1"'. $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.
                           '<input type="radio" name="'.$context.'_'.$item.'" value="0" '.
                           $tool_off.'/>'.&mt('Off').'</label></span>';
               $custradio = ('&nbsp;'x2).'--'.$lt{'cusa'}.':&nbsp;'.$custdisp.
                             '</span>';
           }
           $output .= '  <td'.$colspan.'>'.$custom_access.('&nbsp;'x4).
                      $lt{'avai'}.': '.$currdisp.'</td>'."\n".
                    &Apache::loncommon::end_data_table_row()."\n".                     &Apache::loncommon::end_data_table_row()."\n".
                    &Apache::loncommon::start_data_table_row()."\n".                     &Apache::loncommon::start_data_table_row()."\n".
                    '  <td><span class="LC_nobreak">'.$lt{'chse'}.': <label>'.                     '  <td style="vertical-align:top;"><span class="LC_nobreak">'.
                      $lt{'chse'}.': <label>'.
                    '<input type="radio" name="custom'.$item.'" value="0" '.                     '<input type="radio" name="custom'.$item.'" value="0" '.
                    $cust_off.'/>'.$lt{'usde'}.'</label>&nbsp;&nbsp;&nbsp;'.                     $cust_off.'/>'.$lt{'usde'}.'</label>'.('&nbsp;' x3).
                     '<label><input type="radio" name="custom'.$item.'" value="1" '.                     '<label><input type="radio" name="custom'.$item.'" value="1" '.
                    $cust_on.'/>'.$lt{'uscu'}.'</label>&nbsp;&nbsp;--&nbsp;&nbsp;'.                     $cust_on.'/>'.$lt{'uscu'}.'</label>'.$custradio.'</td>'.
                    $lt{'cusa'}.':&nbsp;<label>'.                     &Apache::loncommon::end_data_table_row()."\n";
                    '<input type="radio" name="'.$context.'_'.$item.'" value="1" '.      }
                    $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.      return $output;
                    '<input type="radio" name="'.$context.'_'.$item.'" value="0" '.  }
                    $tool_off.'/>'.&mt('Off').'</label></span></td>'."\n".  
   sub coursereq_externaluser {
       my ($ccuname,$ccdomain,$cdom) = @_;
       my (@usertools,@options,%validations,%userenv,$output);
       my %lt = &Apache::lonlocal::texthash (
                      'official'   => 'Can request creation of official courses',
                      'unofficial' => 'Can request creation of unofficial courses',
                      'community'  => 'Can request creation of communities',
       );
   
       %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                         'reqcrsotherdom.official','reqcrsotherdom.unofficial',
                         'reqcrsotherdom.community');
       @usertools = ('official','unofficial','community');
       @options = ('approval','validate','autolimit');
       %validations = &Apache::lonnet::auto_courserequest_checks($cdom);
       my $optregex = join('|',@options);
       my %reqtitles = &courserequest_titles();
       foreach my $item (@usertools) {
           my ($curroption,$currlimit,$tooloff);
           if ($userenv{'reqcrsotherdom.'.$item} ne '') {
               my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});
               foreach my $req (@curr) {
                   if ($req =~ /^\Q$cdom\E\:($optregex)=?(\d*)$/) {
                       $curroption = $1;
                       $currlimit = $2;
                       last;
                   }
               }
               if (!$curroption) {
                   $curroption = 'norequest';
                   $tooloff = ' checked="checked"';
               }
           } else {
               $curroption = 'norequest';
               $tooloff = ' checked="checked"';
           }
           $output.= &Apache::loncommon::start_data_table_row()."\n".
                     '  <td><span class="LC_nobreak">'.$lt{$item}.': </span></td><td>'.
                     '<table><tr><td valign="top">'."\n".
                     '<label><input type="radio" name="reqcrsotherdom_'.$item.
                     '" value=""'.$tooloff.' />'.$reqtitles{'norequest'}.
                     '</label></td>';
           foreach my $option (@options) {
               if ($option eq 'validate') {
                   my $canvalidate = 0;
                   if (ref($validations{$item}) eq 'HASH') {
                       if ($validations{$item}{'_external_'}) {
                           $canvalidate = 1;
                       }
                   }
                   next if (!$canvalidate);
               }
               my $checked = '';
               if ($option eq $curroption) {
                   $checked = ' checked="checked"';
               }
               $output .= '<td valign="top"><span class="LC_nobreak"><label>'.
                          '<input type="radio" name="reqcrsotherdom_'.$item.
                          '" value="'.$option.'"'.$checked.' />'.
                          $reqtitles{$option}.'</label>';
               if ($option eq 'autolimit') {
                   $output .= '&nbsp;<input type="text" name="reqcrsotherdom_'.
                              $item.'_limit" size="1" '.
                              'value="'.$currlimit.'" /></span>'.
                              '<br />'.$reqtitles{'unlimited'};
               } else {
                   $output .= '</span>';
               }
               $output .= '</td>';
           }
           $output .= '</td></tr></table></td>'."\n".
                    &Apache::loncommon::end_data_table_row()."\n";                     &Apache::loncommon::end_data_table_row()."\n";
     }      }
     return $output;      return $output;
 }  }
   
   sub courserequest_titles {
       my %titles = &Apache::lonlocal::texthash (
                                      official   => 'Official',
                                      unofficial => 'Unofficial',
                                      community  => 'Communities',
                                      norequest  => 'Not allowed',
                                      approval   => 'Approval by Dom. Coord.',
                                      validate   => 'With validation',
                                      autolimit  => 'Numerical limit',
                                      unlimited  => '(blank for unlimited)',
                    );
       return %titles;
   }
   
   sub courserequest_display {
       my %titles = &Apache::lonlocal::texthash (
                                      approval   => 'Yes, need approval',
                                      validate   => 'Yes, with validation',
                                      norequest  => 'No',
      );
      return %titles;
   }
   
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my ($r,$context,$response,$srch,$forcenewuser) = @_;      my ($r,$context,$response,$srch,$forcenewuser,$crstype) = @_;
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my $formtoset = 'crtuser';      my $formtoset = 'crtuser';
     if (exists($env{'form.startrolename'})) {      if (exists($env{'form.startrolename'})) {
Line 298  sub print_username_entry_form { Line 481  sub print_username_entry_form {
   
     my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n".      my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n".
         '<script type="text/javascript">'."\n".          '<script type="text/javascript">'."\n".
         &Apache::lonhtmlcommon::set_form_elements($elements->{$formtoset}).          '// <![CDATA['."\n".
           &Apache::lonhtmlcommon::set_form_elements($elements->{$formtoset})."\n".
           '// ]]>'."\n".
         '</script>'."\n";          '</script>'."\n";
   
       my %existingroles=&Apache::lonuserutils::my_custom_roles($crstype);
       if (($env{'form.action'} eq 'custom') && (keys(%existingroles) > 0)
           && (&Apache::lonnet::allowed('mcr','/'))) {
           $jscript .= &customrole_javascript();
       }
     my %loaditems = (      my %loaditems = (
                 'onload' => "javascript:setFormElements(document.$formtoset)",                  'onload' => "javascript:setFormElements(document.$formtoset)",
                     );                      );
     my %breadcrumb_text = &singleuser_breadcrumb();      my %breadcrumb_text = &singleuser_breadcrumb($crstype);
     my $start_page =      my $start_page =
  &Apache::loncommon::start_page('User Management',   &Apache::loncommon::start_page('User Management',
        $jscript,{'add_entries' => \%loaditems,});         $jscript,{'add_entries' => \%loaditems,});
Line 326  sub print_username_entry_form { Line 516  sub print_username_entry_form {
     }      }
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',      my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                      $helpitem);                                                       $helpitem);
     my %existingroles=&Apache::lonuserutils::my_custom_roles();  
     my $choice=&Apache::loncommon::select_form('make new role','rolename',  
  ('make new role' => 'Generate new role ...',%existingroles));  
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     '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',
   
                     'srad' => 'Search for a user and modify/add user information or roles',                      'srad' => 'Search for a user and modify/add user information or roles',
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
                     'ecrp' => "Edit Custom Role Privileges",                      'ecrp' => "Define or Edit Custom Role",
                     'nr'   => "Name of Role",                      'nr'   => "role name",
                     'cre'  => "Custom Role Editor",                      'cre'  => "Next",
        );         );
     $r->print($start_page."\n".$crumbs);      $r->print($start_page."\n".$crumbs);
     if ($env{'form.action'} eq 'custom') {      if ($env{'form.action'} eq 'custom') {
         if (&Apache::lonnet::allowed('mcr','/')) {          if (&Apache::lonnet::allowed('mcr','/')) {
             $r->print(<<ENDCUSTOM);              my $newroletext = &mt('Define new custom role:');
 <form action="/adm/createuser" method="post" name="docustom">              $r->print('<form action="/adm/createuser" method="post" name="docustom">'.
 <input type="hidden" name="action" value="$env{'form.action'}" />                        '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
 <input type="hidden" name="phase" value="selected_custom_edit" />                        '<input type="hidden" name="phase" value="selected_custom_edit" />'.
 <h3>$lt{'ecrp'}</h3>                        '<h3>'.$lt{'ecrp'}.'</h3>'.
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />                        &Apache::loncommon::start_data_table().
 <input name="customeditor" type="submit" value="$lt{'cre'}" />                        &Apache::loncommon::start_data_table_row().
 </form>                        '<td>');
 ENDCUSTOM              if (keys(%existingroles) > 0) {
                   $r->print('<br /><label><input type="radio" name="customroleaction" value="new" checked="checked" onclick="setCustomFields();" /><b>'.$newroletext.'</b></label>');
               } else {
                   $r->print('<br /><input type="hidden" name="customroleaction" value="new" /><b>'.$newroletext.'</b>');
               }
               $r->print('</td><td align="center">'.$lt{'nr'}.'<br /><input type="text" size="15" name="newrolename" onfocus="setCustomAction('."'new'".');" /></td>'.
                         &Apache::loncommon::end_data_table_row());
               if (keys(%existingroles) > 0) {
                   $r->print(&Apache::loncommon::start_data_table_row().'<td><br />'.
                             '<label><input type="radio" name="customroleaction" value="edit" onclick="setCustomFields();"/><b>'.
                             &mt('View/Modify existing role:').'</b></label></td>'.
                             '<td align="center"><br />'.
                             '<select name="rolename" onchange="setCustomAction('."'edit'".');">'.
                             '<option value="" selected="selected">'.
                             &mt('Select'));
                   foreach my $role (sort(keys(%existingroles))) {
                       $r->print('<option value="'.$role.'">'.$role.'</option>');
                   }
                   $r->print('</select>'.
                             '</td>'.
                             &Apache::loncommon::end_data_table_row());
               }
               $r->print(&Apache::loncommon::end_data_table().'<p>'.
                         '<input name="customeditor" type="submit" value="'.
                         $lt{'cre'}.'" /></p>'.
                         '</form>');
         }          }
     } else {      } else {
         my $actiontext = $lt{'srad'};          my $actiontext = $lt{'srad'};
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $actiontext = $lt{'srst'};              if ($crstype eq 'Community') {
                   $actiontext = $lt{'srme'};
               } else {
                   $actiontext = $lt{'srst'};
               }
         }          }
         $r->print("          $r->print("<h3>$actiontext</h3>");
 <h3>$actiontext</h3>");  
         if ($env{'form.origform'} ne 'crtusername') {          if ($env{'form.origform'} ne 'crtusername') {
             $r->print("\n".$response);              $r->print("\n".$response);
         }          }
         $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));          $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response,$crstype));
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub customrole_javascript {
       my $js = <<"END";
   <script type="text/javascript">
   // <![CDATA[
   
   function setCustomFields() {
       if (document.docustom.customroleaction.length > 0) {
           for (var i=0; i<document.docustom.customroleaction.length; i++) {
               if (document.docustom.customroleaction[i].checked) {
                   if (document.docustom.customroleaction[i].value == 'new') {
                       document.docustom.rolename.selectedIndex = 0;
                   } else {
                       document.docustom.newrolename.value = '';
                   }
               }
           }
       }
       return;
   }
   
   function setCustomAction(caller) {
       if (document.docustom.customroleaction.length > 0) {
           for (var i=0; i<document.docustom.customroleaction.length; i++) {
               if (document.docustom.customroleaction[i].value == caller) {
                   document.docustom.customroleaction[i].checked = true;
               }
           }
       }
       setCustomFields();
       return;
   }
   
   // ]]>
   </script>
   END
       return $js;
   }
   
 sub entry_form {  sub entry_form {
     my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;      my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my ($usertype,$inexact);      my ($usertype,$inexact);
     if (ref($srch) eq 'HASH') {      if (ref($srch) eq 'HASH') {
Line 407  ENDBLOCK Line 662  ENDBLOCK
         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(
                   'enro' => 'Enroll one student',                    'enro' => 'Enroll one student',
                     'enrm' => 'Enroll one member',
                   'admo' => 'Add/modify a single user',                    'admo' => 'Add/modify a single user',
                   'crea' => 'create new user if required',                    'crea' => 'create new user if required',
                   'uskn' => "username is known",                    'uskn' => "username is known",
Line 419  ENDBLOCK Line 675  ENDBLOCK
         my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');          my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');
         my ($title,$buttontext,$showresponse);          my ($title,$buttontext,$showresponse);
         if ($env{'form.action'} eq 'singlestudent') {             if ($env{'form.action'} eq 'singlestudent') {   
             $title = $lt{'enro'};              if ($crstype eq 'Community') {
                   $title = $lt{'enrm'};
               } else {
                   $title = $lt{'enro'};
               }
             $buttontext = $lt{'enrl'};              $buttontext = $lt{'enrl'};
         } else {          } else {
             $title = $lt{'admo'};              $title = $lt{'admo'};
Line 465  sub user_modification_js { Line 725  sub user_modification_js {
           
     return <<END;      return <<END;
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   // <![CDATA[
   
     function pclose() {      function pclose() {
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",          parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
Line 482  sub user_modification_js { Line 743  sub user_modification_js {
     }      }
   
     $nondc_setsection_code      $nondc_setsection_code
   // ]]>
 </script>  </script>
 END  END
 }  }
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_selection_page {  sub print_user_selection_page {
     my ($r,$response,$srch,$srch_results,$srcharray,$context) = @_;      my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype) = @_;
     my @fields = ('username','domain','lastname','firstname','permanentemail');      my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $sortby = $env{'form.sortby'};      my $sortby = $env{'form.sortby'};
   
Line 501  sub print_user_selection_page { Line 762  sub print_user_selection_page {
   
     my $jscript = (<<ENDSCRIPT);      my $jscript = (<<ENDSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function pickuser(uname,udom) {  function pickuser(uname,udom) {
     document.usersrchform.seluname.value=uname;      document.usersrchform.seluname.value=uname;
     document.usersrchform.seludom.value=udom;      document.usersrchform.seludom.value=udom;
Line 509  function pickuser(uname,udom) { Line 771  function pickuser(uname,udom) {
 }  }
   
 $jsback  $jsback
   // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
   
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                                        'usrch'          => "User Search to add/modify roles",                                         'usrch'          => "User Search to add/modify roles",
                                        'stusrch'        => "User Search to enroll student",                                         'stusrch'        => "User Search to enroll student",
                                          'memsrch'        => "User Search to enroll member",
                                        'usel'           => "Select a user to add/modify roles",                                         'usel'           => "Select a user to add/modify 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",
                                        'username'       => "username",                                         'username'       => "username",
                                        'domain'         => "domain",                                         'domain'         => "domain",
                                        'lastname'       => "last name",                                         'lastname'       => "last name",
                                        'firstname'      => "first name",                                         'firstname'      => "first name",
                                        'permanentemail' => "permanent e-mail",                                         'permanentemail' => "permanent e-mail",
                                       );                                        );
     $r->print(&Apache::loncommon::start_page('User Management',$jscript));      if ($context eq 'requestcrs') {
           $r->print('<div>');
       } else {
           $r->print(&Apache::loncommon::start_page('User Management',$jscript));
   
     my %breadcrumb_text = &singleuser_breadcrumb();          my %breadcrumb_text = &singleuser_breadcrumb($crstype);
     &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"javascript:backPage(document.usersrchform,'','')",              ({href=>"javascript:backPage(document.usersrchform,'','')",
           text=>$breadcrumb_text{'search'},                text=>$breadcrumb_text{'search'},
           faq=>282,bug=>'Instructor Interface',},                faq=>282,bug=>'Instructor Interface',},
          {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",               {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
           text=>$breadcrumb_text{'userpicked'},                text=>$breadcrumb_text{'userpicked'},
           faq=>282,bug=>'Instructor Interface',});                faq=>282,bug=>'Instructor Interface',});
     if ($env{'form.action'} eq 'singleuser') {          if ($env{'form.action'} eq 'singleuser') {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                       'Course_Change_Privileges'));                                                            'Course_Change_Privileges'));
         $r->print("<b>$lt{'usrch'}</b><br />");              $r->print("<b>$lt{'usrch'}</b><br />");
         $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));              $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
         $r->print('<h3>'.$lt{'usel'}.'</h3>');              $r->print('<h3>'.$lt{'usel'}.'</h3>');
     } elsif ($env{'form.action'} eq 'singlestudent') {          } elsif ($env{'form.action'} eq 'singlestudent') {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                       'Course_Add_Student'));                                                            'Course_Add_Student'));
         $r->print($jscript."<b>$lt{'stusrch'}</b><br />");              $r->print($jscript."<b>");
         $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));              if ($crstype eq 'Community') {
         $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');                  $r->print($lt{'memsrch'});
               } else {
                   $r->print($lt{'stusrch'});
               }
               $r->print("</b><br />");
               $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
               $r->print('</form><h3>');
               if ($crstype eq 'Community') {
                   $r->print($lt{'memsel'});
               } else {
                   $r->print($lt{'stusel'});
               }
               $r->print('</h3>');
           }
     }      }
     $r->print('<form name="usersrchform" method="post">'.      $r->print('<form name="usersrchform" method="post">'.
               &Apache::loncommon::start_data_table()."\n".                &Apache::loncommon::start_data_table()."\n".
Line 569  ENDSCRIPT Line 850  ENDSCRIPT
   
     foreach my $user (@sorted_users) {      foreach my $user (@sorted_users) {
         my ($uname,$udom) = split(/:/,$user);          my ($uname,$udom) = split(/:/,$user);
           my $onclick;
           if ($context eq 'requestcrs') {
               $onclick =
                   'onclick="javascript:gochoose('."'$uname','$udom',".
                                                  "'$srch_results->{$user}->{firstname}',".
                                                  "'$srch_results->{$user}->{lastname}',".
                                                  "'$srch_results->{$user}->{permanentemail}'".');"';
           } else {
               $onclick =
                   ' onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".');"';
           }
         $r->print(&Apache::loncommon::start_data_table_row().          $r->print(&Apache::loncommon::start_data_table_row().
                   '<td><input type="button" name="seluser" value="'.&mt('Select').'" onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".')" /></td>'.                    '<td><input type="button" name="seluser" value="'.&mt('Select').'" '.
                     $onclick.' /></td>'.
                   '<td><tt>'.$uname.'</tt></td>'.                    '<td><tt>'.$uname.'</tt></td>'.
                   '<td><tt>'.$udom.'</tt></td>');                    '<td><tt>'.$udom.'</tt></td>');
         foreach my $field ('lastname','firstname','permanentemail') {          foreach my $field ('lastname','firstname','permanentemail') {
Line 590  ENDSCRIPT Line 883  ENDSCRIPT
               ' <input type="hidden" name="currstate" value="select" />'."\n".                ' <input type="hidden" name="currstate" value="select" />'."\n".
               ' <input type="hidden" name="phase" value="get_user_info" />'."\n".                ' <input type="hidden" name="phase" value="get_user_info" />'."\n".
               ' <input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n");                ' <input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n");
     $r->print($response.'</form>'.&Apache::loncommon::end_page());      if ($context eq 'requestcrs') {
           $r->print($opener_elements.'</form></div>');
       } else {
           $r->print($response.'</form>'.&Apache::loncommon::end_page());
       }
 }  }
   
 sub print_user_query_page {  sub print_user_query_page {
Line 602  sub print_user_query_page { Line 899  sub print_user_query_page {
 }  }
   
 sub print_user_modification_page {  sub print_user_modification_page {
     my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;      my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype) = @_;
     if (($ccuname eq '') || ($ccdomain eq '')) {      if (($ccuname eq '') || ($ccdomain eq '')) {
         my $usermsg = &mt('No username and/or domain provided.');          my $usermsg = &mt('No username and/or domain provided.');
         $env{'form.phase'} = '';          $env{'form.phase'} = '';
  &print_username_entry_form($r,$context,$usermsg);   &print_username_entry_form($r,$context,$usermsg,'','',$crstype);
         return;          return;
     }      }
     my ($form,$formname);      my ($form,$formname);
Line 630  sub print_user_modification_page { Line 927  sub print_user_modification_page {
             &Apache::lonuserutils::can_create_user($ccdomain,$context,              &Apache::lonuserutils::can_create_user($ccdomain,$context,
                                                    $usertype);                                                     $usertype);
         if (!$cancreate) {          if (!$cancreate) {
             my $helplink = ' href="javascript:helpMenu('."'display'".')"';              my $helplink = 'javascript:helpMenu('."'display'".')';
             my %usertypetext = (              my %usertypetext = (
                 official   => 'institutional',                  official   => 'institutional',
                 unofficial => 'non-institutional',                  unofficial => 'non-institutional',
Line 640  sub print_user_modification_page { Line 937  sub print_user_modification_page {
                 $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).                  $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).
                             '</span><br />';                              '</span><br />';
             }              }
             $response .= '<span class="LC_warning">'.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the <a[_1]>helpdesk</a> for assistance.',$helplink).'</span><br /><br />';              $response .= '<p class="LC_warning">'
                           .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
                           .' '
                           .&mt('Please contact the [_1]helpdesk[_2] for assistance.'
                               ,'<a href="'.$helplink.'">','</a>')
                           .'</p><br />';
             $env{'form.phase'} = '';              $env{'form.phase'} = '';
             &print_username_entry_form($r,$context,$response);              &print_username_entry_form($r,$context,$response,undef,undef,$crstype);
             return;              return;
         }          }
         $newuser = 1;          $newuser = 1;
Line 666  sub print_user_modification_page { Line 968  sub print_user_modification_page {
                             'username');                              'username');
                     }                      }
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$userchkmsg);                      &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype);
                     return;                      return;
                 }                  }
             }              }
Line 693  sub print_user_modification_page { Line 995  sub print_user_modification_page {
     }      }
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('User Management',$js,$args);   &Apache::loncommon::start_page('User Management',$js,$args);
     my %breadcrumb_text = &singleuser_breadcrumb();      my %breadcrumb_text = &singleuser_breadcrumb($crstype);
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage($form)",       ({href=>"javascript:backPage($form)",
        text=>$breadcrumb_text{'search'},         text=>$breadcrumb_text{'search'},
Line 725  sub print_user_modification_page { Line 1027  sub print_user_modification_page {
 <input type="hidden" name="pres_type"   value="" />  <input type="hidden" name="pres_type"   value="" />
 <input type="hidden" name="pres_marker" value="" />  <input type="hidden" name="pres_marker" value="" />
 ENDFORMINFO  ENDFORMINFO
     my %inccourses;      my (%inccourses,$roledom);
     foreach my $key (keys(%env)) {      if ($context eq 'course') {
  if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {          $inccourses{$env{'request.course.id'}}=1;
     $inccourses{$1.'_'.$2}=1;          $roledom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       } elsif ($context eq 'author') {
           $roledom = $env{'request.role.domain'};
       } elsif ($context eq 'domain') {
           foreach my $key (keys(%env)) {
               $roledom = $env{'request.role.domain'};
               if ($key=~/^user\.priv\.cm\.\/($roledom)\/($match_username)/) {
                   $inccourses{$1.'_'.$2}=1;
               }
           }
       } else {
           foreach my $key (keys(%env)) {
               if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {
                   $inccourses{$1.'_'.$2}=1;
               }
         }          }
     }      }
     if ($newuser) {      if ($newuser) {
Line 742  ENDFORMINFO Line 1058  ENDFORMINFO
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                 'cnu'            => 'Create New User',                  'cnu'            => 'Create New User',
                 'ast'            => 'as a student',                  'ast'            => 'as a student',
                   'ame'            => 'as a member',
                 'ind'            => 'in domain',                  'ind'            => 'in domain',
                 'lg'             => 'Login Data',                  'lg'             => 'Login Data',
                 'hs'             => "Home Server",                  'hs'             => "Home Server",
Line 752  $crumbs Line 1069  $crumbs
 $response  $response
 $forminfo  $forminfo
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   // <![CDATA[
 $loginscript  $loginscript
   // ]]>
 </script>  </script>
 <input type='hidden' name='makeuser' value='1' />  <input type='hidden' name='makeuser' value='1' />
 <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain  <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain
 ENDTITLE  ENDTITLE
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $r->print(' ('.$lt{'ast'}.')');              if ($crstype eq 'Community') {
                   $r->print(' ('.$lt{'ame'}.')');
               } else {
                   $r->print(' ('.$lt{'ast'}.')');
               }
         }          }
         $r->print('</h2>'."\n".'<div class="LC_left_float">');          $r->print('</h2>'."\n".'<div class="LC_left_float">');
         my $personal_table =           my $personal_table = 
Line 776  $lt{'hs'}: $home_server_pick Line 1099  $lt{'hs'}: $home_server_pick
         } else {          } else {
             $r->print($home_server_pick);              $r->print($home_server_pick);
         }          }
           if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
               $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
                         &Apache::loncommon::start_data_table().
                         &build_tools_display($ccuname,$ccdomain,
                                              'requestcourses').
                         &Apache::loncommon::end_data_table());
           }
         $r->print('</div>'."\n".'<div class="LC_left_float"><h3>'.          $r->print('</div>'."\n".'<div class="LC_left_float"><h3>'.
                   $lt{'lg'}.'</h3>');                    $lt{'lg'}.'</h3>');
         my ($fixedauth,$varauth,$authmsg);           my ($fixedauth,$varauth,$authmsg); 
Line 809  KERB Line 1139  KERB
                             } else {                              } else {
                                 if ($authtype eq 'int') {                                  if ($authtype eq 'int') {
                                     $varauth = '<br />'.                                      $varauth = '<br />'.
 &mt('[_1] Internally authenticated (with initial password [_2])','','<input type="password" size="10" name="intarg" value="" />')."<label><input type=\"checkbox\" name=\"visible\" onClick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';  &mt('[_1] Internally authenticated (with initial password [_2])','','<input type="password" size="10" name="intarg" value="" />')."<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
                                 } elsif ($authtype eq 'loc') {                                  } elsif ($authtype eq 'loc') {
                                     $varauth = '<br />'.                                      $varauth = '<br />'.
 &mt('[_1] Local Authentication with argument [_2]','','<input type="text" name="'.$authtype.'arg" value="" />')."\n";  &mt('[_1] Local Authentication with argument [_2]','','<input type="text" name="'.$authtype.'arg" value="" />')."\n";
Line 844  ENDAUTH Line 1174  ENDAUTH
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Modify existing user: ",                      'cup'  => "Modify existing user: ",
                     'ens'  => "Enroll one student: ",                      'ens'  => "Enroll one student: ",
                       'enm'  => "Enroll one member: ",
                     'id'   => "in domain",                      'id'   => "in domain",
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
Line 853  $forminfo Line 1184  $forminfo
 <h2>  <h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $r->print($lt{'ens'});              if ($crstype eq 'Community') {
                   $r->print($lt{'enm'});
               } else {
                   $r->print($lt{'ens'});
               }
         } else {          } else {
             $r->print($lt{'cup'});              $r->print($lt{'cup'});
         }          }
Line 867  ENDCHANGEUSER Line 1202  ENDCHANGEUSER
             $r->print(&Apache::lonuserutils::forceid_change($context));              $r->print(&Apache::lonuserutils::forceid_change($context));
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $r->print('<h3>'.&mt('User Can Request Creation of Courses?').'</h3>'.              $r->print('<h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table().                        &Apache::loncommon::start_data_table());
                       &build_tools_display($ccuname,$ccdomain,'requestcourse').              if ($env{'request.role.domain'} eq $ccdomain) {
                       &Apache::loncommon::end_data_table());                  $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
               } else {
                   $r->print(&coursereq_externaluser($ccuname,$ccdomain,
                                                     $env{'request.role.domain'}));
               }
               $r->print(&Apache::loncommon::end_data_table());
         }          }
         $r->print('</div>');          $r->print('</div>');
         my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);          my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);
Line 900  ENDNOPORTPRIV Line 1240  ENDNOPORTPRIV
             if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) {              if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) {
                 my %lt=&Apache::lonlocal::texthash(                  my %lt=&Apache::lonlocal::texthash(
                     'utav'  => "User Tools Availability",                      'utav'  => "User Tools Availability",
                     'yodo'  => "You do not have privileges to modify Portfolio, Blog or Home Page settings for this user.",                      'yodo'  => "You do not have privileges to modify Portfolio, Blog or Personal Information Page settings for this user.",
                     'ifch'  => "If a change is required, contact a domain coordinator for the domain",                      'ifch'  => "If a change is required, contact a domain coordinator for the domain",
                 );                  );
                 $user_tools_text = <<ENDNOTOOLSPRIV;                  $user_tools_text = <<ENDNOTOOLSPRIV;
Line 941  ENDNOTOOLSPRIV Line 1281  ENDNOTOOLSPRIV
         }          }
         $r->print('</div><div class="LC_clear_float_footer"></div>');          $r->print('</div><div class="LC_clear_float_footer"></div>');
         if ($env{'form.action'} ne 'singlestudent') {          if ($env{'form.action'} ne 'singlestudent') {
             &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);              &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,
                                       $roledom,$crstype);
         }          }
     } ## End of new user/old user logic      } ## End of new user/old user logic
   
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onClick="setSections(this.form)" />'."\n");          my $btntxt;
           if ($crstype eq 'Community') {
               $btntxt = &mt('Enroll Member');
           } else {
               $btntxt = &mt('Enroll Student');
           }
           $r->print('<br /><input type="button" value="'.$btntxt.'" onclick="setSections(this.form)" />'."\n");
     } else {      } else {
         $r->print('<h3>'.&mt('Add Roles').'</h3>');          $r->print('<h3>'.&mt('Add Roles').'</h3>');
         my $addrolesdisplay = 0;          my $addrolesdisplay = 0;
Line 959  ENDNOTOOLSPRIV Line 1305  ENDNOTOOLSPRIV
                 $addrolesdisplay = $add_domainroles;                  $addrolesdisplay = $add_domainroles;
             }              }
             $r->print(&course_level_dc($env{'request.role.domain'},'Course'));              $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
             $r->print('<br /><input type="button" value="'.&mt('Save').'" onClick="setCourse()" />'."\n");              $r->print('<br /><input type="button" value="'.&mt('Save').'" onclick="setCourse()" />'."\n");
         } elsif ($context eq 'author') {          } elsif ($context eq 'author') {
             if ($addrolesdisplay) {              if ($addrolesdisplay) {
                 $r->print('<br /><input type="button" value="'.&mt('Save').'"');                  $r->print('<br /><input type="button" value="'.&mt('Save').'"');
                 if ($newuser) {                  if ($newuser) {
                     $r->print(' onClick="auth_check()" \>'."\n");                      $r->print(' onclick="auth_check()" \>'."\n");
                 } else {                  } else {
                     $r->print('onClick="this.form.submit()" \>'."\n");                      $r->print('onclick="this.form.submit()" \>'."\n");
                 }                  }
             } else {              } else {
                 $r->print('<br /><a href="javascript:backPage(document.cu)">'.                  $r->print('<br /><a href="javascript:backPage(document.cu)">'.
Line 974  ENDNOTOOLSPRIV Line 1320  ENDNOTOOLSPRIV
             }              }
         } else {          } else {
             $r->print(&course_level_table(%inccourses));              $r->print(&course_level_table(%inccourses));
             $r->print('<br /><input type="button" value="'.&mt('Save').'" onClick="setSections(this.form)" />'."\n");              $r->print('<br /><input type="button" value="'.&mt('Save').'" onclick="setSections(this.form)" />'."\n");
         }          }
     }      }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));      $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
Line 985  ENDNOTOOLSPRIV Line 1331  ENDNOTOOLSPRIV
 }  }
   
 sub singleuser_breadcrumb {  sub singleuser_breadcrumb {
       my ($crstype) = @_;
     my %breadcrumb_text;      my %breadcrumb_text;
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         $breadcrumb_text{'search'} = 'Enroll a student';          if ($crstype eq 'Community') {
               $breadcrumb_text{'search'} = 'Enroll a member';
           } else {
               $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',
     } else {      } else {
Line 1042  sub validation_javascript { Line 1393  sub validation_javascript {
                                    $nondc_setsection_code,$groupslist);                                     $nondc_setsection_code,$groupslist);
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     $js .= "\n".      $js .= "\n".
            '<script type="text/javascript">'."\n".$jsback."\n".'</script>';             '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".
              $jsback."\n".
              '// ]]>'."\n".
              '</script>'."\n";
     return $js;      return $js;
 }  }
   
 sub display_existing_roles {  sub display_existing_roles {
     my ($r,$ccuname,$ccdomain,$inccourses) = @_;      my ($r,$ccuname,$ccdomain,$inccourses,$context,$roledom,$crstype) = @_;
     my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);      my $now=time;
     # Build up table of user roles to allow revocation and re-enabling of roles.      my %lt=&Apache::lonlocal::texthash(
     my ($tmp) = keys(%rolesdump);  
     if ($tmp !~ /^(con_lost|error)/i) {  
         my $now=time;  
         my %lt=&Apache::lonlocal::texthash(  
                     'rer'  => "Existing Roles",                      'rer'  => "Existing Roles",
                     'rev'  => "Revoke",                      'rev'  => "Revoke",
                     'del'  => "Delete",                      'del'  => "Delete",
Line 1063  sub display_existing_roles { Line 1414  sub display_existing_roles {
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End",                      'end'  => "End",
                                        );                                         );
         my (%roletext,%sortrole,%roleclass,%rolepriv);      my (%rolesdump,%roletext,%sortrole,%roleclass,%rolepriv);
         foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);      if ($context eq 'course' || $context eq 'author') {
                                     my $b1=join('_',(split('_',$b))[1,0]);          my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype);
                                     return $a1 cmp $b1;          my %roleshash =
                                 } keys(%rolesdump)) {              &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles',
             next if ($area =~ /^rolesdef/);                                ['active','previous','future'],\@roles,$roledom,1);
             my $envkey=$area;          foreach my $key (keys(%roleshash)) {
             my $role = $rolesdump{$area};              my ($start,$end) = split(':',$roleshash{$key});
             my $thisrole=$area;              next if ($start eq '-1' || $end eq '-1');
             $area =~ s/\_\w\w$//;              my ($rnum,$rdom,$role,$sec) = split(':',$key);
             my ($role_code,$role_end_time,$role_start_time) =              if ($context eq 'course') {
                 split(/_/,$role);                  next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'})
                                && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'}));
               } elsif ($context eq 'author') {
                   next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'}));
               }
               my ($newkey,$newvalue,$newrole);
               $newkey = '/'.$rdom.'/'.$rnum;
               if ($sec ne '') {
                   $newkey .= '/'.$sec;
               }
               $newvalue = $role;
               if ($role =~ /^cr/) {
                   $newrole = 'cr';
               } else {
                   $newrole = $role;
               }
               $newkey .= '_'.$newrole;
               if ($start ne '' && $end ne '') {
                   $newvalue .= '_'.$end.'_'.$start;
               }
               $rolesdump{$newkey} = $newvalue;
           }
       } else {
           %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
       }
       # Build up table of user roles to allow revocation and re-enabling of roles.
       my ($tmp) = keys(%rolesdump);
       return if ($tmp =~ /^(con_lost|error)/i);
       foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
                                   my $b1=join('_',(split('_',$b))[1,0]);
                                   return $a1 cmp $b1;
                               } keys(%rolesdump)) {
           next if ($area =~ /^rolesdef/);
           my $envkey=$area;
           my $role = $rolesdump{$area};
           my $thisrole=$area;
           $area =~ s/\_\w\w$//;
           my ($role_code,$role_end_time,$role_start_time) =
               split(/_/,$role);
 # Is this a custom role? Get role owner and title.  # Is this a custom role? Get role owner and title.
             my ($croleudom,$croleuname,$croletitle)=          my ($croleudom,$croleuname,$croletitle)=
                 ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});              ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
             my $allowed=0;          my $allowed=0;
             my $delallowed=0;          my $delallowed=0;
             my $sortkey=$role_code;          my $sortkey=$role_code;
             my $class='Unknown';          my $class='Unknown';
             if ($area =~ m{^/($match_domain)/($match_courseid)} ) {          if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
                 $class='Course';              $class='Course';
                 my ($coursedom,$coursedir) = ($1,$2);              my ($coursedom,$coursedir) = ($1,$2);
                 $sortkey.="\0$coursedom";              $sortkey.="\0$coursedom";
                 # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).              # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                 my %coursedata=              my %coursedata=
                     &Apache::lonnet::coursedescription($1.'_'.$2);                  &Apache::lonnet::coursedescription($1.'_'.$2);
                 my $carea;              if ($coursedir =~ /^$match_community$/) {
                 if (defined($coursedata{'description'})) {                  $class='Community';
                     $carea=$coursedata{'description'}.              }
                         '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).              $sortkey.="\0$coursedom";
               my $carea;
               if (defined($coursedata{'description'})) {
                   $carea=$coursedata{'description'}.
                       '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);       &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
                     $sortkey.="\0".$coursedata{'description'};                  $sortkey.="\0".$coursedata{'description'};
                     $class=$coursedata{'type'};                  $class=$coursedata{'type'};
               } else {
                   if ($class eq 'Community') {
                       $carea=&mt('Unavailable community').': '.$area;
                       $sortkey.="\0".&mt('Unavailable community').': '.$area;
                 } else {                  } else {
                     $carea=&mt('Unavailable course').': '.$area;                      $carea=&mt('Unavailable course').': '.$area;
                     $sortkey.="\0".&mt('Unavailable course').': '.$area;                      $sortkey.="\0".&mt('Unavailable course').': '.$area;
                 }                  }
                 $sortkey.="\0$coursedir";              }
                 $inccourses->{$1.'_'.$2}=1;              $sortkey.="\0$coursedir";
                 if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||              $inccourses->{$1.'_'.$2}=1;
               if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
                   (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                   $allowed=1;
               }
               unless ($allowed) {
                   my $isowner = &is_courseowner($cid,$coursedata{'internal.courseowner'});
                   if ($isowner) {
                       if (($role_code eq 'co') && ($class eq 'Community')) {
                           $allowed = 1;
                       } elsif (($role_code eq 'cc') && ($class eq 'Course')) {
                           $allowed = 1;
                       }
                   }
               }
               if ((&Apache::lonnet::allowed('dro',$1)) ||
                   (&Apache::lonnet::allowed('dro',$ccdomain))) {
                  $delallowed=1;
               }
   # - custom role. Needs more info, too
               if ($croletitle) {
                   if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
                       $allowed=1;
                       $thisrole.='.'.$role_code;
                   }
               }
               if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
                   $carea.='<br />Section: '.$3;
                   $sortkey.="\0$3";
                   if (!$allowed) {
                      if ($env{'request.course.sec'} eq $3) {
                          if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
                              $allowed = 1;
                          }
                      }
                   }
               }
               $area=$carea;
           } else {
               $sortkey.="\0".$area;
               # Determine if current user is able to revoke privileges
               if ($area=~m{^/($match_domain)/}) {
                   if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                     (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                      (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                     $allowed=1;                      $allowed=1;
                 }                  }
                 if ((&Apache::lonnet::allowed('dro',$1)) ||                  if (((&Apache::lonnet::allowed('dro',$1))  ||
                     (&Apache::lonnet::allowed('dro',$ccdomain))) {                      (&Apache::lonnet::allowed('dro',$ccdomain))) &&
                       ($role_code ne 'dc')) {
                     $delallowed=1;                      $delallowed=1;
                 }                  }
 # - custom role. Needs more info, too  
                 if ($croletitle) {  
                     if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {  
                         $allowed=1;  
                         $thisrole.='.'.$role_code;  
                     }  
                 }  
                 # Compute the background color based on $area  
                 if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {  
                     $carea.='<br />Section: '.$3;  
                     $sortkey.="\0$3";  
                     if (!$allowed) {  
                         if ($env{'request.course.sec'} eq $3) {  
                             if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {  
                                 $allowed = 1;  
                             }  
                         }  
                     }  
                 }  
                 $area=$carea;  
             } else {              } else {
                 $sortkey.="\0".$area;                  if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
                 # Determine if current user is able to revoke privileges  
                 if ($area=~m{^/($match_domain)/}) {  
                     if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||  
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {  
                         $allowed=1;  
                     }  
                     if (((&Apache::lonnet::allowed('dro',$1))  ||  
                          (&Apache::lonnet::allowed('dro',$ccdomain))) &&  
                         ($role_code ne 'dc')) {  
                         $delallowed=1;  
                     }  
                 } else {  
                     if (&Apache::lonnet::allowed('c'.$role_code,'/')) {  
                         $allowed=1;  
                     }  
                 }  
                 if ($role_code eq 'ca' || $role_code eq 'au') {  
                     $class='Construction Space';  
                 } elsif ($role_code eq 'su') {  
                     $class='System';  
                 } else {  
                     $class='Domain';  
                 }  
             }  
             if (($role_code eq 'ca') || ($role_code eq 'aa')) {  
                 $area=~m{/($match_domain)/($match_username)};  
                 if (&Apache::lonuserutils::authorpriv($2,$1)) {  
                     $allowed=1;                      $allowed=1;
                 } else {  
                     $allowed=0;  
                 }                  }
             }              }
             my $row = '';              if ($role_code eq 'ca' || $role_code eq 'au') {
             $row.= '<td>';                  $class='Construction Space';
             my $active=1;              } elsif ($role_code eq 'su') {
             $active=0 if (($role_end_time) && ($now>$role_end_time));                  $class='System';
             if (($active) && ($allowed)) {  
                 $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';  
             } else {              } else {
                 if ($active) {                  $class='Domain';
                    $row.='&nbsp;';  
                 } else {  
                    $row.=&mt('expired or revoked');  
                 }  
             }              }
             $row.='</td><td>';          }
             if ($allowed && !$active) {          if (($role_code eq 'ca') || ($role_code eq 'aa')) {
                 $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';              $area=~m{/($match_domain)/($match_username)};
               if (&Apache::lonuserutils::authorpriv($2,$1)) {
                   $allowed=1;
             } else {              } else {
                 $row.='&nbsp;';                  $allowed=0;
             }              }
             $row.='</td><td>';          }
             if ($delallowed) {          my $row = '';
                 $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';          $row.= '<td>';
           my $active=1;
           $active=0 if (($role_end_time) && ($now>$role_end_time));
           if (($active) && ($allowed)) {
               $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
           } else {
               if ($active) {
                  $row.='&nbsp;';
             } else {              } else {
                 $row.='&nbsp;';                 $row.=&mt('expired or revoked');
             }              }
             my $plaintext='';          }
             if (!$croletitle) {          $row.='</td><td>';
                 $plaintext=&Apache::lonnet::plaintext($role_code,$class)          if ($allowed && !$active) {
             } else {              $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
                 $plaintext=          } else {
               $row.='&nbsp;';
           }
           $row.='</td><td>';
           if ($delallowed) {
               $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
           } else {
               $row.='&nbsp;';
           }
           my $plaintext='';
           if (!$croletitle) {
               $plaintext=&Apache::lonnet::plaintext($role_code,$class)
           } else {
               $plaintext=
         "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";          "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
           }
           $row.= '</td><td>'.$plaintext.
                  '</td><td>'.$area.
                  '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)
                                               : '&nbsp;' ).
                 '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)
                                               : '&nbsp;' )
                  ."</td>";
           $sortrole{$sortkey}=$envkey;
           $roletext{$envkey}=$row;
           $roleclass{$envkey}=$class;
           $rolepriv{$envkey}=$allowed;
       } # end of foreach        (table building loop)
       my $rolesdisplay = 0;
       my %output = ();
       foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {
           $output{$type} = '';
           foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
               if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
                   $output{$type}.=
                         &Apache::loncommon::start_data_table_row().
                         $roletext{$sortrole{$which}}.
                         &Apache::loncommon::end_data_table_row();
               }
           }
           unless($output{$type} eq '') {
               $output{$type} = '<tr class="LC_info_row">'.
                         "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
                         $output{$type};
               $rolesdisplay = 1;
           }
       }
       if ($rolesdisplay == 1) {
           my $contextrole='';
           if ($env{'request.course.id'}) {
               if (&Apache::loncommon::course_type() eq 'Community') {
                   $contextrole = &mt('Existing Roles in this Community');
               } else {
                   $contextrole = &mt('Existing Roles in this Course');
             }              }
             $row.= '</td><td>'.$plaintext.          } elsif ($env{'request.role'} =~ /^au\./) {
                    '</td><td>'.$area.              $contextrole = 'Existing Co-Author Roles in your Construction Space';
                    '</td><td>'.($role_start_time?localtime($role_start_time)          } else {
                                                 : '&nbsp;' ).              $contextrole = 'Existing Roles in this Domain';
                    '</td><td>'.($role_end_time  ?localtime($role_end_time)  
                                                 : '&nbsp;' )  
                    ."</td>";  
             $sortrole{$sortkey}=$envkey;  
             $roletext{$envkey}=$row;  
             $roleclass{$envkey}=$class;  
             $rolepriv{$envkey}=$allowed;  
             #$r->print($row);  
         } # end of foreach        (table building loop)  
         my $rolesdisplay = 0;  
         my %output = ();  
         foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {  
             $output{$type} = '';  
             foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {  
                 if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {  
                     $output{$type}.=  
                           &Apache::loncommon::start_data_table_row().  
                           $roletext{$sortrole{$which}}.  
                           &Apache::loncommon::end_data_table_row();  
                 }  
             }  
             unless($output{$type} eq '') {  
                 $output{$type} = '<tr class="LC_info_row">'.  
                           "<td align='center' colspan='7'>".&mt($type)."</td></tr>".  
                            $output{$type};  
                 $rolesdisplay = 1;  
             }  
         }          }
         if ($rolesdisplay == 1) {          $r->print('
             $r->print('  
 <h3>'.$lt{'rer'}.'</h3>'.  <h3>'.$lt{'rer'}.'</h3>'.
   '<div>'.&mt($contextrole).'</div>'.
 &Apache::loncommon::start_data_table("LC_createuser").  &Apache::loncommon::start_data_table("LC_createuser").
 &Apache::loncommon::start_data_table_header_row().  &Apache::loncommon::start_data_table_header_row().
 '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.  '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.
 '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.  '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
 '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.  '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
 &Apache::loncommon::end_data_table_header_row());  &Apache::loncommon::end_data_table_header_row());
            foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {          foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {
                 if ($output{$type}) {              if ($output{$type}) {
                     $r->print($output{$type}."\n");                  $r->print($output{$type}."\n");
                 }  
             }              }
             $r->print(&Apache::loncommon::end_data_table());  
         }          }
     }  # End of check for keys in rolesdump          $r->print(&Apache::loncommon::end_data_table());
       }
     return;      return;
 }  }
   
Line 1282  sub new_coauthor_roles { Line 1700  sub new_coauthor_roles {
                   &Apache::loncommon::end_data_table_header_row()."\n".                    &Apache::loncommon::end_data_table_header_row()."\n".
                   &Apache::loncommon::start_data_table_row().'                    &Apache::loncommon::start_data_table_row().'
            <td>             <td>
             <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />              <input type="checkbox" name="act_'.$cudom.'_'.$cuname.'_ca" />
            </td>             </td>
            <td>'.$lt{'cau'}.'</td>             <td>'.$lt{'cau'}.'</td>
            <td>'.$cudom.'_'.$cuname.'</td>             <td>'.$cudom.'_'.$cuname.'</td>
Line 1294  sub new_coauthor_roles { Line 1712  sub new_coauthor_roles {
 "javascript:pjump('."'date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".  "javascript:pjump('."'date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
               &Apache::loncommon::end_data_table_row()."\n".                &Apache::loncommon::end_data_table_row()."\n".
               &Apache::loncommon::start_data_table_row()."\n".                &Apache::loncommon::start_data_table_row()."\n".
 '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>  '<td><input type="checkbox" name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
 <td>'.$lt{'caa'}.'</td>  <td>'.$lt{'caa'}.'</td>
 <td>'.$cudom.'_'.$cuname.'</td>  <td>'.$cudom.'_'.$cuname.'</td>
 <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_aa" value="" />  <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_aa" value="" />
Line 1334  sub new_domain_roles { Line 1752  sub new_domain_roles {
     &mt('Extent').'</th>'.      &mt('Extent').'</th>'.
     '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.      '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.
     &Apache::loncommon::end_data_table_header_row();      &Apache::loncommon::end_data_table_header_row();
       my @allroles = &Apache::lonuserutils::roles_by_context('domain');
     foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {      foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {
         foreach my $role ('dc','li','dg','au','sc') {          foreach my $role (@allroles) {
               next if ($role eq 'ad');
             if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {              if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
                my $plrole=&Apache::lonnet::plaintext($role);                 my $plrole=&Apache::lonnet::plaintext($role);
                my %lt=&Apache::lonlocal::texthash(                 my %lt=&Apache::lonlocal::texthash(
Line 1345  sub new_domain_roles { Line 1765  sub new_domain_roles {
                $num_domain_level ++;                 $num_domain_level ++;
                $domaintext .=                 $domaintext .=
 &Apache::loncommon::start_data_table_row().  &Apache::loncommon::start_data_table_row().
 '<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>  '<td><input type="checkbox" name="act_'.$thisdomain.'_'.$role.'" /></td>
 <td>'.$plrole.'</td>  <td>'.$plrole.'</td>
 <td>'.$thisdomain.'</td>  <td>'.$thisdomain.'</td>
 <td><input type="hidden" name="start_'.$thisdomain.'_'.$role.'" value="" />  <td><input type="hidden" name="start_'.$thisdomain.'_'.$role.'" value="" />
Line 1386  sub user_authentication { Line 1806  sub user_authentication {
             my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);              my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
             $outcome = <<ENDBADAUTH;              $outcome = <<ENDBADAUTH;
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   // <![CDATA[
 $loginscript  $loginscript
   // ]]>
 </script>  </script>
 <span class="LC_error">$lt{'err'}:  <span class="LC_error">$lt{'err'}:
 $lt{'uuas'} ($currentauth). $lt{'sldb'}.</span>  $lt{'uuas'} ($currentauth). $lt{'sldb'}.</span>
Line 1415  ENDBADAUTH Line 1837  ENDBADAUTH
                                                );                                                 );
             $outcome =              $outcome =
                        '<script type="text/javascript" language="Javascript">'."\n".                         '<script type="text/javascript" language="Javascript">'."\n".
                          '// <![CDATA['."\n".
                        $loginscript."\n".                         $loginscript."\n".
                          '// ]]>'."\n".
                        '</script>'."\n".                         '</script>'."\n".
                        '<h3>'.$lt{'ld'}.'</h3>'.                         '<h3>'.$lt{'ld'}.'</h3>'.
                        &Apache::loncommon::start_data_table().                         &Apache::loncommon::start_data_table().
Line 1523  sub modify_login_block { Line 1947  sub modify_login_block {
   
 sub personal_data_display {  sub personal_data_display {
     my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;      my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;
     my ($output,$showforceid,%userenv,%canmodify);      my ($output,$showforceid,%userenv,%canmodify,%canmodify_status);
     my @userinfo = ('firstname','middlename','lastname','generation',      my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');                      'permanentemail','id');
     my $rowcount = 0;      my $rowcount = 0;
     my $editable = 0;      my $editable = 0;
       %canmodify_status = 
           &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
                                                      ['inststatus'],$rolesarray);
     if (!$newuser) {      if (!$newuser) {
         # Get the users information          # Get the users information
         %userenv = &Apache::lonnet::get('environment',          %userenv = &Apache::lonnet::get('environment',
                    ['firstname','middlename','lastname','generation',                     ['firstname','middlename','lastname','generation',
                     'permanentemail','id'],$ccdomain,$ccuname);                      'permanentemail','id','inststatus'],$ccdomain,$ccuname);
         %canmodify =          %canmodify =
             &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,              &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
                                                        \@userinfo,$rolesarray);                                                         \@userinfo,$rolesarray);
Line 1548  sub personal_data_display { Line 1975  sub personal_data_display {
                 'generation'     => "Generation",                  'generation'     => "Generation",
                 'permanentemail' => "Permanent e-mail address",                  'permanentemail' => "Permanent e-mail address",
                 'id'             => "Student/Employee ID",                  'id'             => "Student/Employee ID",
                 'lg'             => "Login Data"                  'lg'             => "Login Data",
                   'inststatus'     => "Affiliation",
     );      );
     my %textboxsize = (      my %textboxsize = (
                        firstname      => '15',                         firstname      => '15',
Line 1586  sub personal_data_display { Line 2014  sub personal_data_display {
                 }                  }
             } else {              } else {
                 if ($context eq 'selfcreate') {                  if ($context eq 'selfcreate') {
                     if ($canmodify{$item}) {                      if (($item eq 'permanentemail') && ($newuser eq 'email')) {
                         $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';                          $row .= $ccuname;
                         $editable ++;  
                     } else {                      } else {
                         $hiderow = 1;                          if ($canmodify{$item}) {
                               $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                               $editable ++;
                           } else {
                               $hiderow = 1;
                           }
                     }                      }
                 } else {                  } else {
                     $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';                      $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
Line 1612  sub personal_data_display { Line 2044  sub personal_data_display {
             $rowcount ++;              $rowcount ++;
         }          }
     }      }
       if (($canmodify_status{'inststatus'}) || ($context ne 'selfcreate')) {
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($ccdomain);
           if (ref($types) eq 'ARRAY') {
               if (@{$types} > 0) {
                   my ($hiderow,$shown);
                   if ($canmodify_status{'inststatus'}) {
                       $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types);
                   } else {
                       $shown .= $userenv{'inststatus'};
                       if ($userenv{'inststatus'} eq '') {
                           $hiderow = 1;
                       }
                   }
                   if (!$hiderow) {
                       my $row = &Apache::lonhtmlcommon::row_title(&mt('Affliations'),undef,'LC_oddrow_value')."\n".
                                 $shown.&Apache::lonhtmlcommon::row_closure(1)
                       if ($context eq 'selfcreate') {
                           $rowcount ++;
                       }
                       $output .= $row;
                   }
               }
           }
       }
     $output .= &Apache::lonhtmlcommon::end_pick_box();      $output .= &Apache::lonhtmlcommon::end_pick_box();
     if (wantarray) {      if (wantarray) {
         if ($context eq 'selfcreate') {          if ($context eq 'selfcreate') {
Line 1624  sub personal_data_display { Line 2080  sub personal_data_display {
     }      }
 }  }
   
   sub pick_inst_statuses {
       my ($curr,$usertypes,$types) = @_;
       my ($output,$rem,@currtypes);
       if ($curr ne '') {
           @currtypes = map { &unescape($_); } split(/:/,$curr);
       }
       my $numinrow = 2;
       if (ref($types) eq 'ARRAY') {
           $output = '<table>';
           my $lastcolspan; 
           for (my $i=0; $i<@{$types}; $i++) {
               if (defined($usertypes->{$types->[$i]})) {
                   my $rem = $i%($numinrow);
                   if ($rem == 0) {
                       if ($i<@{$types}-1) {
                           if ($i > 0) { 
                               $output .= '</tr>';
                           }
                           $output .= '<tr>';
                       }
                   } elsif ($i==@{$types}-1) {
                       my $colsleft = $numinrow - $rem;
                       if ($colsleft > 1) {
                           $lastcolspan = ' colspan="'.$colsleft.'"';
                       }
                   }
                   my $check = ' ';
                   if (grep(/^\Q$types->[$i]\E$/,@currtypes)) {
                       $check = ' checked="checked" ';
                   }
                   $output .= '<td class="LC_left_item"'.$lastcolspan.'>'.
                              '<span class="LC_nobreak"><label>'.
                              '<input type="checkbox" name="inststatus" '.
                              'value="'.$types->[$i].'"'.$check.'/>'.
                              $usertypes->{$types->[$i]}.'</label></span></td>';
               }
           }
           $output .= '</tr></table>';
       }
       return $output;
   }
   
 sub selfcreate_canmodify {  sub selfcreate_canmodify {
     my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_;      my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_;
     if (ref($inst_results) eq 'HASH') {      if (ref($inst_results) eq 'HASH') {
Line 1652  sub get_inststatuses { Line 2150  sub get_inststatuses {
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my ($r,$context) = @_;       my ($r,$context,$crstype) = @_; 
     my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $env{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
Line 1672  sub update_user_data { Line 2170  sub update_user_data {
     my $newuser = 0;      my $newuser = 0;
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'."\n".      my $jscript = '<script type="text/javascript">'."\n".
                   $jsback."\n".'</script>'."\n";                    '// <![CDATA['."\n".
     my %breadcrumb_text = &singleuser_breadcrumb();                    $jsback."\n".
                     '// ]]>'."\n".
                     '</script>'."\n";
       my %breadcrumb_text = &singleuser_breadcrumb($crstype);
     my $args;      my $args;
     if ($env{'form.popup'}) {      if ($env{'form.popup'}) {
         $args->{'no_nav_bar'} = 1;          $args->{'no_nav_bar'} = 1;
Line 1712  sub update_user_data { Line 2213  sub update_user_data {
     }      }
     if (  $env{'form.ccuname'} ne       if (  $env{'form.ccuname'} ne 
   &LONCAPA::clean_username($env{'form.ccuname'}) ) {    &LONCAPA::clean_username($env{'form.ccuname'}) ) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name.').'  '.
   &mt('Only letters, numbers, periods, dashes, @, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, @, and underscores are valid.').
   $end.$rtnlink);    $end.$rtnlink);
  return;   return;
     }      }
Line 1723  sub update_user_data { Line 2224  sub update_user_data {
     }      }
     if (  $env{'form.ccdomain'} ne      if (  $env{'form.ccdomain'} ne
   &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {    &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt('Invalid domain name.').'  '.
   &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, and underscores are valid.').
   $end.$rtnlink);    $end.$rtnlink);
  return;   return;
     }      }
Line 1773  sub update_user_data { Line 2274  sub update_user_data {
     my (%alerts,%rulematch,%inst_results,%curr_rules);      my (%alerts,%rulematch,%inst_results,%curr_rules);
     my @usertools = ('aboutme','blog','portfolio');      my @usertools = ('aboutme','blog','portfolio');
     my @requestcourses = ('official','unofficial');      my @requestcourses = ('official','unofficial');
       my ($othertitle,$usertypes,$types) = 
           &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
     if ($env{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
  $r->print('<h3>'.&mt('Creating new account.').'</h3>');   $r->print('<h3>'.&mt('Creating new account.').'</h3>');
         # Check for the authentication mode and password          # Check for the authentication mode and password
Line 1850  sub update_user_data { Line 2353  sub update_user_data {
                                                  \%changeHash,'tools');                                                   \%changeHash,'tools');
                 }                  }
             }              }
             if (&Apache::lonnet::allowed('ccc',$env{'request.domain'})) {              foreach my $item (@requestcourses) {
                 foreach my $item (@requestcourses) {                  $newcustom{$item} = $env{'form.crsreq_'.$item};
                     $newcustom{$item} = $env{'form.requestcourse_'.$item};                  if ($env{'form.crsreq_'.$item} eq 'autolimit') {
                     $changed{$item} = &tool_admin($item,$newcustom{$item},                      $newcustom{$item} .= '=';
                                                   \%changeHash,'requestcourse');                      unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {
                           $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};
                       }
                   }
                   $changed{$item} = &tool_admin($item,$newcustom{$item},
                                                 \%changeHash,'requestcourses');
               }
               if (exists($env{'form.inststatus'})) {
                   my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
                   if (@inststatuses > 0) {
                       $changeHash{'inststatus'} = join(',',@inststatuses);
                       $changed{'inststatus'} = $changeHash{'inststatus'};
                 }                  }
             }              }
             if (keys(%changed)) {              if (keys(%changed)) {
Line 1892  sub update_user_data { Line 2406  sub update_user_data {
  }   }
     }      }
     ##      ##
     my (@userroles,%userupdate,$cnum,$cdom,$namechanged);      my (@userroles,%userupdate,$cnum,$cdom,$crstype,$namechanged);
     if ($context eq 'course') {      if ($context eq 'course') {
         ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
           $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum);
     }      }
     if (! $env{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation',              ('environment',['firstname','middlename','lastname','generation',
              'id','permanentemail','portfolioquota','inststatus','tools.aboutme',               'id','permanentemail','portfolioquota','inststatus','tools.aboutme',
              'tools.blog','tools.portfolio','requestcourse.official',               'tools.blog','tools.portfolio','requestcourses.official',
              'requestcourse.unofficial'],               'requestcourses.unofficial','requestcourses.community',
                'reqcrsotherdom.official','reqcrsotherdom.unofficial',
                'reqcrsotherdom.community'],
               $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 1976  sub update_user_data { Line 2493  sub update_user_data {
             if ($role eq 'cr') {              if ($role eq 'cr') {
                 push(@longroles,'Custom');                  push(@longroles,'Custom');
             } else {              } else {
                 push(@longroles,&Apache::lonnet::plaintext($role));                   push(@longroles,&Apache::lonnet::plaintext($role,$crstype)); 
             }              }
         }          }
         my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');          my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
Line 2004  sub update_user_data { Line 2521  sub update_user_data {
             (!$forceid)) {              (!$forceid)) {
             if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {              if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                 $env{'form.cid'} = $userenv{'id'};                  $env{'form.cid'} = $userenv{'id'};
                 $no_forceid_alert = &mt('New Student/Employee ID does not match existing ID for this user.')                  $no_forceid_alert = &mt('New student/employee ID does not match existing ID for this user.')
                                    .'<br />'                                     .'<br />'
                                    .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")                                     .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")
                                    .'<br />'."\n";                                     .'<br />'."\n";
Line 2025  sub update_user_data { Line 2542  sub update_user_data {
                 }                  }
             }              }
         }          }
         my ($quotachanged,$oldportfolioquota,$newportfolioquota,          my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus,
             $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,              $inststatus,$newinststatus,$oldisdefault,$newisdefault,$olddefquotatext,
             $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext);              $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext,
               $oldinststatuses,$newinststatuses);
         my ($defquota,$settingstatus) =           my ($defquota,$settingstatus) = 
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);              &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
         my ($showquota,$showtools,$showrequestcourses);          my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom);
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $showquota = 1;              $showquota = 1;
         }          }
Line 2039  sub update_user_data { Line 2557  sub update_user_data {
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
             $showrequestcourses = 1;              $showrequestcourses = 1;
           } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
               $showreqotherdom = 1;
           }
           if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
               $showinststatus = 1;
         }          }
         my (%changeHash,%changed);          my (%changeHash,%changed);
           $oldinststatus = $userenv{'inststatus'};
           if ($oldinststatus eq '') {
               $oldinststatuses = $othertitle; 
           } else {
               if (ref($usertypes) eq 'HASH') {
                   $oldinststatuses = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'})));
               } else {
                   $oldinststatuses = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'})));
               }
           }
           $changeHash{'inststatus'} = $userenv{'inststatus'};
           my %canmodify_inststatus = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},['inststatus'],\@userroles);
           if ($canmodify_inststatus{'inststatus'}) {
               if (exists($env{'form.inststatus'})) {
                   my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
                   if (@inststatuses > 0) {
                       $newinststatus = join(':',map { &escape($_); } @inststatuses);
                       $changeHash{'inststatus'} = $newinststatus;
                       if ($newinststatus ne $oldinststatus) {
                           $changed{'inststatus'} = $newinststatus;
                       }
                       if (ref($usertypes) eq 'HASH') {
                           $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); 
                       } else {
                           $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses));
                       }
                   } else {
                       $newinststatus = '';
                       $changeHash{'inststatus'} = $newinststatus;
                       $newinststatuses = $othertitle;
                       if ($newinststatus ne $oldinststatus) {
                           $changed{'inststatus'} = $changeHash{'inststatus'};
                       }
                   }
               }
           }
         $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};          $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
         if ($userenv{'portfolioquota'} ne '') {          if ($userenv{'portfolioquota'} ne '') {
             $oldportfolioquota = $userenv{'portfolioquota'};              $oldportfolioquota = $userenv{'portfolioquota'};
Line 2057  sub update_user_data { Line 2616  sub update_user_data {
             } else {              } else {
                 $changed{'quota'} = &quota_admin('',\%changeHash);                  $changed{'quota'} = &quota_admin('',\%changeHash);
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $newisdefault = 1;                   $newisdefault = 1;
             }              }
         } else {          } else {
             $oldisdefault = 1;              $oldisdefault = 1;
Line 2083  sub update_user_data { Line 2642  sub update_user_data {
         }          }
         &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv,          &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv,
                       \%changeHash,\%changed,\%newaccess,\%newaccesstext);                        \%changeHash,\%changed,\%newaccess,\%newaccesstext);
         &tool_changes('requestcourse',\@requestcourses,\%oldaccess,\%oldaccesstext,          if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
                       \%userenv, \%changeHash,\%changed,\%newaccess,\%newaccesstext);              &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext,
                             \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
           } else {
               &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,
                             \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
           }
         if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||          if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
             $env{'form.cmiddlename'} ne $userenv{'middlename'} ||              $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
             $env{'form.clastname'}   ne $userenv{'lastname'}   ||              $env{'form.clastname'}   ne $userenv{'lastname'}   ||
Line 2111  sub update_user_data { Line 2675  sub update_user_data {
                         my %newenvhash;                          my %newenvhash;
                         foreach my $key (keys(%changed)) {                          foreach my $key (keys(%changed)) {
                             if (($key eq 'official') || ($key eq 'unofficial')) {                              if (($key eq 'official') || ($key eq 'unofficial')) {
                                 $newenvhash{'environment.canrequest.'.$key} =                                  $newenvhash{'environment.requestcourses.'.$key} =
                                     $changeHash{'requestcourse.'.$key};                                      $changeHash{'requestcourses.'.$key};
                                 $newenvhash{'environment.canrequest.'.$key} =                                  if ($changeHash{'requestcourses.'.$key} ne '') {
                                     $changeHash{'requestcourse.'.$key};                                      $newenvhash{'environment.canrequest.'.$key} = 1;
                                   } else {
                                       $newenvhash{'environment.canrequest.'.$key} =
             &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
                                               $key,'reload','requestcourses');
                                   }
                             } elsif ($key ne 'quota') {                              } elsif ($key ne 'quota') {
                                 $newenvhash{'environment.tools.'.$key} =                                   $newenvhash{'environment.tools.'.$key} = 
                                     $changeHash{'tools.'.$key};                                      $changeHash{'tools.'.$key};
                                 $newenvhash{'environment.availabletools.'.$key} =                                  if ($changeHash{'tools.'.$key} ne '') {
                                     $changeHash{'tools.'.$key};                                      $newenvhash{'environment.availabletools.'.$key} =
                                           $changeHash{'tools.'.$key};
                                   } else {
                                       $newenvhash{'environment.availabletools.'.$key} =
             &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},                                            $key,'reload','tools');
                                   }
                             }                              }
                         }                          }
                         if (keys(%newenvhash)) {                          if (keys(%newenvhash)) {
Line 2149  sub update_user_data { Line 2722  sub update_user_data {
                 ((keys(%changed) > 0) && $chgresult eq 'ok')) {                  ((keys(%changed) > 0) && $chgresult eq 'ok')) {
             # Tell the user we changed the name              # Tell the user we changed the name
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                              'uic'        => "User Information Changed",                                            'uic'        => 'User Information Changed',
                              'frst'       => "First",                               'frst'       => 'First Name',
                              'mddl'       => "Middle",                               'mddl'       => 'Middle Name',
                              'lst'        => "Last",                               'lst'        => 'Last Name',
      'gen'        => "Generation",                               'gen'        => 'Generation',
                              'id'         => "Student/Employee ID",                               'id'         => 'Student/Employee ID',
                              'mail'       => "Permanent E-mail",                               'mail'       => 'Permanent e-mail address',
                              'disk'       => "Disk space allocated to portfolio files",                               'disk'       => 'Disk space allocated to portfolio files',
                              'blog'       => "Blog Availability",                               'blog'       => 'Blog Availability',
                              'aboutme'    => "Home Page Availability",                               'aboutme'    => 'Personal Information Page Availability',
                              'portfolio'  => "Portfolio Availability",                               'portfolio'  => 'Portfolio Availability',
                              'official'   => "Can Request Official Courses",                               'official'   => 'Can Request Official Courses',
                              'unofficial' => "Can Request Unofficial Courses",                               'unofficial' => 'Can Request Unofficial Courses',
                              'prvs'       => "Previous",                               'inststatus' => "Affiliation",
                              'chto'       => "Changed To"                               'prvs'       => 'Previous Value:',
                                'chto'       => 'Changed To:'
    );     );
                 $r->print('<h4>'.$lt{'uic'}.'</h4>'.                  $r->print('<h4>'.$lt{'uic'}.'</h4>'.
                           &Apache::loncommon::start_data_table().                            &Apache::loncommon::start_data_table().
Line 2177  sub update_user_data { Line 2751  sub update_user_data {
     <th>$lt{'id'}</th>      <th>$lt{'id'}</th>
     <th>$lt{'mail'}</th>      <th>$lt{'mail'}</th>
 END  END
                   if ($showinststatus) {
                       $r->print("
       <th>$lt{'inststatus'}</th>\n");
                   }
                 if ($showrequestcourses) {                  if ($showrequestcourses) {
                     foreach my $item (@requestcourses) {                      foreach my $item (@requestcourses) {
                         $r->print("                          $r->print("
     <th>$lt{$item}</th>\n");      <th>$lt{$item}</th>\n");
                     }                      }
                   } elsif ($showreqotherdom) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <th>$lt{$item}</th>\n");
                       }
                 }                  }
                 if ($showquota) {                  if ($showquota) {
                     $r->print("                      $r->print("
Line 2204  END Line 2787  END
     <td>$userenv{'id'}</td>      <td>$userenv{'id'}</td>
     <td>$userenv{'permanentemail'} </td>      <td>$userenv{'permanentemail'} </td>
 END  END
                   if ($showinststatus) {
                       $r->print("
       <td>$oldinststatuses</td>\n");
                   }  
                 if ($showrequestcourses) {                  if ($showrequestcourses) {
                     foreach my $item (@requestcourses) {                      foreach my $item (@requestcourses) {
                         $r->print("                          $r->print("
     <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");      <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");
                     }                      }
                   } elsif ($showreqotherdom) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");
                       }
                 }                  }
                 if ($showquota) {                  if ($showquota) {
                     $r->print("                      $r->print("
Line 2231  END Line 2823  END
     <td>$env{'form.cid'} </td>      <td>$env{'form.cid'} </td>
     <td>$env{'form.cpermanentemail'} </td>      <td>$env{'form.cpermanentemail'} </td>
 END  END
                   if ($showinststatus) {
                       $r->print("
       <td>$newinststatuses</td>\n");
                   }
                 if ($showrequestcourses) {                  if ($showrequestcourses) {
                     foreach my $item (@requestcourses) {                      foreach my $item (@requestcourses) {
                         $r->print("                          $r->print("
     <td>$newaccess{$item} $newaccesstext{$item} </td>\n");      <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
                     }                      }
                   } elsif ($showreqotherdom) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
                       }
                 }                  }
                 if ($showquota) {                  if ($showquota) {
                     $r->print("                      $r->print("
Line 2280  END Line 2881  END
             # but we can still tell them what the name and quota and availabilities are                # but we can still tell them what the name and quota and availabilities are  
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                            'id'         => "Student/Employee ID",                             'id'         => "Student/Employee ID",
                            'mail'       => "Permanent e-mail",                             'mail'       => "Permanent e-mail address",
                            'disk'       => "Disk space allocated to user's portfolio files",                             'disk'       => "Disk space allocated to user's portfolio files",
                            'blog'       => "Blog Availability",                             'blog'       => "Blog Availability",
                            'aboutme'    => "Home Page Availability",                             'aboutme'    => "Personal Information Page Availability",
                            'portfolio'  => "Portfolio Availability",                             'portfolio'  => "Portfolio Availability",
                            'official'   => "Can Request Official Courses",                             'official'   => "Can Request Official Courses",
                            'unofficial' => "Can Request Unofficial Course",                             'unofficial' => "Can Request Unofficial Courses",
                              'inststatus' => "Affiliation",
        );         );
             $r->print(<<"END");              $r->print(<<"END");
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
Line 2295  END Line 2897  END
                 $r->print('<br />['.$lt{'mail'}.': '.                  $r->print('<br />['.$lt{'mail'}.': '.
                           $userenv{'permanentemail'}.']');                            $userenv{'permanentemail'}.']');
             }              }
               if ($showinststatus) {
                   $r->print('<br />['.$lt{'inststatus'}.': '.$oldinststatuses.']');
               }
             if ($showrequestcourses) {              if ($showrequestcourses) {
                 foreach my $item (@requestcourses) {                  foreach my $item (@requestcourses) {
                     $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.                      $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                               $newaccesstext{$item}.']'."\n");                                $newaccesstext{$item}.']'."\n");
                 }                  }
               } elsif ($showreqotherdom) {
                   foreach my $item (@requestcourses) {
                       $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                                 $newaccesstext{$item}.']'."\n");
                   }
             }              }
             if ($showtools) {              if ($showtools) {
                 foreach my $item (@usertools) {                  foreach my $item (@usertools) {
Line 2336  END Line 2946  END
             } else {              } else {
                 $r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname));                  $r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname));
             }              }
             $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.              my $helplink = 'javascript:helpMenu('."'display'".')';
                       &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');              $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'
                        .&mt('Please contact your [_1]helpdesk[_2] for more information.'
                            ,'<a href="'.$helplink.'">','</a>')
                         .'<br />');
         }          }
         $r->print('<span class="LC_warning">'          $r->print('<span class="LC_warning">'
                   .$no_forceid_alert                    .$no_forceid_alert
Line 2345  END Line 2958  END
                   .'</span>');                    .'</span>');
     }      }
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);          &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype);
         $r->print('<p><a href="javascript:backPage(document.userupdate)">'.          $r->print('<p><a href="javascript:backPage(document.userupdate)">');
                   &mt('Enroll Another Student').'</a></p>');          if ($crstype eq 'Community') {
               $r->print(&mt('Enroll Another Member'));
           } else {
               $r->print(&mt('Enroll Another Student'));
           }
           $r->print('</a></p>');
     } else {      } else {
         my @rolechanges = &update_roles($r,$context);          my @rolechanges = &update_roles($r,$context);
         if ($namechanged) {          if ($namechanged) {
Line 2388  sub tool_changes { Line 3006  sub tool_changes {
           (ref($newaccess) eq 'HASH') && (ref($newaccesstext) eq 'HASH'))) {            (ref($newaccess) eq 'HASH') && (ref($newaccesstext) eq 'HASH'))) {
         return;          return;
     }      }
       if ($context eq 'reqcrsotherdom') {
           my @options = ('approval','validate','autolimit');
           my $optregex = join('|',@options);
           my %reqdisplay = &courserequest_display();
           my $cdom = $env{'request.role.domain'};
           foreach my $tool (@{$usertools}) {
               $oldaccesstext->{$tool} = &mt('No');
               $newaccesstext->{$tool} = $oldaccesstext->{$tool};
               $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
               my $newop;
               if ($env{'form.'.$context.'_'.$tool}) {
                   $newop = $env{'form.'.$context.'_'.$tool};
                   if ($newop eq 'autolimit') {
                       my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};
                       $limit =~ s/\D+//g;
                       $newop .= '='.$limit;
                   }
               }
               if ($userenv->{$context.'.'.$tool} eq '') {
                   if ($newop) {
                       $changed->{$tool}=&tool_admin($tool,$cdom.':'.$newop,
                                                     $changeHash,$context);
                       if ($changed->{$tool}) {
                           $newaccesstext->{$tool} = &mt('Yes');
                       } else {
                           $newaccesstext->{$tool} = $oldaccesstext->{$tool};
                       }
                   }
               } else {
                   my @curr = split(',',$userenv->{$context.'.'.$tool});
                   my @new;
                   my $changedoms;
                   foreach my $req (@curr) {
                       if ($req =~ /^\Q$cdom\E\:($optregex\=?\d*)$/) {
                           $oldaccesstext->{$tool} = &mt('Yes');
                           my $oldop = $1;
                           if ($oldop ne $newop) {
                               $changedoms = 1;
                               foreach my $item (@curr) {
                                   my ($reqdom,$option) = split(':',$item);
                                   unless ($reqdom eq $cdom) {
                                       push(@new,$item);
                                   }
                               }
                               if ($newop) {
                                   push(@new,$cdom.':'.$newop);
                               }
                               @new = sort(@new);
                           }
                           last;
                       }
                   }
                   if ((!$changedoms) && ($newop)) {
                       $changedoms = 1;
                       @new = sort(@curr,$cdom.':'.$newop);
                   }
                   if ($changedoms) {
                       my $newdomstr;
                       if (@new) {
                           $newdomstr = join(',',@new);
                       }
                       $changed->{$tool}=&tool_admin($tool,$newdomstr,$changeHash,
                                                     $context);
                       if ($changed->{$tool}) {
                           if ($env{'form.'.$context.'_'.$tool}) {
                               if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') {
                                   my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};
                                   $limit =~ s/\D+//g;
                                   if ($limit) {
                                       $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user.',$limit);
                                   } else {
                                       $newaccesstext->{$tool} = &mt('Yes, processed automatically');
                                   }
                               } else {
                                   $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}};
                               }
                           } else {
                               $newaccesstext->{$tool} = &mt('No');
                           }
                       }
                   }
               }
           }
           return;
       }
     foreach my $tool (@{$usertools}) {      foreach my $tool (@{$usertools}) {
           my $newval;
           if ($context eq 'requestcourses') {
               $newval = $env{'form.crsreq_'.$tool};
               if ($newval eq 'autolimit') {
                   $newval .= '='.$env{'form.crsreq_'.$tool.'_limit'};
               }
           } else {
               $newval = $env{'form.'.$context.'_'.$tool};
           }
         if ($userenv->{$context.'.'.$tool} ne '') {          if ($userenv->{$context.'.'.$tool} ne '') {
             $oldaccess->{$tool} = &mt('custom');              $oldaccess->{$tool} = &mt('custom');
             if ($userenv->{$context.'.'.$tool}) {              if ($userenv->{$context.'.'.$tool}) {
Line 2396  sub tool_changes { Line 3108  sub tool_changes {
             } else {              } else {
                 $oldaccesstext->{$tool} = &mt("availability set to 'off'");                  $oldaccesstext->{$tool} = &mt("availability set to 'off'");
             }              }
             $changeHash->{$context.'.'.$tool} = $userenv->{'tools.'.$tool};              $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
             if ($env{'form.custom'.$tool} == 1) {              if ($env{'form.custom'.$tool} == 1) {
                 if ($env{'form.'.$context.'_'.$tool} ne $userenv->{'tools.'.$tool}) {                  if ($newval ne $userenv->{$context.'.'.$tool}) {
                     $changed->{$tool} = &tool_admin($tool,$env{'form.'.$context.'_'.$tool},                      $changed->{$tool} = &tool_admin($tool,$newval,$changeHash,
                                                   $changeHash,$context);                                                      $context);
                     if ($changed->{$tool}) {                      if ($changed->{$tool}) {
                         $newaccess->{$tool} = &mt('custom');                          $newaccess->{$tool} = &mt('custom');
                         if ($env{'form.'.$context.'_'.$tool}) {                          if ($newval) {
                             $newaccesstext->{$tool} = &mt("availability set to 'on'");                              $newaccesstext->{$tool} = &mt("availability set to 'on'");
                         } else {                          } else {
                             $newaccesstext->{$tool} = &mt("availability set to 'off'");                              $newaccesstext->{$tool} = &mt("availability set to 'off'");
Line 2427  sub tool_changes { Line 3139  sub tool_changes {
                 } else {                  } else {
                     $newaccess->{$tool} = $oldaccess->{$tool};                      $newaccess->{$tool} = $oldaccess->{$tool};
                     if ($userenv->{$context.'.'.$tool}) {                      if ($userenv->{$context.'.'.$tool}) {
                          $newaccesstext->{$tool} = &mt("availability set to 'on'");                          $newaccesstext->{$tool} = &mt("availability set to 'on'");
                     } else {                      } else {
                          $newaccesstext->{$tool} = &mt("availability set to 'off'");                          $newaccesstext->{$tool} = &mt("availability set to 'off'");
                     }                      }
                 }                  }
             }              }
         } else {          } else {
             $oldaccess->{$tool} = &mt('default');              $oldaccess->{$tool} = &mt('default');
             if ($env{'form.custom'.$tool} == 1) {              if ($env{'form.custom'.$tool} == 1) {
                 $changed->{$tool} = &tool_admin($tool,$env{'form.'.$context.'_'.$tool},                  $changed->{$tool} = &tool_admin($tool,$newval,$changeHash,
                                                 $changeHash,$context);                                                  $context);
                 if ($changed->{$tool}) {                  if ($changed->{$tool}) {
                     $newaccess->{$tool} = &mt('custom');                      $newaccess->{$tool} = &mt('custom');
                     if ($env{'form.'.$context.'_'.$tool}) {                      if ($newval) {
                         $newaccesstext->{$tool} = &mt("availability set to 'on'");                          $newaccesstext->{$tool} = &mt("availability set to 'on'");
                     } else {                      } else {
                         $newaccesstext->{$tool} = &mt("availability set to 'off'");                          $newaccesstext->{$tool} = &mt("availability set to 'off'");
Line 2523  sub update_roles { Line 3235  sub update_roles {
     if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {      if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                 my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);                  my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
 # Delete custom role  # Delete custom role
                 $r->print(&mt('Deleting custom role [_1] by [_2]:[_3] in [_4]',                  $r->print(&mt('Deleting custom role [_1] by [_2] in [_3]',
                       $rolename,$rnam,$rdom,$url).': <b>'.                        $rolename,$rnam.':'.$rdom,$url).': <b>'.
                       &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},                        &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
                          $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,                           $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
                          0,1,$context).'</b><br />');                           0,1,$context).'</b><br />');
Line 2575  sub update_roles { Line 3287  sub update_roles {
                 my $result = &Apache::lonnet::assigncustomrole(                  my $result = &Apache::lonnet::assigncustomrole(
                                $env{'form.ccdomain'}, $env{'form.ccuname'},                                 $env{'form.ccdomain'}, $env{'form.ccuname'},
                                $url,$rdom,$rnam,$rolename,0,$now,undef,$context);                                 $url,$rdom,$rnam,$rolename,0,$now,undef,$context);
                 $r->print(&mt('Re-enabling custom role [_1] by [_2]:[_3] in [_4] : [_5]',                  $r->print(&mt('Re-enabling custom role [_1] by [_2] in [_3]: [_4]',
                           $rolename,$rnam,$rdom,$url,'<b>'.$result.'</b>').'<br />');                            $rolename,$rnam.':'.$rdom,$url,'<b>'.$result.'</b>').'<br />');
                 if (!grep(/^cr$/,@rolechanges)) {                  if (!grep(/^cr$/,@rolechanges)) {
                     push(@rolechanges,'cr');                      push(@rolechanges,'cr');
                 }                  }
Line 2722  sub update_roles { Line 3434  sub update_roles {
 }  }
   
 sub enroll_single_student {  sub enroll_single_student {
     my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_;      my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype) = @_;
     $r->print('<h3>'.&mt('Enrolling Student').'</h3>');      $r->print('<h3>');
       if ($crstype eq 'Community') {
           $r->print(&mt('Enrolling Member'));
       } else {
           $r->print(&mt('Enrolling Student'));
       }
       $r->print('</h3>');
   
     # Remove non alphanumeric values from section      # Remove non alphanumeric values from section
     $env{'form.sections'}=~s/\W//g;      $env{'form.sections'}=~s/\W//g;
Line 2756  sub enroll_single_student { Line 3474  sub enroll_single_student {
         }          }
         $r->print('.<br />'.$showstart.'; '.$showend);          $r->print('.<br />'.$showstart.'; '.$showend);
         if ($startdate <= $now && !$newuser) {          if ($startdate <= $now && !$newuser) {
             $r->print("<p> ".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."</p>");              $r->print('<p> ');
               if ($crstype eq 'Community') {
                   $r->print(&mt('If the member is currently logged-in to LON-CAPA, the new role will be available when the member next logs in.'));
               } else {
                   $r->print(&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.'));
               }
               $r->print('</p>');
         }          }
     } else {      } else {
         $r->print(&mt('unable to enroll').": ".$enroll_result);          $r->print(&mt('unable to enroll').": ".$enroll_result);
Line 2822  sub quota_admin { Line 3546  sub quota_admin {
 sub tool_admin {  sub tool_admin {
     my ($tool,$settool,$changeHash,$context) = @_;      my ($tool,$settool,$changeHash,$context) = @_;
     my $canchange = 0;       my $canchange = 0; 
     if ($context eq 'requestcourse') {      if ($context eq 'requestcourses') {
         if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
             $canchange = 1;              $canchange = 1;
         }          }
       } elsif ($context eq 'reqcrsotherdom') {
           if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
               $canchange = 1;
           }
     } elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {      } elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
         # Current user has quota modification privileges          # Current user has quota modification privileges
         $canchange = 1;          $canchange = 1;
Line 2877  sub build_roles { Line 3605  sub build_roles {
   
 sub custom_role_editor {  sub custom_role_editor {
     my ($r) = @_;      my ($r) = @_;
     my $rolename=$env{'form.rolename'};      my $action = $env{'form.customroleaction'};
       my $rolename;
     if ($rolename eq 'make new role') {      if ($action eq 'new') {
  $rolename=$env{'form.newrolename'};          $rolename=$env{'form.newrolename'};
       } else {
           $rolename=$env{'form.rolename'};
     }      }
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     if (!$rolename || $env{'form.phase'} eq 'pickrole') {      if (!$rolename || $env{'form.phase'} eq 'pickrole') {
  &print_username_entry_form($r);   &print_username_entry_form($r);
         return;          return;
     }      }
       my ($crstype,$context);
       if ($env{'request.course.id'}) {
           $crstype = &Apache::loncommon::course_type();
           $context = 'course';
       } else {
           $context = 'domain';
           $crstype = $env{'form.templatecrstype'};
       }
 # ------------------------------------------------------- What can be assigned?  # ------------------------------------------------------- What can be assigned?
     my %full=();      my %full=();
     my %courselevel=();      my %courselevel=();
Line 2897  sub custom_role_editor { Line 3634  sub custom_role_editor {
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
     my $body_top;      my $body_top;
     my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]);  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
Line 2906  sub custom_role_editor { Line 3642  sub custom_role_editor {
  $body_top .= &mt('Existing Role').' "';   $body_top .= &mt('Existing Role').' "';
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
  ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);   ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);
           if ($crstype eq 'Community') {
               $syspriv =~ s/bre\&S//;
           }
     } else {      } else {
  $body_top .= &mt('New Role').' "';   $body_top .= &mt('New Role').' "';
  $roledef='';   $roledef='';
Line 2945  sub custom_role_editor { Line 3684  sub custom_role_editor {
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $button_code = "\n";      my $button_code = "\n";
     my $head_script = "\n";      my $head_script = "\n";
     $head_script .= '<script type="text/javascript">'."\n";      $head_script .= '<script type="text/javascript">'."\n".
     my @template_roles = ("cc","in","ta","ep","st");                      '// <![CDATA['."\n";
       my @template_roles = ("in","ta","ep");
       if ($context eq 'domain') {
           push(@template_roles,"ad");
       }
       push(@template_roles,"st");
       if ($crstype eq 'Community') {
           unshift(@template_roles,'co');
       } else {
           unshift(@template_roles,'cc');
       }
     foreach my $role (@template_roles) {      foreach my $role (@template_roles) {
         $head_script .= &make_script_template($role);          $head_script .= &make_script_template($role,$crstype);
         $button_code .= &make_button_code($role).' ';          $button_code .= &make_button_code($role,$crstype).' ';
     }      }
     $head_script .= "\n".$jsback."\n".'</script>'."\n";      my $context_code;
       if ($context eq 'domain') {
           my $checkedCommunity = '';
           my $checkedCourse = ' checked="checked"';
           if ($env{'form.templatecrstype'} eq 'Community') {
               $checkedCommunity = $checkedCourse;
               $checkedCourse = '';
           }
           $context_code = '<label>'.
                           '<input type="radio" name="templatecrstype" value="Course"'.$checkedCourse.' onclick="this.form.submit();">'.
                           &mt('Course').
                           '</label>'.('&nbsp;' x2).
                           '<label>'.
                           '<input type="radio" name="templatecrstype" value="Community"'.$checkedCommunity.' onclick="this.form.submit();">'.
                           &mt('Community').
                           '</label>'.
                           '</fieldset>'.
                           '<input type="hidden" name="customroleaction" value="'.
                           $action.'" />';
           if ($env{'form.customroleaction'} eq 'new') {
               $context_code .= '<input type="hidden" name="newrolename" value="'.
                                $rolename.'" />';
           } else {
               $context_code .= '<input type="hidden" name="rolename" value="'.
                                $rolename.'" />';
           }
           $context_code .= '<input type="hidden" name="action" value="custom" />'.
                            '<input type="hidden" name="phase" value="selected_custom_edit" />';
       }
       $head_script .= "\n".$jsback."\n".
                       '// ]]>'."\n".
                       '</script>'."\n";
     $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));      $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
    &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage(document.form1,'pickrole','')",       ({href=>"javascript:backPage(document.form1,'pickrole','')",
        text=>"Pick custom role",         text=>"Pick custom role",
        faq=>282,bug=>'Instructor Interface',},         faq=>282,bug=>'Instructor Interface',},
Line 2970  sub custom_role_editor { Line 3750  sub custom_role_editor {
                     'dml'  => "Domain Level",                      'dml'  => "Domain Level",
                     'ssl'  => "System Level");                      'ssl'  => "System Level");
   
     $r->print('<div>'      $r->print('<div class="LC_left_float">'
              .'<form action=""><fieldset>'               .'<form action=""><fieldset>'
              .'<legend>'.&mt('Select a Template').'</legend>'               .'<legend>'.&mt('Select a Template').'</legend>'
              .$button_code               .$button_code
              .'</fieldset></form>'               .'</fieldset></form></div>');
              .'</div>'      if ($context_code) {
     );          $r->print('<div class="LC_left_float">'
                    .'<form action="/adm/createuser" method="post"><fieldset>'
                    .'<legend>'.&mt('Context').'</legend>'
                    .$context_code
                    .'</form>'
                    .'</div>'
           );
       }
       $r->print('<br clear="all" />');
   
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form name="form1" method="post">  <form name="form1" method="post">
Line 2989  ENDCCF Line 3777  ENDCCF
 '</th><th>'.$lt{'ssl'}.'</th>'.  '</th><th>'.$lt{'ssl'}.'</th>'.
               &Apache::loncommon::end_data_table_header_row());                &Apache::loncommon::end_data_table_header_row());
     foreach my $priv (sort keys %full) {      foreach my $priv (sort keys %full) {
         my $privtext = &Apache::lonnet::plaintext($priv);          my $privtext = &Apache::lonnet::plaintext($priv,$crstype);
         $r->print(&Apache::loncommon::start_data_table_row().          $r->print(&Apache::loncommon::start_data_table_row().
           '<td>'.$privtext.'</td><td>'.            '<td>'.$privtext.'</td><td>'.
     ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c" '.      ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c"'.
     ($courselevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').      ($courselevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').
     '</td><td>'.  
     ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d" '.  
     ($domainlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').  
     '</td><td>'.      '</td><td>'.
     ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s" '.      ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'.
     ($systemlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').      ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').
     '</td>'.      '</td><td>');
              &Apache::loncommon::end_data_table_row());          if ($priv eq 'bre' && $crstype eq 'Community') {
               $r->print('&nbsp;');
           } else {
               $r->print($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'.
                         ($systemlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;');
           }
           $r->print('</td>'.
                     &Apache::loncommon::end_data_table_row());
     }      }
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
    '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.     '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
    '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.     '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.
    '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".        '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".   
    '<input type="reset" value="'.&mt("Reset").'" />'."\n".     '<input type="reset" value="'.&mt("Reset").'" />'."\n".
    '<input type="submit" value="'.&mt('Define Role').'" /></form>'.     '<input type="submit" value="'.&mt('Save').'" /></form>'.
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
 }  }
 # --------------------------------------------------------  # --------------------------------------------------------
 sub make_script_template {  sub make_script_template {
     my ($role) = @_;      my ($role,$crstype) = @_;
     my %full_c=();      my %full_c=();
     my %full_d=();      my %full_d=();
     my %full_s=();      my %full_s=();
Line 3027  sub make_script_template { Line 3819  sub make_script_template {
         $full_d{$priv}=1;          $full_d{$priv}=1;
     }      }
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
           next if (($crstype eq 'Community') && ($item eq 'bre&S'));
         my ($priv,$restrict)=split(/\&/,$item);          my ($priv,$restrict)=split(/\&/,$item);
         $full_s{$priv}=1;          $full_s{$priv}=1;
     }      }
Line 3079  sub make_script_template { Line 3872  sub make_script_template {
 }  }
 # ----------------------------------------------------------  # ----------------------------------------------------------
 sub make_button_code {  sub make_button_code {
     my ($role) = @_;      my ($role,$crstype) = @_;
     my $label = &Apache::lonnet::plaintext($role);      my $label = &Apache::lonnet::plaintext($role,$crstype);
     my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';      my $button_code = '<input type="button" onclick="set_'.$role.'()" value="'.$label.'" />';
     return ($button_code);      return ($button_code);
 }  }
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
Line 3094  sub set_custom_role { Line 3887  sub set_custom_role {
         return;          return;
     }      }
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'.$jsback."\n".'</script>';      my $jscript = '<script type="text/javascript">'.
                     '// <![CDATA['."\n".
                     $jsback."\n".
                     '// ]]>'."\n".
                     '</script>';
   
     $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);      $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 3176  sub handler { Line 3973  sub handler {
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
     my $context;      my ($context,$crstype);
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         $context = 'course';          $context = 'course';
           $crstype = &Apache::loncommon::course_type();
     } elsif ($env{'request.role'} =~ /^au\./) {      } elsif ($env{'request.role'} =~ /^au\./) {
         $context = 'author';          $context = 'author';
     } else {      } else {
Line 3191  sub handler { Line 3989  sub handler {
     if ($env{'form.action'} ne 'dateselect') {      if ($env{'form.action'} ne 'dateselect') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"/adm/createuser",              ({href=>"/adm/createuser",
               text=>"User Management"});                text=>"User Management",
                 help=>'Course_Create_Class_List,Course_Change_Privileges,Course_View_Class_List,Course_Editing_Custom_Roles,Course_Add_Student,Course_Drop_Student,Course_Automated_Enrollment,Course_Self_Enrollment,Course_Manage_Group'});
     }      }
       #SD Following files not added to help, because the corresponding .tex-files seem to
       #be missing: Course_Approve_Selfenroll,Course_User_Logs,
     my ($permission,$allowed) =       my ($permission,$allowed) = 
         &Apache::lonuserutils::get_permission($context);          &Apache::lonuserutils::get_permission($context,$crstype);
     if (!$allowed) {      if (!$allowed) {
         $env{'user.error.msg'}=          $env{'user.error.msg'}=
             "/adm/createuser:cst:0:0:Cannot create/modify user data ".              "/adm/createuser:cst:0:0:Cannot create/modify user data ".
Line 3209  sub handler { Line 4010  sub handler {
     if (! exists($env{'form.action'})) {      if (! exists($env{'form.action'})) {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print(&print_main_menu($permission,$context));          $r->print(&print_main_menu($permission,$context,$crstype));
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {      } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
         $r->print(&header());          $r->print(&header());
Line 3225  sub handler { Line 4026  sub handler {
             &Apache::lonuserutils::print_first_users_upload_form($r,$context);              &Apache::lonuserutils::print_first_users_upload_form($r,$context);
         } elsif ($env{'form.state'} eq 'got_file') {          } elsif ($env{'form.state'} eq 'got_file') {
             &Apache::lonuserutils::print_upload_manager_form($r,$context,              &Apache::lonuserutils::print_upload_manager_form($r,$context,
                                                              $permission);                                                               $permission,$crstype);
         } elsif ($env{'form.state'} eq 'enrolling') {          } elsif ($env{'form.state'} eq 'enrolling') {
             if ($env{'form.datatoken'}) {              if ($env{'form.datatoken'}) {
                 &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);                  &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);
Line 3250  sub handler { Line 4051  sub handler {
                 if ($env{'form.srchterm'} !~ /^$match_username$/) {                  if ($env{'form.srchterm'} !~ /^$match_username$/) {
                     my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');                      my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch);                      &print_username_entry_form($r,$context,$response,$srch,undef,$crstype);
                 } else {                  } else {
                     my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});                      my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
                     my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});                      my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
                     &print_user_modification_page($r,$ccuname,$ccdomain,                      &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,                                                    $srch,$response,$context,
                                                   $permission);                                                    $permission,$crstype);
                 }                  }
             } elsif ($env{'form.phase'} eq 'get_user_info') {              } elsif ($env{'form.phase'} eq 'get_user_info') {
                 my ($currstate,$response,$forcenewuser,$results) =                   my ($currstate,$response,$forcenewuser,$results) = 
Line 3266  sub handler { Line 4067  sub handler {
                 }                  }
                 if ($currstate eq 'select') {                  if ($currstate eq 'select') {
                     &print_user_selection_page($r,$response,$srch,$results,                      &print_user_selection_page($r,$response,$srch,$results,
                                                \@search,$context);                                                 \@search,$context,undef,$crstype);
                 } elsif ($currstate eq 'modify') {                  } elsif ($currstate eq 'modify') {
                     my ($ccuname,$ccdomain);                      my ($ccuname,$ccdomain);
                     if (($srch->{'srchby'} eq 'uname') &&                       if (($srch->{'srchby'} eq 'uname') && 
Line 3284  sub handler { Line 4085  sub handler {
                     }                      }
                     &print_user_modification_page($r,$ccuname,$ccdomain,                      &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,                                                    $srch,$response,$context,
                                                   $permission);                                                    $permission,$crstype);
                 } elsif ($currstate eq 'query') {                  } elsif ($currstate eq 'query') {
                     &print_user_query_page($r,'createuser');                      &print_user_query_page($r,'createuser');
                 } else {                  } else {
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,                      &print_username_entry_form($r,$context,$response,$srch,
                                                $forcenewuser);                                                 $forcenewuser,$crstype);
                 }                  }
             } elsif ($env{'form.phase'} eq 'userpicked') {              } elsif ($env{'form.phase'} eq 'userpicked') {
                 my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});                  my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
                 my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});                  my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
                 &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',                  &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
                                               $context,$permission);                                                $context,$permission,$crstype);
             }              }
         } elsif ($env{'form.phase'} eq 'update_user_data') {          } elsif ($env{'form.phase'} eq 'update_user_data') {
             &update_user_data($r,$context);              &update_user_data($r,$context,$crstype);
         } else {          } else {
             &print_username_entry_form($r,$context,undef,$srch);              &print_username_entry_form($r,$context,undef,$srch,undef,$crstype);
         }          }
     } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {      } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
         if ($env{'form.phase'} eq 'set_custom_roles') {          if ($env{'form.phase'} eq 'set_custom_roles') {
Line 3336  sub handler { Line 4137  sub handler {
                   text=>"List Users"});                    text=>"List Users"});
             my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);              my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
             my $formname = 'studentform';              my $formname = 'studentform';
             if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {              if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') ||
                 ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) =                   ($env{'form.roletype'} eq 'community'))) {
                     &Apache::lonuserutils::courses_selector($env{'request.role.domain'},                  if ($env{'form.roletype'} eq 'course') {
                                                             $formname);                      ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) =
                           &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
                                                                   $formname);
                   } elsif ($env{'form.roletype'} eq 'community') {
                       $cb_jscript =
                           &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'});
                       my %elements = (
                                         coursepick => 'radio',
                                         coursetotal => 'text',
                                         courselist => 'text',
                                      );
                       $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements);
                   }
                 $jscript .= &verify_user_display();                  $jscript .= &verify_user_display();
                 my $js = &add_script($jscript).$cb_jscript;                  my $js = &add_script($jscript).$cb_jscript;
                 my $loadcode =                   my $loadcode = 
Line 3360  sub handler { Line 4173  sub handler {
         }          }
     } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {      } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
         $r->print(&header());          $r->print(&header());
           my $brtext;
           if ($crstype eq 'Community') {
               $brtext = 'Drop Members';
           } else {
               $brtext = 'Drop Students';
           }
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>"Drop Students"});                text=>$brtext});
         if (!exists($env{'form.state'})) {          if (!exists($env{'form.state'})) {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
   
             &Apache::lonuserutils::print_drop_menu($r,$context,$permission);              &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype);
         } elsif ($env{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>"Result"});                text=>"Result"});
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',              $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
             &Apache::lonuserutils::update_user_list($r,$context,undef,              &Apache::lonuserutils::update_user_list($r,$context,undef,
                                                     $env{'form.action'});                                                      $env{'form.action'});
Line 3382  sub handler { Line 4201  sub handler {
         if ($permission->{'cusr'}) {          if ($permission->{'cusr'}) {
             $r->print(&header(undef,undef,{'no_nav_bar' => 1}).              $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
                       &Apache::lonuserutils::date_section_selector($context,                        &Apache::lonuserutils::date_section_selector($context,
                                                                    $permission).                                                                     $permission,$crstype).
                       &Apache::loncommon::end_page());                        &Apache::loncommon::end_page());
         } else {          } else {
             $r->print(&header().              $r->print(&header().
Line 3409  sub handler { Line 4228  sub handler {
             &update_selfenroll_config($r,$context,$permission);              &update_selfenroll_config($r,$context,$permission);
         }          }
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'selfenrollqueue') {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=selfenrollqueue',
                 text=>"Enrollment requests"});
           my $cid = $env{'request.course.id'};
           my $cdom = $env{'course.'.$cid.'.domain'};
           my $cnum = $env{'course.'.$cid.'.num'};
           my $coursedesc = $env{'course.'.$cid.'.description'};
           if (!exists($env{'form.state'})) {
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests',
                                                             'Course_SelfEnrollment_Approval'));
               $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");
               $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,
                                                                          $cdom,$cnum));
   
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=selfenrollqueue',
                 text=>"Result"});
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result',
                                                             'Course_Self_Enrollment'));
               $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");
               $r->print(&Apache::loncoursequeueadmin::update_request_queue($context,
                             $cdom,$cnum,$coursedesc));
           }
           $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'changelogs') {      } elsif ($env{'form.action'} eq 'changelogs') {
         $r->print(&header());          $r->print(&header());
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
Line 3421  sub handler { Line 4267  sub handler {
     } else {      } else {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print(&print_main_menu($permission,$context));          $r->print(&print_main_menu($permission,$context,$crstype));
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     }      }
     return OK;      return OK;
Line 3440  sub header { Line 4286  sub header {
   
 sub add_script {  sub add_script {
     my ($js) = @_;      my ($js) = @_;
     return '<script type="text/javascript">'."\n".$js."\n".'</script>';      return '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".
              "\n".$js."\n".
              '// ]]>'."\n".
              '</script>'."\n";
 }  }
   
 sub verify_user_display {  sub verify_user_display {
Line 3461  END Line 4311  END
 ###############################################################  ###############################################################
 #  Menu Phase One  #  Menu Phase One
 sub print_main_menu {  sub print_main_menu {
     my ($permission,$context) = @_;      my ($permission,$context,$crstype) = @_;
       my $linkcontext = $context;
       my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype));
       if (($context eq 'course') && ($crstype eq 'Community')) {
           $linkcontext = lc($crstype);
           $stuterm = 'Members';
       }
   
     my %links = (      my %links = (
                        domain => {                         domain => {
                                    upload => 'Upload a File of Users',                                     upload => 'Upload a File of Users',
Line 3474  sub print_main_menu { Line 4331  sub print_main_menu {
                                    listusers => 'Display Co-authors and Manage Multiple Users',                                     listusers => 'Display Co-authors and Manage Multiple Users',
                                  },                                   },
                        course => {                         course => {
                                    upload => 'File of Course Users',                                     upload => 'Upload a File of Course Users',
                                    singleuser => 'Single Course User',                                     singleuser => 'Add/Modify a Single Course User',
                                    listusers => 'Course User Lists',                                     listusers => 'Display Class Lists and Manage Multiple Users',
                                  },                                   },
                      );                         community => {
   my @menu = ( {categorytitle => 'Add Users',                                     upload     => 'Upload a File of Community Users',
      items =>                                     singleuser => 'Add/Modify a Community User',
      [{                                     listusers  => 'Manage Community Users',
          linktext => $links{$context}{'upload'},                                   },
          icon => 'sctr.png',                  );
          #help => 'Course_Create_Class_List',      my @menu =
          url => '/adm/createuser?action=upload',          (
          permission => $permission->{'cusr'},            { text => $links{$context}{'upload'},
          linktitle => 'Upload a CSV or a text file containing users.',              help => 'Course_Create_Class_List',
      },              action => 'upload',
      {              permission => $permission->{'cusr'},
          linktext => $links{$context}{'singleuser'},              },
          icon => 'edit-redo.png',            { text => $links{$context}{'singleuser'},
          #help => 'Course_Change_Privileges',              help => 'Course_Change_Privileges',
          url => '/adm/createuser?action=singleuser',              action => 'singleuser',
          permission => $permission->{'cusr'},              permission => $permission->{'cusr'},
          linktitle => 'Add a user with a certain role to this course.',              },
      }]},            { text => $links{$context}{'listusers'},
      {categorytitle => 'Administration',              help => 'Course_View_Class_List',
      items =>              action => 'listusers',
      [{              permission => ($permission->{'view'} || $permission->{'cusr'}),
          linktext => $links{$context}{'listusers'},            },
                  icon => 'edit-find.png',          );
                  #help => 'Course_View_Class_List',      if ($context eq 'domain' || $context eq 'course') {
                  url => '/adm/createuser?action=listusers',          my $customlink =  { text => 'Edit Custom Roles',
          permission => ($permission->{'view'} || $permission->{'cusr'}),                              help => 'Course_Editing_Custom_Roles',
          linktitle => 'Show and manage users of this course.',                              action => 'custom',
      }]},                              permission => $permission->{'custom'},
      {categorytitle => 'Configuration',                            };
      items =>          push(@menu,$customlink);
      [      }
      ]},      if ($context eq 'course') {
    );          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
           my @courselinks =
     if ($context eq 'domain'){              (
                 { text => 'Enroll a Single Student',
  push(@{ $menu[1]->{items} },                   help => 'Course_Add_Student',
  { linktext => 'Custom Roles',                   action => 'singlestudent',
  icon => 'emblem-photos.png',                   permission => $permission->{'cusr'},
  #help => 'Course_Editing_Custom_Roles',                   },
  url => '/adm/createuser?action=custom',                { text => 'Drop Students',
  permission => $permission->{'custom'},                  help => 'Course_Drop_Student',
  linktitle => 'Configure a custom role.',                  action => 'drop',
  });                  permission => $permission->{'cusr'},
                 });
     }elsif ($context eq 'course'){          if (!exists($permission->{'cusr_section'})) {
     my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();              if ($crstype ne 'Community') {
                   push(@courselinks,
         push(@{ $menu[0]->{items} },                     { text => 'Automated Enrollment Manager',
  { linktext => 'Single Student',                       help => 'Course_Automated_Enrollment',
             #help => 'Course_Add_Student',                       permission => (&Apache::lonnet::auto_run($cnum,$cdom)
  icon => 'list-add.png',                                     && $permission->{'cusr'}),
             url => '/adm/createuser?action=singlestudent',                       url  => '/adm/populate',
  permission => $permission->{'cusr'},                     });
             linktitle => 'Add a user with the role student to this course.',               }
         });               push(@courselinks,
                    { text  => 'Configure User Self-enrollment',
         push(@{ $menu[1]->{items} },                       help  => 'Course_Self_Enrollment',
  { linktext => 'Drop Students',                     action => 'selfenroll',
  icon => 'edit-undo.png',                     permission => $permission->{'cusr'},
             #help => 'Course_Drop_Student',                   });
             url => '/adm/createuser?action=drop',          }
  permission => $permission->{'cusr'},          if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
             linktitle =>'Remove a student from this course.',              push(@courselinks,
         },                      {   text => 'Enrollment Requests',
  { linktext => 'Custom Roles',                          help => 'Course_Approve_Selfenroll',
  icon => 'emblem-photos.png',                          action => 'selfenrollqueue',
             #help => 'Course_Editing_Custom_Roles',                          permission => $permission->{'cusr'},
             url => '/adm/createuser?action=custom',                      });
  permission => $permission->{'custom'},          }
  linktitle => 'Configure a custom role.',          push(@courselinks,
         });                 { text => 'Manage Course Groups',
                    help => 'Course_Manage_Group',
         if (!exists($permission->{'cusr_section'})){                   permission => $permission->{'grp_manage'},
                           url => '/adm/coursegroups?refpage=cusr',
  push(@{ $menu[2]->{items} },                 },
  { linktext => 'Automated Enrollment',                 { text => 'View Change Logs',
  icon => 'roles.png',                   help => 'Course_User_Logs',
           #help => 'Course_Automated_Enrollment',                   action => 'changelogs',
         permission => (&Apache::lonnet::auto_run($cnum,$cdom)                   permission => $permission->{'cusr'},
                                 && $permission->{'cusr'}),                 },);
  url  => '/adm/populate',  
  linktitle => 'Automated enrollment manager.',  
  },  
  { linktext => 'User Self-Enrollment',  
  icon => 'cstr.png',  
        #help => 'Course_Self_Enrollment',  
  url => '/adm/createuser?action=selfenroll',  
  permission => $permission->{'cusr'},  
  linktitle => 'Configure user self enrollment.',  
         });  
   
  }  
   
  push(@{ $menu[2]->{items} },  
  { linktext => 'Course Groups',  
  icon => 'conf.png',  
         #help => 'Course_Manage_Group',  
             url => '/adm/coursegroups?refpage=cusr',  
  permission => $permission->{'grp_manage'},  
  linktitle => 'Manage course groups.',  
         },  
         { linktext => 'Change Logs',  
  icon => 'document-properties.png',  
         #help => 'Course_User_Logs',  
         url => '/adm/createuser?action=changelogs',  
  permission => $permission->{'cusr'},  
  linktitle => 'View change log.',  
         });  
     };  
 return Apache::lonhtmlcommon::generate_menu(@menu);  
 #               { text => 'View Log-in History',  #               { text => 'View Log-in History',
 #                 help => 'Course_User_Logins',  #                 help => 'Course_User_Logins',
 #                 action => 'logins',  #                 action => 'logins',
 #                 permission => $permission->{'cusr'},  #                 permission => $permission->{'cusr'},
 #               });  #               });
           push(@menu,@courselinks);
       }
       my $menu_html = '';
       foreach my $menu_item (@menu) {
           next if (! $menu_item->{'permission'});
           $menu_html.='<p>';
           if (exists($menu_item->{'help'})) {
               $menu_html.=
                   &Apache::loncommon::help_open_topic($menu_item->{'help'});
           }
           $menu_html.='<font size="+1">';
           if (exists($menu_item->{'url'})) {
               $menu_html.=qq{<a href="$menu_item->{'url'}">};
           } else {
               $menu_html.=
                   qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};      }
           $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
           $menu_html.='</p>';
       }
       return $menu_html;
 }  }
   
 sub restore_prev_selections {  sub restore_prev_selections {
Line 3610  sub restore_prev_selections { Line 4457  sub restore_prev_selections {
   
 sub print_selfenroll_menu {  sub print_selfenroll_menu {
     my ($r,$context,$permission) = @_;      my ($r,$context,$permission) = @_;
       my $crstype = &Apache::loncommon::course_type();
     my $formname = 'enrollstudent';      my $formname = 'enrollstudent';
     my $nolink = 1;      my $nolink = 1;
     my ($row,$lt) = &get_selfenroll_titles();      my ($row,$lt) = &get_selfenroll_titles();
Line 3791  ENDSCRIPT Line 4639  ENDSCRIPT
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   
     my $output = '<script type="text/javascript">'."\n".      my $output = '<script type="text/javascript">'."\n".
                    '// <![CDATA['."\n".
                  $setsec_js."\n".$selfenroll_js."\n".                   $setsec_js."\n".$selfenroll_js."\n".
                    '// ]]>'."\n".
                  '</script>'."\n".                   '</script>'."\n".
                  '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n";                   '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n";
     my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);      my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
     if (ref($visactions) eq 'HASH') {      if (ref($visactions) eq 'HASH') {
         if ($visible) {          if ($visible) {
             $output .= '<p>'.$visactions->{'vis'}.'</p>';              $output .= '<p class="LC_info">'.$visactions->{'vis'}.'</p>';
         } else {          } else {
             $output .= $visactions->{'miss'}.'<br />'.$visactions->{'yous'}.              $output .= '<p class="LC_warning">'.$visactions->{'miss'}.'</p>'
                         .$visactions->{'yous'}.
                        '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};                         '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};
             if (ref($vismsgs) eq 'ARRAY') {              if (ref($vismsgs) eq 'ARRAY') {
                 $output .= '<br />'.$visactions->{'make'}.'<ul>';                  $output .= '<br />'.$visactions->{'make'}.'<ul>';
Line 3970  ENDSCRIPT Line 4821  ENDSCRIPT
                            &mt('No').'</label>';                             &mt('No').'</label>';
                 my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);                  my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);
                 my (@ccs,%notified);                  my (@ccs,%notified);
                 if ($advhash{'cc'}) {                  my $ccrole = 'cc';
                     @ccs = split(/,/,$advhash{'cc'});                  if ($crstype eq 'Community') {
                       $ccrole = 'co';
                   }
                   if ($advhash{$ccrole}) {
                       @ccs = split(/,/,$advhash{$ccrole});
                 }                  }
                 if ($currnotified) {                  if ($currnotified) {
                     foreach my $current (split(/,/,$currnotified)) {                      foreach my $current (split(/,/,$currnotified)) {
Line 3982  ENDSCRIPT Line 4837  ENDSCRIPT
                     }                      }
                 }                  }
                 if (@ccs) {                  if (@ccs) {
                     $output .= '<br />'.&mt('Personnel to be notified when a self-enrollment request needs approval, or has been approved:').'&nbsp;'.&Apache::loncommon::start_data_table().                      $output .= '<br />'.&mt('Personnel to be notified when an enrollment request needs approval, or has been approved:').'&nbsp;'.&Apache::loncommon::start_data_table().
                                &Apache::loncommon::start_data_table_row();                                 &Apache::loncommon::start_data_table_row();
                     my $count = 0;                      my $count = 0;
                     my $numcols = 4;                      my $numcols = 4;
Line 4031  ENDSCRIPT Line 4886  ENDSCRIPT
                     $selflimit = ' ';                      $selflimit = ' ';
                 }                  }
                 $output .= '<table><tr><td><label>'.                  $output .= '<table><tr><td><label>'.
                            '<input type="radio" name="selfenroll_limit" value="0"'.$nolimit.'/>'.                             '<input type="radio" name="selfenroll_limit" value="none"'.$nolimit.'/>'.
                            &mt('No limit').'</label></td><td><label>'.                             &mt('No limit').'</label></td><td><label>'.
                            '<input type="radio" name="selfenroll_limit" value="allstudents"'.$crslimit.'/>'.                             '<input type="radio" name="selfenroll_limit" value="allstudents"'.$crslimit.'/>'.
                            &mt('Limit by total students').'</label></td><td><label>'.                             &mt('Limit by total students').'</label></td><td><label>'.
Line 4047  ENDSCRIPT Line 4902  ENDSCRIPT
     }      }
     $output .= &Apache::lonhtmlcommon::end_pick_box().      $output .= &Apache::lonhtmlcommon::end_pick_box().
                '<br /><input type="button" name="selfenrollconf" value="'                 '<br /><input type="button" name="selfenrollconf" value="'
                .&mt('Save changes').'" onclick="validate_types(this.form);" />'                 .&mt('Save').'" onclick="validate_types(this.form);" />'
                .'<input type="hidden" name="action" value="selfenroll" /></form>';                 .'<input type="hidden" name="action" value="selfenroll" /></form>';
     $r->print($output);      $r->print($output);
     return;      return;
Line 4058  sub visible_in_cat { Line 4913  sub visible_in_cat {
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);      my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
     my ($cathash,%settable,@vismsgs,$cansetvis);      my ($cathash,%settable,@vismsgs,$cansetvis);
     my %visactions = &Apache::lonlocal::texthash(      my %visactions = &Apache::lonlocal::texthash(
                    vis => 'Your course currently appears in the Course Catalog for this domain.',                     vis => 'Your course/community currently appears in the Course/Community Catalog for this domain.',
                    gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',                     gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',
                    miss => 'Your course does not currently appear in the Course Catalog for this domain.',                     miss => 'Your course/community does not currently appear in the Course/Community Catalog for this domain.',
                    yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',                     yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
                    coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',                     coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
                    make => 'Make any changes to self-enrollment settings below, click "Save changes", then take action to include the course in the Catalog:',                     make => 'Make any changes to self-enrollment settings below, click "Save", then take action to include the course in the Catalog:',
                    take => 'Take the following action to ensure the course appears in the Catalog:',                     take => 'Take the following action to ensure the course appears in the Catalog:',
                    dc_unhide  => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',                     dc_unhide  => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',
                    dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',                     dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',
Line 4276  sub print_userchangelogs_display { Line 5131  sub print_userchangelogs_display {
     my $formname = 'roleslog';      my $formname = 'roleslog';
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = &Apache::loncommon::course_type();
     my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);      my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
     if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }      if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
   
Line 4314  sub print_userchangelogs_display { Line 5170  sub print_userchangelogs_display {
     }      }
     my (%whodunit,%changed,$version);      my (%whodunit,%changed,$version);
     ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);      ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
     $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version));      $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype));
     my $showntablehdr = 0;      my $showntablehdr = 0;
     my $tablehdr = &Apache::loncommon::start_data_table().      my $tablehdr = &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().                     &Apache::loncommon::start_data_table_header_row().
Line 4390  sub print_userchangelogs_display { Line 5246  sub print_userchangelogs_display {
         if ($roleslog{$id}{'logentry'}{'selfenroll'}) {          if ($roleslog{$id}{'logentry'}{'selfenroll'}) {
             $chgcontext = 'selfenroll';              $chgcontext = 'selfenroll';
         }          }
         my %lt = &rolechg_contexts();          my %lt = &rolechg_contexts($crstype);
         if ($chgcontext ne '' && $lt{$chgcontext} ne '') {          if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
             $chgcontext = $lt{$chgcontext};              $chgcontext = $lt{$chgcontext};
         }          }
         $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td><td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td><td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td><td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).'</td><td>'.$sec.'</td><td>'.$chgcontext.'</td><td>'.$rolestart.'</td><td>'.$roleend.'</td>'.&Apache::loncommon::end_data_table_row()."\n");          $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td><td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td><td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td><td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'</td><td>'.$sec.'</td><td>'.$chgcontext.'</td><td>'.$rolestart.'</td><td>'.$roleend.'</td>'.&Apache::loncommon::end_data_table_row()."\n");
     }      }
     if ($showntablehdr) {      if ($showntablehdr) {
         $r->print(&Apache::loncommon::end_data_table().'<br />');          $r->print(&Apache::loncommon::end_data_table().'<br />');
Line 4409  sub print_userchangelogs_display { Line 5265  sub print_userchangelogs_display {
             $r->print('</tr></table>');              $r->print('</tr></table>');
             $r->print(<<"ENDSCRIPT");              $r->print(<<"ENDSCRIPT");
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function chgPage(caller) {  function chgPage(caller) {
     if (caller == 'previous') {      if (caller == 'previous') {
         document.$formname.page.value --;          document.$formname.page.value --;
Line 4419  function chgPage(caller) { Line 5276  function chgPage(caller) {
     document.$formname.submit();       document.$formname.submit(); 
     return;      return;
 }  }
   // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
         }          }
     } else {      } else {
         $r->print(&mt('There are no records to display'));          $r->print('<p class="LC_info">'.
                     &mt('There are no records to display').
                     '</p>');
     }      }
     $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.      $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
               '<input type="hidden" name="action" value="changelogs" /></form>');                '<input type="hidden" name="action" value="changelogs" /></form>');
Line 4431  ENDSCRIPT Line 5291  ENDSCRIPT
 }  }
   
 sub role_display_filter {  sub role_display_filter {
     my ($formname,$cdom,$cnum,$curr,$version) = @_;      my ($formname,$cdom,$cnum,$curr,$version,$crstype) = @_;
     my $context = 'course';      my $context = 'course';
       my $lctype = lc($crstype);
     my $nolink = 1;      my $nolink = 1;
     my $output = '<table><tr><td valign="top">'.      my $output = '<table><tr><td valign="top">'.
                  '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b><br />'.                   '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
                  &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,                   &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
                                               (&mt('all'),5,10,20,50,100,1000,10000)).                                                (&mt('all'),5,10,20,50,100,1000,10000)).
                  '</td><td>&nbsp;&nbsp;</td>';                   '</td><td>&nbsp;&nbsp;</td>';
Line 4447  sub role_display_filter { Line 5308  sub role_display_filter {
         &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',          &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',
                                             $curr->{'rolelog_end_date'},undef,                                              $curr->{'rolelog_end_date'},undef,
                                             undef,undef,undef,undef,undef,undef,$nolink);                                              undef,undef,undef,undef,undef,undef,$nolink);
     my %lt = &rolechg_contexts();      my %lt = &rolechg_contexts($crstype);
     $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br /><table><tr><td>'.&mt('After:').      $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br /><table><tr><td>'.&mt('After:').
                '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.                 '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.
                $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>'.                 $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>'.
Line 4457  sub role_display_filter { Line 5318  sub role_display_filter {
         $output .= ' selected="selected"';          $output .= ' selected="selected"';
     }      }
     $output .=  '>'.&mt('Any').'</option>'."\n";      $output .=  '>'.&mt('Any').'</option>'."\n";
     my @roles = &Apache::lonuserutils::course_roles($context,undef,1);      my @roles = &Apache::lonuserutils::course_roles($context,undef,1,$lctype);
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole;          my $plrole;
         if ($role eq 'cr') {          if ($role eq 'cr') {
             $plrole = &mt('Custom Role');              $plrole = &mt('Custom Role');
         } else {          } else {
             $plrole=&Apache::lonnet::plaintext($role);              $plrole=&Apache::lonnet::plaintext($role,$crstype);
         }          }
         my $selstr = '';          my $selstr = '';
         if ($role eq $curr->{'role'}) {          if ($role eq $curr->{'role'}) {
Line 4473  sub role_display_filter { Line 5334  sub role_display_filter {
     }      }
     $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.      $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.
                &mt('Context:').'</b><br /><select name="chgcontext">';                 &mt('Context:').'</b><br /><select name="chgcontext">';
     foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll') {      foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll','requestcourses') {
         my $selstr = '';          my $selstr = '';
         if ($curr->{'chgcontext'} eq $chgtype) {          if ($curr->{'chgcontext'} eq $chgtype) {
             $output .= $selstr = ' selected="selected"';              $selstr = ' selected="selected"';
         }          }
         if (($chgtype eq 'auto') || ($chgtype eq 'updatenow')) {          if (($chgtype eq 'auto') || ($chgtype eq 'updatenow')) {
             next if (!&Apache::lonnet::auto_run($cnum,$cdom));              next if (!&Apache::lonnet::auto_run($cnum,$cdom));
         }          }
         $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";          $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";
     }      }
     $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.      $output .= '</select></td>'
                &mt('Update Display').'" /></tr></table>'.                .'</tr></table>';
                '<span class="LC_roleslog_note">'.  
                &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.6.99.0 or later are displayed.');      # Update Display button
       $output .= '<p>'
                 .'<input type="submit" value="'.&mt('Update Display').'" />'
                 .'</p>';
   
       # Server version info
       $output .= '<p style="font-size: smaller;" class="LC_info">'
                 .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                     ,'2.6.99.0');
     if ($version) {      if ($version) {
         $output .= ' '.&mt('This server is version [_3].','<b>','</b>',$version);    }          $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
     $output .= '</span><hr noshade><br />';      }
       $output .= '</p><hr /><br />';
     return $output;      return $output;
 }  }
   
 sub rolechg_contexts {  sub rolechg_contexts {
       my ($crstype) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                              any          => 'Any',                                               any          => 'Any',
                                              auto         => 'Automated enrollment',                                               auto         => 'Automated enrollment',
Line 4501  sub rolechg_contexts { Line 5372  sub rolechg_contexts {
                                              createcourse => 'Course Creation',                                               createcourse => 'Course Creation',
                                              course       => 'User Management in course',                                               course       => 'User Management in course',
                                              domain       => 'User Management in domain',                                               domain       => 'User Management in domain',
                                              selfenroll   => 'Self-enrolled',                                                selfenroll   => 'Self-enrolled',
                                                requestcourses => 'Course Request',
                                          );                                           );
       if ($crstype eq 'Community') {
           $lt{'createcourse'} = &mt('Community Creation');
           $lt{'course'} = &mt('User Management in community');
           $lt{'requestcourses'} = &mt('Community Request');
       }
     return %lt;      return %lt;
 }  }
   
Line 4586  sub user_search_result { Line 5463  sub user_search_result {
                                 &build_search_response($context,$srch,%srch_results);                                  &build_search_response($context,$srch,%srch_results);
                         } else {                          } else {
                             $currstate = 'modify';                              $currstate = 'modify';
                               my $uname = $srch->{'srchterm'};
                               my $udom = $srch->{'srchdomain'};
                               $srch_results{$uname.':'.$udom} =
                                   { &Apache::lonnet::get('environment',
                                                          ['firstname',
                                                           'lastname',
                                                           'permanentemail'],
                                                            $udom,$uname)
                                   };
                         }                          }
                     } else {                      } else {
                         %srch_results = &Apache::lonnet::usersearch($srch);                          %srch_results = &Apache::lonnet::usersearch($srch);
Line 4877  sub build_search_response { Line 5763  sub build_search_response {
                     $response .= '<br />'.&mt('You may want to broaden your search to the selected LON-CAPA domain.');                      $response .= '<br />'.&mt('You may want to broaden your search to the selected LON-CAPA domain.');
                 }                  }
             }              }
             if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $env{'request.role.domain'})) {              my $createdom = $env{'request.role.domain'};
               if ($context eq 'requestcrs') {
                   if ($env{'form.coursedom'} ne '') {
                       $createdom = $env{'form.coursedom'};
                   }
               }
               if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $createdom)) {
                 my $cancreate =                  my $cancreate =
                     &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);                      &Apache::lonuserutils::can_create_user($createdom,$context);
                   my $targetdom = '<span class="LC_cusr_emph">'.$createdom.'</span>';
                 if ($cancreate) {                  if ($cancreate) {
                     my $showdom = &display_domain_info($env{'request.role.domain'});                       my $showdom = &display_domain_info($createdom);
                     $response .= '<br /><br />'                      $response .= '<br /><br />'
                                 .'<b>'.&mt('To add a new user:').'</b>'                                  .'<b>'.&mt('To add a new user:').'</b>'
                                 .'<br />'                                  .'<br />';
                                 .&mt("(You can only create new users in your current role's domain - [_1])"                      if ($context eq 'requestcrs') {
                                     ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')                          $response .= &mt("(You can only define new users in the new course's domain - [_1])",$targetdom);
                                 .'<ul><li>'                      } else {
                           $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom);
                       }
                       $response .= '<ul><li>'
                                 .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>')                                  .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>')
                                 .'</li><li>'                                  .'</li><li>'
                                 .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>')                                  .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>')
Line 4898  sub build_search_response { Line 5794  sub build_search_response {
                                 .'</li></ul><br />';                                  .'</li></ul><br />';
                 } else {                  } else {
                     my $helplink = ' href="javascript:helpMenu('."'display'".')"';                      my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                     $response .= '<br /><br />'                      $response .= '<br /><br />';
                                 .&mt("You are not authorized to create new users in your current role's domain - [_1]."                      if ($context eq 'requestcrs') {
                                     ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')                          $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom);
                                 .'<br />'                      } else {
                                 .&mt('Contact the [_1]helpdesk[_2] if you need to create a new user.'                          $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'.$helplink.'>'
                                     ,'</a>')                                      ,'</a>')
                                 .'<br /><br />';                                  .'<br /><br />';
Line 4991  sub course_level_table { Line 5890  sub course_level_table {
             'end'  => "End"              'end'  => "End"
     );      );
   
     foreach my $protectedcourse (sort( keys(%inccourses))) {      foreach my $protectedcourse (sort(keys(%inccourses))) {
  my $thiscourse=$protectedcourse;   my $thiscourse=$protectedcourse;
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
           my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'});
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
         my $type=$coursedata{'type'};          my $crstype=$coursedata{'type'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count;          my %sections_count;
Line 5006  sub course_level_table { Line 5906  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
         my @roles = &Apache::lonuserutils::roles_by_context('course');          my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);
  foreach my $role (@roles) {   foreach my $role (@roles) {
             my $plrole=&Apache::lonnet::plaintext($role);              my $plrole=&Apache::lonnet::plaintext($role,$crstype);
     if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {              if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) ||
                   ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) {
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $plrole,\%sections_count,\%lt);                                                  $plrole,\%sections_count,\%lt);
             } elsif ($env{'request.course.sec'} ne '') {              } elsif ($env{'request.course.sec'} ne '') {
                 if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
                                              $env{'request.course.sec'})) {                                               $env{'request.course.sec'})) {
Line 5021  sub course_level_table { Line 5922  sub course_level_table {
             }              }
         }          }
         if (&Apache::lonnet::allowed('ccr',$thiscourse)) {          if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
             foreach my $cust (sort keys %customroles) {              foreach my $cust (sort(keys(%customroles))) {
                   next if ($crstype eq 'Community' && $customroles{$cust} =~ /bre\&S/);
                 my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;                  my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $cust,\%sections_count,\%lt);                                              $cust,\%sections_count,\%lt);
Line 5052  sub course_level_row { Line 5954  sub course_level_row {
               $protectedcourse.'_'.$role.'" /></td>'."\n".                $protectedcourse.'_'.$role.'" /></td>'."\n".
               ' <td>'.$plrole.'</td>'."\n".                ' <td>'.$plrole.'</td>'."\n".
               ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";                ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
     if ($role eq 'cc') {      if (($role eq 'cc') || ($role eq 'co')) {
         $row .= '<td>&nbsp;</td>';          $row .= '<td>&nbsp;</td>';
     } elsif ($env{'request.course.sec'} ne '') {      } elsif ($env{'request.course.sec'} ne '') {
         $row .= ' <td><input type="hidden" value="'.          $row .= ' <td><input type="hidden" value="'.
Line 5101  sub course_level_dc { Line 6003  sub course_level_dc {
                       '<input type="hidden" name="dccourse" value="" />';                        '<input type="hidden" name="dccourse" value="" />';
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
             ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';              ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';
     my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu');      my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser');
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'rol'  => "Role",                      'rol'  => "Role",
                     'grs'  => "Section",                      'grs'  => "Section",
Line 5112  sub course_level_dc { Line 6014  sub course_level_dc {
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
                   );                    );
     my $header = '<h4>'.&mt('Course Level').'</h4>'.      my $header = '<h4>'.&mt('Course/Community Level').'</h4>'.
                  &Apache::loncommon::start_data_table().                   &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().                   &Apache::loncommon::start_data_table_header_row().
                  '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.                   '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                  &Apache::loncommon::end_data_table_header_row();                   &Apache::loncommon::end_data_table_header_row();
     my $otheritems = &Apache::loncommon::start_data_table_row()."\n".      my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                      '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".                       '<td><br /><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n".
                      '<td><select name="role">'."\n";                       '<td valign><br /><select name="role">'."\n";
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$role.'">'.$plrole;          $otheritems .= '  <option value="'.$role.'">'.$plrole;
Line 5139  sub course_level_dc { Line 6041  sub course_level_dc {
                      '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.                       '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                      '<input type="text" name="newsec" value="" />'.                       '<input type="text" name="newsec" value="" />'.
                      '<input type="hidden" name="section" value="" />'.                       '<input type="hidden" name="section" value="" />'.
                      '<input type="hidden" name="groups" value="" /></td>'.                       '<input type="hidden" name="groups" value="" />'.
                        '<input type="hidden" name="crstype" value="" /></td>'.
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;
 <td><input type="hidden" name="start" value='' />  <td><br /><input type="hidden" name="start" value='' />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
 <td><input type="hidden" name="end" value='' />  <td><br /><input type="hidden" name="end" value='' />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
 ENDTIMEENTRY  ENDTIMEENTRY
Line 5209  sub update_selfenroll_config { Line 6112  sub update_selfenroll_config {
                             $newnum ++;                              $newnum ++;
                         }                          }
                     }                      }
                     for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {                        if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {                      for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {
                           if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {
                             my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);                              my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);
                             if (@types > 0) {                              if (@types > 0) {
                                 @types = sort(@types);                                  @types = sort(@types);
Line 5297  sub update_selfenroll_config { Line 6201  sub update_selfenroll_config {
                         }                          }
                     } else {                      } else {
                         my @differences =                            my @differences =  
                             &compare_arrays(\@currnotified,\@newnotified);                              &Apache::loncommon::compare_arrays(\@currnotified,\@newnotified);
                         if (@differences > 0) {                          if (@differences > 0) {
                             if (@newnotified > 0) {                              if (@newnotified > 0) {
                                 $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);                                  $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
Line 5307  sub update_selfenroll_config { Line 6211  sub update_selfenroll_config {
                         }                          }
                     }                      }
                 } else {                  } else {
                     my @differences = &compare_arrays(\@currnotified,\@newnotified);                      my @differences = &Apache::loncommon::compare_arrays(\@currnotified,\@newnotified);
                     if (@differences > 0) {                      if (@differences > 0) {
                         if (@newnotified > 0) {                          if (@newnotified > 0) {
                             $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);                              $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
Line 5409  sub update_selfenroll_config { Line 6313  sub update_selfenroll_config {
                                 if ($currlimit eq 'allstudents') {                                  if ($currlimit eq 'allstudents') {
                                     $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap);                                      $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap);
                                 } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') {                                  } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') {
                                     $newval =  &mt('New self-enrollment no longer allowed when total umber of self-enrolled students reaches [_1].',$newcap);                                      $newval =  &mt('New self-enrollment no longer allowed when total number of self-enrolled students reaches [_1].',$newcap);
                                 }                                  }
                             }                              }
                             $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval).'</li>'."\n");                              $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval).'</li>'."\n");
Line 5438  sub update_selfenroll_config { Line 6342  sub update_selfenroll_config {
                             }                              }
                             $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval));                              $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval));
                             if ($newnotify) {                              if ($newnotify) {
                                 $r->print('<br />'.&mt('The following will be notified when a self-enrollment request needs approval, or has been approved: [_1].',$newnotify));                                  $r->print('<br />'.&mt('The following will be notified when an enrollment request needs approval, or has been approved: [_1].',$newnotify));
                             } else {                              } else {
                                 $r->print('<br />'.&mt('No notifications sent when a self-enrollment request needs approval, or has been approved.'));                                  $r->print('<br />'.&mt('No notifications sent when an enrollment request needs approval, or has been approved.'));
                             }                              }
                             $r->print('</li>'."\n");                              $r->print('</li>'."\n");
                         }                          }
Line 5497  sub update_selfenroll_config { Line 6401  sub update_selfenroll_config {
     return;      return;
 }  }
   
 sub compare_arrays {  
     my ($arrayref1,$arrayref2) = @_;  
     my (@difference,%count);  
     @difference = ();  
     %count = ();  
     if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) {   
         foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; }  
         foreach my $element (keys(%count)) {  
             if ($count{$element} == 1) {  
                 push(@difference,$element);  
             }  
         }  
     }  
     return @difference;  
 }  
   
 sub get_selfenroll_titles {  sub get_selfenroll_titles {
     my @row = ('types','registered','enroll_dates','access_dates','section',      my @row = ('types','registered','enroll_dates','access_dates','section',
                'approval','limit');                 'approval','limit');
Line 5528  sub get_selfenroll_titles { Line 6416  sub get_selfenroll_titles {
     return (\@row,\%lt);      return (\@row,\%lt);
 }  }
   
   sub is_courseowner {
       my ($thiscourse,$courseowner) = @_;
       if ($courseowner eq '') {
           if ($env{'request.course.id'} eq $thiscourse) {
               $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
           }
       }
       if ($courseowner ne '') {
           if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) {
               return 1;
           }
       }
       return;
   }
   
 #---------------------------------------------- end functions for &phase_two  #---------------------------------------------- end functions for &phase_two
   
 #--------------------------------- functions for &phase_two and &phase_three  #--------------------------------- functions for &phase_two and &phase_three

Removed from v.1.276  
changed lines
  Added in v.1.295.2.26


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