Diff for /loncom/interface/loncreateuser.pm between versions 1.279 and 1.324

version 1.279, 2009/02/08 20:01:54 version 1.324, 2009/11/12 15:58:22
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::selfenroll();  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 110  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 143  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 153  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 214  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 225  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',
                      'community'  => 'Can request creation of communities',
     );      );
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,          %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                       'requestcourses.official','requestcourses.unofficial');                        'requestcourses.official','requestcourses.unofficial',
         @usertools = ('official','unofficial');                        'requestcourses.community');
           @usertools = ('official','unofficial','community');
           @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>'.  
                    '<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></td>'."\n".  
                    &Apache::loncommon::end_data_table_row()."\n";                     &Apache::loncommon::end_data_table_row()."\n";
     }      }
     return $output;      return $output;
 }  }
   
   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";
       }
       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 299  sub print_username_entry_form { Line 483  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 327  sub print_username_entry_form { Line 518  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" onchange="">'.
                             &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 408  ENDBLOCK Line 663  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 466  sub user_modification_js { Line 726  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 483  sub user_modification_js { Line 744  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 502  sub print_user_selection_page { Line 763  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 510  function pickuser(uname,udom) { Line 772  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 570  ENDSCRIPT Line 851  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 591  ENDSCRIPT Line 884  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 603  sub print_user_query_page { Line 900  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 631  sub print_user_modification_page { Line 928  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 641  sub print_user_modification_page { Line 938  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 667  sub print_user_modification_page { Line 969  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 694  sub print_user_modification_page { Line 996  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 743  ENDFORMINFO Line 1045  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 753  $crumbs Line 1056  $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 777  $lt{'hs'}: $home_server_pick Line 1086  $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 810  KERB Line 1126  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 845  ENDAUTH Line 1161  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 854  $forminfo Line 1171  $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 868  ENDCHANGEUSER Line 1189  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,'requestcourses').              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 901  ENDNOPORTPRIV Line 1227  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 947  ENDNOTOOLSPRIV Line 1273  ENDNOTOOLSPRIV
     } ## 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 960  ENDNOTOOLSPRIV Line 1292  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 975  ENDNOTOOLSPRIV Line 1307  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 986  ENDNOTOOLSPRIV Line 1318  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 1043  sub validation_javascript { Line 1380  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;
 }  }
   
Line 1199  sub display_existing_roles { Line 1540  sub display_existing_roles {
             }              }
             $row.= '</td><td>'.$plaintext.              $row.= '</td><td>'.$plaintext.
                    '</td><td>'.$area.                     '</td><td>'.$area.
                    '</td><td>'.($role_start_time?localtime($role_start_time)                     '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)
                                                 : '&nbsp;' ).                                                  : '&nbsp;' ).
                    '</td><td>'.($role_end_time  ?localtime($role_end_time)                     '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)
                                                 : '&nbsp;' )                                                  : '&nbsp;' )
                    ."</td>";                     ."</td>";
             $sortrole{$sortkey}=$envkey;              $sortrole{$sortkey}=$envkey;
Line 1212  sub display_existing_roles { Line 1553  sub display_existing_roles {
         } # end of foreach        (table building loop)          } # end of foreach        (table building loop)
         my $rolesdisplay = 0;          my $rolesdisplay = 0;
         my %output = ();          my %output = ();
         foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {          foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {
             $output{$type} = '';              $output{$type} = '';
             foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {              foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
                 if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {                  if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
Line 1230  sub display_existing_roles { Line 1571  sub display_existing_roles {
             }              }
         }          }
         if ($rolesdisplay == 1) {          if ($rolesdisplay == 1) {
               my $contextrole='';
               if ($env{'request.course.id'}) {
                   my $crstype = &Apache::loncommon::course_type();
                   $contextrole = "Existing Roles in this $crstype";
               } elsif ($env{'request.role'} =~ /^au\./) {
                   $contextrole = 'Existing Co-Author Roles in your Construction Space';
               } else {
                   $contextrole = 'Existing Roles in this Domain';
               }
             $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");
                 }                  }
Line 1283  sub new_coauthor_roles { Line 1634  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 1295  sub new_coauthor_roles { Line 1646  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 1335  sub new_domain_roles { Line 1686  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 1346  sub new_domain_roles { Line 1699  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 1387  sub user_authentication { Line 1740  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 1416  ENDBADAUTH Line 1771  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 1524  sub modify_login_block { Line 1881  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 1549  sub personal_data_display { Line 1909  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 1587  sub personal_data_display { Line 1948  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 1613  sub personal_data_display { Line 1978  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 1625  sub personal_data_display { Line 2014  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 1653  sub get_inststatuses { Line 2084  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 1673  sub update_user_data { Line 2104  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 1713  sub update_user_data { Line 2147  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 1724  sub update_user_data { Line 2158  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 2207  sub update_user_data {
  $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');   $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
     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','community');
       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 1852  sub update_user_data { Line 2288  sub update_user_data {
                 }                  }
             }              }
             foreach my $item (@requestcourses) {              foreach my $item (@requestcourses) {
                 $newcustom{$item} = $env{'form.requestcourses_'.$item};                  $newcustom{$item} = $env{'form.crsreq_'.$item};
                   if ($env{'form.crsreq_'.$item} eq 'autolimit') {
                       $newcustom{$item} .= '=';
                       unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {
                           $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};
                       }
                   }
                 $changed{$item} = &tool_admin($item,$newcustom{$item},                  $changed{$item} = &tool_admin($item,$newcustom{$item},
                                               \%changeHash,'requestcourses');                                                \%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)) {
                 $changeHash{'firstname'}  = $env{'form.cfirstname'};                  $changeHash{'firstname'}  = $env{'form.cfirstname'};
                 $changeHash{'middlename'} = $env{'form.cmiddlename'};                  $changeHash{'middlename'} = $env{'form.cmiddlename'};
Line 1891  sub update_user_data { Line 2340  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
Line 1901  sub update_user_data { Line 2351  sub update_user_data {
             ('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','requestcourses.official',               'tools.blog','tools.portfolio','requestcourses.official',
              'requestcourses.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 1975  sub update_user_data { Line 2427  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 2003  sub update_user_data { Line 2455  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 2024  sub update_user_data { Line 2476  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 2038  sub update_user_data { Line 2491  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 2056  sub update_user_data { Line 2550  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 2082  sub update_user_data { Line 2576  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('requestcourses',\@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 2109  sub update_user_data { Line 2608  sub update_user_data {
                         ($env{'user.domain'} eq $env{'form.ccdomain'})) {                          ($env{'user.domain'} eq $env{'form.ccdomain'})) {
                         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')
                                   || ($key eq 'community')) {
                                 $newenvhash{'environment.requestcourses.'.$key} =                                  $newenvhash{'environment.requestcourses.'.$key} =
                                     $changeHash{'requestcourses.'.$key};                                      $changeHash{'requestcourses.'.$key};
                                 if ($changeHash{'requestcourses.'.$key} ne '') {                                  if ($changeHash{'requestcourses.'.$key} ne '') {
Line 2158  sub update_user_data { Line 2658  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",                               'community'  => 'Can Request Communities',
                              'chto'       => "Changed To"                               'inststatus' => "Affiliation",
                                '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 2186  sub update_user_data { Line 2688  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 2213  END Line 2724  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 2240  END Line 2760  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 2289  END Line 2818  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",
                              'community'  => "Can Request Communities",
                              '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 2304  END Line 2835  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 2345  END Line 2884  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 2354  END Line 2896  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 2397  sub tool_changes { Line 2944  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 2407  sub tool_changes { Line 3048  sub tool_changes {
             }              }
             $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$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->{$context.'.'.$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 2436  sub tool_changes { Line 3077  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 2532  sub update_roles { Line 3173  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 2584  sub update_roles { Line 3225  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 2731  sub update_roles { Line 3372  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 2765  sub enroll_single_student { Line 3412  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 2835  sub tool_admin { Line 3488  sub tool_admin {
         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 2886  sub build_roles { Line 3543  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 2915  sub custom_role_editor { Line 3581  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 2954  sub custom_role_editor { Line 3623  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','')",
Line 2979  sub custom_role_editor { Line 3690  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 2997  ENDCCF Line 3717  ENDCCF
 '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.  '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.
 '</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 3036  sub make_script_template { Line 3760  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 3088  sub make_script_template { Line 3813  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 3103  sub set_custom_role { Line 3828  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>'."\n";
   
     $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 3185  sub handler { Line 3914  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 3200  sub handler { Line 3930  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 3218  sub handler { Line 3951  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 3234  sub handler { Line 3967  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 3259  sub handler { Line 3992  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 3275  sub handler { Line 4008  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 3293  sub handler { Line 4026  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 3345  sub handler { Line 4078  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 3369  sub handler { Line 4114  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($brtext,
                                                           '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 3391  sub handler { Line 4142  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 3426  sub handler { Line 4177  sub handler {
         my $cid = $env{'request.course.id'};          my $cid = $env{'request.course.id'};
         my $cdom = $env{'course.'.$cid.'.domain'};          my $cdom = $env{'course.'.$cid.'.domain'};
         my $cnum = $env{'course.'.$cid.'.num'};          my $cnum = $env{'course.'.$cid.'.num'};
           my $coursedesc = $env{'course.'.$cid.'.description'};
         if (!exists($env{'form.state'})) {          if (!exists($env{'form.state'})) {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests',
                                                           'Course_SelfEnrollment_Approval'));                                                            'Course_SelfEnrollment_Approval'));
             $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");              $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");
             &display_selfenroll_queue($r,$context,$permission,$cnum,$cdom);              $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,
                                                                          $cdom,$cnum));
         } elsif ($env{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=selfenrollqueue',              ({href=>'/adm/createuser?action=selfenrollqueue',
Line 3438  sub handler { Line 4191  sub handler {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result',
                                                           'Course_Self_Enrollment'));                                                            'Course_Self_Enrollment'));
             $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");              $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");
             &update_selfenroll_queue($r,$context,$permission,$cid,$cnum,$cdom);              $r->print(&Apache::loncoursequeueadmin::update_request_queue($context,
                             $cdom,$cnum,$coursedesc));
         }          }
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'changelogs') {      } elsif ($env{'form.action'} eq 'changelogs') {
Line 3453  sub handler { Line 4207  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 3472  sub header { Line 4226  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"
             .$js."\n"
             .'// ]]>'."\n"
             .'</script>'."\n";
 }  }
   
 sub verify_user_display {  sub verify_user_display {
Line 3493  END Line 4251  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',
                                    singleuser => 'Add/Modify a Single User',                              singleuser => 'Add/Modify a User',
                                    listusers => 'Manage Multiple Users',                              listusers  => 'Manage Users',
                                  },                              },
                        author => {                  author => {
                                    upload => 'Upload a File of Co-authors',                              upload     => 'Upload a File of Co-authors',
                                    singleuser => 'Add/Modify a Single Co-author',                              singleuser => 'Add/Modify a Co-author',
                                    listusers => 'Display Co-authors and Manage Multiple Users',                              listusers  => 'Manage Co-authors',
                                  },                              },
                        course => {                  course => {
                                    upload => 'File of Course Users',                              upload     => 'Upload a File of Course Users',
                                    singleuser => 'Single Course User',                              singleuser => 'Add/Modify a Course User',
                                    listusers => 'Course User Lists',                              listusers  => 'Manage Course 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 %linktitles = (
          url => '/adm/createuser?action=upload',                  domain => {
          permission => $permission->{'cusr'},                              singleuser => 'Add a user to the domain, and/or a course or community in the domain.',
          linktitle => 'Upload a CSV or a text file containing users.',                              listusers  => 'Show and manage users in this domain.',
      },                              },
      {                  author => {
          linktext => $links{$context}{'singleuser'},                              singleuser => 'Add a user with a co- or assistant author role.',
          icon => 'edit-redo.png',                              listusers  => 'Show and manage co- or assistant authors.',
          #help => 'Course_Change_Privileges',                              },
          url => '/adm/createuser?action=singleuser',                  course => {
          permission => $permission->{'cusr'},                              singleuser => 'Add a user with a certain role to this course.',
          linktitle => 'Add a user with a certain role to this course.',                              listusers  => 'Show and manage users in this course.',
      }]},                              },
      {categorytitle => 'Administration',                  community => {
      items =>                              singleuser => 'Add a user with a certain role to this community.',
      [{                              listusers  => 'Show and manage users in this community.',
          linktext => $links{$context}{'listusers'},                             },
                  icon => 'edit-find.png',                  );
                  #help => 'Course_View_Class_List',    my @menu = ( {categorytitle => 'Single Users', 
                  url => '/adm/createuser?action=listusers',           items =>
          permission => ($permission->{'view'} || $permission->{'cusr'}),           [
          linktitle => 'Show and manage users of this course.',              {
      }]},               linktext => $links{$linkcontext}{'singleuser'},
      {categorytitle => 'Configuration',               icon => 'edit-redo.png',
      items =>               #help => 'Course_Change_Privileges',
      [               url => '/adm/createuser?action=singleuser',
      ]},               permission => $permission->{'cusr'},
    );               linktitle => $linktitles{$linkcontext}{'singleuser'},
               },
            ]},
   
            {categorytitle => 'Multiple Users',
            items => 
            [
               {
                linktext => $links{$linkcontext}{'upload'},
                icon => 'sctr.png',
                #help => 'Course_Create_Class_List',
                url => '/adm/createuser?action=upload',
                permission => $permission->{'cusr'},
                linktitle => 'Upload a CSV or a text file containing users.',
               },
               {
                linktext => $links{$linkcontext}{'listusers'},
                icon => 'edit-find.png',
                #help => 'Course_View_Class_List',
                url => '/adm/createuser?action=listusers',
                permission => ($permission->{'view'} || $permission->{'cusr'}),
                linktitle => $linktitles{$linkcontext}{'listusers'}, 
               },
   
            ]},
   
            {categorytitle => 'Administration',
            items => [ ]},
          );
               
     if ($context eq 'domain'){      if ($context eq 'domain'){
           
  push(@{ $menu[1]->{items} },          push(@{ $menu[2]->{items} }, #Category: Administration
  { linktext => 'Custom Roles',              {
  icon => 'emblem-photos.png',               linktext => 'Custom Roles',
  #help => 'Course_Editing_Custom_Roles',               icon => 'emblem-photos.png',
  url => '/adm/createuser?action=custom',               #help => 'Course_Editing_Custom_Roles',
  permission => $permission->{'custom'},               url => '/adm/createuser?action=custom',
  linktitle => 'Configure a custom role.',               permission => $permission->{'custom'},
  });               linktitle => 'Configure a custom role.',
               },
           );
           
     }elsif ($context eq 'course'){      }elsif ($context eq 'course'){
     my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
   
         push(@{ $menu[0]->{items} },          my %linktext = (
  { linktext => 'Single Student',                           'Course'    => {
             #help => 'Course_Add_Student',                                            single => 'Add/Modify a Student', 
  icon => 'list-add.png',                                            drop   => 'Drop Students',
             url => '/adm/createuser?action=singlestudent',                                            groups => 'Course Groups',
  permission => $permission->{'cusr'},                                          },
             linktitle => 'Add a user with the role student to this course.',                           'Community' => {
         });                                            single => 'Add/Modify a Member', 
                                             drop   => 'Drop Members',
         push(@{ $menu[1]->{items} },                                              groups => 'Community Groups',
  { linktext => 'Drop Students',                                          },
  icon => 'edit-undo.png',                         );
             #help => 'Course_Drop_Student',  
             url => '/adm/createuser?action=drop',          my %linktitle = (
  permission => $permission->{'cusr'},              'Course' => {
             linktitle =>'Remove a student from this course.',                    single => 'Add a user with the role of student to this course',
         },                    drop   => 'Remove a student from this course.',
  { linktext => 'Custom Roles',                    groups => 'Manage course groups',
  icon => 'emblem-photos.png',                          },
             #help => 'Course_Editing_Custom_Roles',              'Community' => {
             url => '/adm/createuser?action=custom',                    single => 'Add a user with the role of member to this community',
  permission => $permission->{'custom'},                    drop   => 'Remove a member from this community.',
  linktitle => 'Configure a custom role.',                    groups => 'Manage community groups',
         });                             },
           );
   
           push(@{ $menu[0]->{items} }, #Category: Single Users
               {   
                linktext => $linktext{$crstype}{'single'},
                #help => 'Course_Add_Student',
                icon => 'list-add.png',
                url => '/adm/createuser?action=singlestudent',
                permission => $permission->{'cusr'},
                linktitle => $linktitle{$crstype}{'single'},
               },
           );
           
           push(@{ $menu[1]->{items} }, #Category: Multiple Users 
               {
                linktext => $linktext{$crstype}{'drop'},
                icon => 'edit-undo.png',
                #help => 'Course_Drop_Student',
                url => '/adm/createuser?action=drop',
                permission => $permission->{'cusr'},
                linktitle => $linktitle{$crstype}{'drop'},
               },
           );
           push(@{ $menu[2]->{items} }, #Category: Administration
               {    
                linktext => 'Custom Roles',
                icon => 'emblem-photos.png',
                #help => 'Course_Editing_Custom_Roles',
                url => '/adm/createuser?action=custom',
                permission => $permission->{'custom'},
                linktitle => 'Configure a custom role.',
               },
               {
                linktext => $linktext{$crstype}{'groups'},
                icon => 'conf.png',
                #help => 'Course_Manage_Group',
                url => '/adm/coursegroups?refpage=cusr',
                permission => $permission->{'grp_manage'},
                linktitle => $linktitle{$crstype}{'groups'},
               },
               {
                linktext => 'Change Logs',
                icon => 'document-properties.png',
                #help => 'Course_User_Logs',
                url => '/adm/createuser?action=changelogs',
                permission => $permission->{'cusr'},
                linktitle => 'View change log.',
               },
           );
         if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {          if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
             push(@{ $menu[1]->{items} },              push(@{ $menu[2]->{items} },
                     {   linktext => 'Enrollment Requests',                      {   
                         icon => 'selfenrl-queue.png',                       linktext => 'Enrollment Requests',
                         #help => 'Course_Approve_Selfenroll',                       icon => 'selfenrl-queue.png',
                         url => '/adm/createuser?action=selfenrollqueue',                       #help => 'Course_Approve_Selfenroll',
                         permission => $permission->{'cusr'},                       url => '/adm/createuser?action=selfenrollqueue',
                         linktitle =>'Approve or reject enrollment requests.',                       permission => $permission->{'cusr'},
                 });                       linktitle =>'Approve or reject enrollment requests.',
                       },
               );
         }          }
           
         if (!exists($permission->{'cusr_section'})){          if (!exists($permission->{'cusr_section'})){
                      if ($crstype ne 'Community') {
  push(@{ $menu[2]->{items} },                  push(@{ $menu[2]->{items} },
  { linktext => 'Automated Enrollment',                      {
  icon => 'roles.png',                       linktext => 'Automated Enrollment',
           #help => 'Course_Automated_Enrollment',                       icon => 'roles.png',
         permission => (&Apache::lonnet::auto_run($cnum,$cdom)                       #help => 'Course_Automated_Enrollment',
                                 && $permission->{'cusr'}),                       permission => (&Apache::lonnet::auto_run($cnum,$cdom)
  url  => '/adm/populate',                                           && $permission->{'cusr'}),
  linktitle => 'Automated enrollment manager.',                       url  => '/adm/populate',
  },                       linktitle => 'Automated enrollment manager.',
  { linktext => 'User Self-Enrollment',                      }
  icon => 'cstr.png',                  );
        #help => 'Course_Self_Enrollment',              }
  url => '/adm/createuser?action=selfenroll',              push(@{ $menu[2]->{items} }, 
  permission => $permission->{'cusr'},                  {
  linktitle => 'Configure user self enrollment.',                   linktext => 'User Self-Enrollment',
         });                   icon => 'cstr.png',
                    #help => 'Course_Self_Enrollment',
  }                   url => '/adm/createuser?action=selfenroll',
                    permission => $permission->{'cusr'},
  push(@{ $menu[2]->{items} },                   linktitle => 'Configure user self-enrollment.',
  { 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);  return Apache::lonhtmlcommon::generate_menu(@menu);
 #               { text => 'View Log-in History',  #               { text => 'View Log-in History',
Line 3652  sub restore_prev_selections { Line 4486  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 3833  ENDSCRIPT Line 4668  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 3861  ENDSCRIPT Line 4699  ENDSCRIPT
             if (ref($lt) eq 'HASH') {              if (ref($lt) eq 'HASH') {
                 $title = $lt->{$item};                  $title = $lt->{$item};
             }              }
             $output .=               $output .= &Apache::lonhtmlcommon::row_title($title);
                 &Apache::lonhtmlcommon::row_title($title,  
                              'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n";  
             if ($item eq 'types') {              if ($item eq 'types') {
                 my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'};                  my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'};
                 my $showdomdesc = 1;                  my $showdomdesc = 1;
Line 4012  ENDSCRIPT Line 4848  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 4089  ENDSCRIPT Line 4929  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;
 }  }
   
 sub display_selfenroll_queue {  
     my ($r,$context,$permission,$cnum,$cdom) = @_;  
     my $namespace = 'selfenrollrequests';  
     my ($output,%queue_by_date);  
     my %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);  
     if (keys(%requesthash) > 0) {  
         $r->print('<form method="post" name="changequeue" action="/adm/createuser" />'.  
                   '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.  
                   '<input type="hidden" name="state" value="done" />'.  
                   &Apache::loncommon::start_data_table().  
                   &Apache::loncommon::start_data_table_header_row().  
                   '<th>'.&mt('Action').'</th>'.  
                   '<th>'.&mt('Requestor').'</th>'.  
                   '<th>'.&mt('Section').'</th>'.  
                   '<th>'.&mt('Date requested').'</th>'.  
                   &Apache::loncommon::end_data_table_header_row());  
         foreach my $item (keys(%requesthash)) {  
             my ($timestamp,$usec) = split(/:/,$requesthash{$item});  
             if (exists($queue_by_date{$timestamp})) {  
                 if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {  
                     push(@{$queue_by_date{$timestamp}},$item.':'.$usec);  
                 }  
             } else {  
                 @{$queue_by_date{$timestamp}} = ($item.':'.$usec);  
             }  
         }  
         my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));  
         my $count = 0;  
         foreach my $item (@sortedtimes) {  
             if (ref($queue_by_date{$item}) eq 'ARRAY') {  
                 foreach my $request (sort(@{$queue_by_date{$item}})) {  
                     my ($puname,$pudom,$pusec) = split(/:/,$request);  
                     my $showsec = $pusec;  
                     if ($showsec eq '') {  
                         $showsec = &mt('none');  
                     }  
                     my $namelink = &Apache::loncommon::aboutmewrapper(  
                                      &Apache::loncommon::plainname($puname,$pudom),  
                                      $puname,$pudom);  
                     $r->print(&Apache::loncommon::start_data_table_row().  
                               '<td><span class="LC_nobreak"><label>'.  
                               '<input type="checkbox" value="'.$count.':'.$puname.':'.$pudom.':'.$pusec.'" name="approvereq" />'.&mt('Approve').'</label></span><br />'.  
                               '<span class="LC_nobreak"><label>'.  
                               '<input type="checkbox" value="'.$puname.':'.$pudom.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>'.  
                               '<td>'.$namelink.'</td>'.  
                               '<td>'.$showsec.'</td>'.  
                               '<td>'.&Apache::lonlocal::locallocaltime($item).'</td>'.  
                               &Apache::loncommon::end_data_table_row());  
                     $count ++;  
                 }  
             }  
         }  
         $r->print(&Apache::loncommon::end_data_table().  
                   '<input type="submit" name="processqueue" value="'.&mt('Save').'" /></form>');  
     } else {  
         $r->print(&mt('There are currently no enrollment requests.'));    
     }  
     return;  
 }  
   
 sub update_selfenroll_queue {  
     my ($r,$context,$permission,$cid,$cnum,$cdom) = @_;  
     my @approvals = &Apache::loncommon::get_env_multiple('form.approvereq');  
     my @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq');  
     my $access_start =  $env{'course.'.$cid.'.internal.selfenroll_start_access'};  
     my $access_end =  $env{'course.'.$cid.'.internal.selfenroll_end_access'};  
     my $limit = $env{'course.'.$cid.'.internal.selfenroll_limit'};   
     my $cap = $env{'course.'.$cid.'.internal.selfenroll_cap'};  
     my $notifylist = $env{'course.'.$cid.'.internal.selfenroll_notifylist'};  
     my $namespace = 'selfenrollrequests';  
     my ($stucounts,$idx,$classlist) = &get_student_counts($cdom,$cnum);  
     my %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);  
     my $coursedesc = $env{'course.'.$cid.'.description'};  
     my $chome = &Apache::lonnet::homeserver($cnum,$cdom);  
     my $hostname = &Apache::lonnet::hostname($chome);  
     my $protocol = $Apache::lonnet::protocol{$chome};  
     $protocol = 'http' if ($protocol ne 'https');  
     my (@existing,@missingreq,@invalidusers,@limitexceeded,@enrolled,@enrollerrors,);  
     my $now = time;  
     my $sender = $env{'user.name'}.':'.$env{'user.domain'};  
     my $approvedmsg = [{  
                         mt => 'Your request for enrollment has been approved.',  
                       },  
                       {  
                         mt => 'Visit [_1], to log-in and access the course',  
                         args => [$protocol.'://'.$hostname],  
                       }];  
                         
     my $rejectedmsg =  [{  
                          mt => 'Your request for enrollment has not been approved.',  
                        }];  
     foreach my $item (sort {$a <=> $b} @approvals) {  
         my ($num,$uname,$udom,$usec) = split(/:/,$item);  
         my $uhome = &Apache::lonnet::homeserver($uname,$udom);  
         if ($uhome ne 'no_host') {  
             if (exists($requesthash{$uname.':'.$udom})) {  
                  
                 if (exists($classlist->{$uname.':'.$udom})) {  
                     if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {  
                         if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') ||  
                             ($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Future')) {  
                             push(@existing,$uname.':'.$udom);  
                             next;  
                         }  
                     }  
                 }  
             } else {  
                 push(@missingreq,$uname.':'.$udom);  
                 next;  
             }  
             if (!grep(/^\Q$item\E$/,@rejections)) {  
                 if ($limit eq 'allstudents') {  
                     if ($stucounts->{$limit} >= $cap) {  
                         push(@limitexceeded,$uname.':'.$udom);  
                         last;  
                     }  
                 } elsif ($limit eq 'selfenrolled') {  
                     if ($stucounts->{$limit} >= $cap) {  
                         push(@limitexceeded,$uname.':'.$udom);  
                         last;  
                     }  
                 }  
                 my $result =   
                     &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$usec,$access_end,$access_start,'selfenroll',undef,$cdom.'_'.$cnum,1);  
                 if ($result eq 'ok') {  
                     push(@enrolled,$uname.':'.$udom);  
                     $stucounts->{'allstudents'} ++;  
                     $stucounts->{'selfenrolled'} ++;  
                     &Apache::selfenroll::send_notification($uname.':'.$udom,$approvedmsg,$cid,  
                                                $coursedesc,$now,'enroller',$sender);  
                 } else {  
                     push(@enrollerrors,$uname.':'.$udom);  
                 }  
             }  
         } else {  
             push(@invalidusers,$uname.':'.$udom);  
         }  
     }  
     my @changes = (@enrolled,@rejections);  
     if (@rejections) {  
         foreach my $user (@rejections) {  
             &Apache::selfenroll::send_notification($user,$rejectedmsg,$cid,  
                                                    $coursedesc,$now,'enroller',$sender);  
         }  
     }  
     if (@changes) {  
         my $delresult = &Apache::lonnet::del($namespace,\@changes,$cdom,$cnum);  
         if ($delresult eq 'ok') {  
             my $namelink =   
                 &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}).' ('.$env{'user.name'}.':'.$env{'user.domain'}.')';  
             my $chgmsg = "'Action was taken on the following enrollment requests by [_1].',$namelink";  
             my ($approvedlist,$rejectedlist);  
             if (@enrolled) {  
                 $approvedlist = join("\n",@enrolled);  
                 $r->print('<p>'.&mt('The following were enrolled in the course:').'<ul>');  
                 foreach my $user (@enrolled) {  
                     my ($uname,$udom) = split(/:/,$user);   
                     my $userlink =   
                         &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom);  
                     $r->print('<li>'.$userlink.'</li>');  
                 }  
                 $r->print('</ul></p>');  
             }  
             if (@rejections) {  
                 $rejectedlist = join("\n",@rejections);  
                 $r->print('<p>'.&mt('The following enrollment requests were rejected:').'<ul>');  
                 foreach my $user (@rejections) {  
                     $r->print('<li>'.$user.'</li>');  
                 }  
                 $r->print('</ul></p>');  
             }  
             &Apache::selfenroll::send_notification($notifylist,$chgmsg,$cid,  
                                                    $coursedesc,$now,'managers',  
                                                    $sender,$approvedlist,$rejectedlist);  
         }  
     }  
     if (@existing) {  
         $r->print('<p>'.&mt('The following enrollment requests were deleted because the user is already enrolled in the course:').'<ul>');  
         foreach my $user (@existing) {  
             $r->print('<li>'.$user.'</li>');  
         }  
         $r->print('</ul></p>');  
     }  
     if (@missingreq) {  
         $r->print('<p>'.&mt('The following enrollment requests were ignored because the request is no longer in the enrollment queue:').'<ul>');  
         foreach my $user (@missingreq) {  
             $r->print('<li>'.$user.'</li>');  
         }  
         $r->print('</ul></p>');  
     }  
     if (@invalidusers) {  
         $r->print('<p>'.&mt('The following enrollment requests were deleted because the requestor does not have a LON-CAPA account:').'<ul>');  
         foreach my $user (@invalidusers) {  
             $r->print('<li>'.$user.'</li>');  
         }  
         $r->print('</ul></p>');  
     }  
     if (@limitexceeded) {  
         $r->print('<p>'.&mt('The following enrollment requests were skipped because the enrollment limit has been reached for the course:').'<ul>');  
         foreach my $user (@limitexceeded) {  
             $r->print('<li>'.$user.'</li>');  
         }  
         $r->print('</ul></p>');  
     }  
     if (@enrollerrors) {  
         $r->print('<p>'.&mt('The following enrollment requests could not be processed because an error occurred:').'<ul>');  
         foreach my $user (@enrollerrors) {  
             $r->print('<li>'.$user.'</li>');  
         }  
         $r->print('</ul></p>');  
     }  
     return;  
 }  
   
 sub get_student_counts {  
     my ($cdom,$cnum) = @_;  
     my (%idx,%stucounts);  
     my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum);  
     $idx{'type'} = &Apache::loncoursedata::CL_TYPE();  
     $idx{'status'} = &Apache::loncoursedata::CL_STATUS();  
     while (my ($student,$data) = each(%$classlist)) {  
         if (($data->[$idx{'status'}] eq 'Active') ||  
             ($data->[$idx{'status'}] eq 'Future')) {  
             if ($data->[$idx{'type'}] eq 'selfenroll') {  
                 $stucounts{'selfenroll'} ++;  
             }  
             $stucounts{'allstudents'} ++;  
         }  
     }  
     return (\%stucounts,\%idx,$classlist);  
 }  
   
 sub visible_in_cat {  sub visible_in_cat {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
     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 4550  sub print_userchangelogs_display { Line 5158  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 4588  sub print_userchangelogs_display { Line 5197  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 $tablehdr = &Apache::loncommon::start_data_table().  
                    &Apache::loncommon::start_data_table_header_row().  
                    '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Who made the change').  
                    '</th><th>'.&mt('Changed User').'</th><th>'.&mt('Role').'</th><th>'.&mt('Section').'</th><th>'.  
                    &mt('Context').'</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.  
                    &Apache::loncommon::end_data_table_header_row();  
     my ($minshown,$maxshown);      my ($minshown,$maxshown);
     $minshown = 1;      $minshown = 1;
     my $count = 0;      my $count = 0;
Line 4605  sub print_userchangelogs_display { Line 5207  sub print_userchangelogs_display {
             $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};              $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
         }          }
     }      }
   
       # Collect user change log data
       my $content = '';
     foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) {      foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) {
         next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) ||          next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) ||
                  ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'}));                   ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'}));
Line 4626  sub print_userchangelogs_display { Line 5231  sub print_userchangelogs_display {
         }          }
         $count ++;          $count ++;
         next if ($count < $minshown);          next if ($count < $minshown);
         if (!$showntablehdr) {  
             $r->print($tablehdr);  
             $showntablehdr = 1;  
         }  
         if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {          if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {
             $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =              $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =
                 &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});                  &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});
Line 4664  sub print_userchangelogs_display { Line 5266  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");          $content .=
               &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();
       }
   
       # Form Footer
       my $form_footer =
           '<input type="hidden" name="page" value="'.$curr{'page'}.'" />'
          .'<input type="hidden" name="action" value="changelogs" />'
          .'</form>';
   
       # Only display table, if content is available (has been collected above)
       if (!$content) {
           $r->print('<p class="LC_info">'
                    .&mt('There are no records to display.')
                    .'</p>'
           );
           $r->print($form_footer);
           return;
     }      }
     if ($showntablehdr) {  
         $r->print(&Apache::loncommon::end_data_table().'<br />');      # Content to display, so create navigation and display table
         if (($curr{'page'} > 1) || ($more_records)) {  
             $r->print('<table><tr>');      # Create Navigation:
             if ($curr{'page'} > 1) {      # Navigation Script
                 $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');      my $nav_script = <<"ENDSCRIPT";
             }  
             if ($more_records) {  
                 $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');  
             }  
             $r->print('</tr></table>');  
             $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 4693  function chgPage(caller) { Line 5317  function chgPage(caller) {
     document.$formname.submit();       document.$formname.submit(); 
     return;      return;
 }  }
   // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
         }      # Navigation Buttons
     } else {      my $nav_links;
         $r->print(&mt('There are no records to display'));      $nav_links = '<p>';
     }      if (($curr{'page'} > 1) || ($more_records)) {
     $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.          if ($curr{'page'} > 1) {
               '<input type="hidden" name="action" value="changelogs" /></form>');              $nav_links .= '<input type="button"'
                            .' onclick="javascript:chgPage('."'previous'".');"'
                            .' value="'.&mt('Previous [_1] changes',$curr{'show'})
                            .'" /> ';
           }
           if ($more_records) {
               $nav_links .= '<input type="button"'
                            .' onclick="javascript:chgPage('."'next'".');"'
                            .' value="'.&mt('Next [_1] changes',$curr{'show'})
                            .'" />';
           }
       }
       $nav_links .= '</p>';
   
       # Table Header
       my $tableheader =
           &Apache::loncommon::start_data_table_header_row()
          .'<th>&nbsp;</th>'
          .'<th>'.&mt('When').'</th>'
          .'<th>'.&mt('Who made the change').'</th>'
          .'<th>'.&mt('Changed User').'</th>'
          .'<th>'.&mt('Role').'</th>'
          .'<th>'.&mt('Section').'</th>'
          .'<th>'.&mt('Context').'</th>'
          .'<th>'.&mt('Start').'</th>'
          .'<th>'.&mt('End').'</th>'
          .&Apache::loncommon::end_data_table_header_row();
   
       # Print Content
       $r->print(
           $nav_script
          .$nav_links
          .&Apache::loncommon::start_data_table()
          .$tableheader
          .$content
          .&Apache::loncommon::end_data_table()
          .$nav_links
          .$form_footer
       );
     return;      return;
 }  }
   
 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 4721  sub role_display_filter { Line 5385  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 />'.
                '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.                 '<table><tr><td>'.&mt('After:').
                $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>'.                 '</td><td>'.$startform.'</td></tr>'.
                  '<tr><td>'.&mt('Before:').'</td>'.
                  '<td>'.$endform.'</td></tr></table>'.
                  '</td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                '<td valign="top"><b>'.&mt('Role:').'</b><br />'.                 '<td valign="top"><b>'.&mt('Role:').'</b><br />'.
                '<select name="role"><option value="any"';                 '<select name="role"><option value="any"';
     if ($curr->{'role'} eq 'any') {      if ($curr->{'role'} eq 'any') {
         $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 4745  sub role_display_filter { Line 5413  sub role_display_filter {
         }          }
         $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';          $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';
     }      }
     $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 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 />';
     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 4775  sub rolechg_contexts { Line 5455  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 4860  sub user_search_result { Line 5546  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 5151  sub build_search_response { Line 5846  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 5172  sub build_search_response { Line 5877  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 5270  sub course_level_table { Line 5978  sub course_level_table {
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
  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 5280  sub course_level_table { Line 5988  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)) {
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $plrole,\%sections_count,\%lt);                                                  $plrole,\%sections_count,\%lt);    
Line 5295  sub course_level_table { Line 6003  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 5326  sub course_level_row { Line 6035  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 5374  sub course_level_dc { Line 6083  sub course_level_dc {
                       '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.                        '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                       '<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/Community','crstype').'</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 5386  sub course_level_dc { Line 6095  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 5413  sub course_level_dc { Line 6122  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 5571  sub update_selfenroll_config { Line 6281  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 5581  sub update_selfenroll_config { Line 6291  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 5683  sub update_selfenroll_config { Line 6393  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 5771  sub update_selfenroll_config { Line 6481  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');

Removed from v.1.279  
changed lines
  Added in v.1.324


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