Diff for /loncom/interface/loncreateuser.pm between versions 1.295.2.7 and 1.335

version 1.295.2.7, 2009/08/14 16:43:32 version 1.335, 2010/03/19 20:21:18
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 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 217  END_SCRIPT Line 219  END_SCRIPT
 sub build_tools_display {  sub build_tools_display {
     my ($ccuname,$ccdomain,$context) = @_;      my ($ccuname,$ccdomain,$context) = @_;
     my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,      my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,
         $colspan);          $colspan,$isadv,%domconfig);
     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 228  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');
         @options =('norequest','approve','autolimit','validate');          @usertools = ('official','unofficial','community');
           @options =('norequest','approval','autolimit','validate');
         %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);          %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);
         %reqtitles = &courserequest_titles();          %reqtitles = &courserequest_titles();
         %reqdisplay = &courserequest_display();          %reqdisplay = &courserequest_display();
         $colspan = ' colspan="2"';          $colspan = ' colspan="2"';
           %domconfig =
               &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain);
           $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain);
     } 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');
Line 285  sub build_tools_display { Line 292  sub build_tools_display {
                    &Apache::loncommon::start_data_table_row()."\n";                     &Apache::loncommon::start_data_table_row()."\n";
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
             my ($curroption,$currlimit);              my ($curroption,$currlimit);
             $curroption = $userenv{$context.'.'.$item};              if ($userenv{$context.'.'.$item} ne '') {
                   $curroption = $userenv{$context.'.'.$item};
               } else {
                   my (@inststatuses);
                   $curroption =
                       &Apache::loncoursequeueadmin::get_processtype($ccuname,$ccdomain,$isadv,$ccdomain,
                                                                  $item,\@inststatuses,\%domconfig);
               }
             if (!$curroption) {              if (!$curroption) {
                 $curroption = 'norequest';                  $curroption = 'norequest';
             }              }
             if ($curroption =~ /^autolimit=(\d*)$/) {              if ($curroption =~ /^autolimit=(\d*)$/) {
                 $currlimit = $1;                  $currlimit = $1;
                 $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit);                  if ($currlimit eq '') {
                       $currdisp = &mt('Yes, automatic creation');
                   } else {
                       $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit);
                   }
             } else {              } else {
                 $currdisp = $reqdisplay{$curroption};                  $currdisp = $reqdisplay{$curroption};
             }              }
Line 325  sub build_tools_display { Line 343  sub build_tools_display {
                 if ($option eq 'autolimit') {                  if ($option eq 'autolimit') {
                     $custdisp .= '<input type="text" name="crsreq_'.                      $custdisp .= '<input type="text" name="crsreq_'.
                                  $item.'_limit" size="1" '.                                   $item.'_limit" size="1" '.
                                  'value="'.$currlimit.'" />';                                   'value="'.$currlimit.'" /></span><br />'.
                                    $reqtitles{'unlimited'};
                    } else {
                        $custdisp .= '</span>';
                  }                   }
                  $custdisp .= '</span></td></tr>';                   $custdisp .= '</td></tr>';
             }              }
             $custdisp .= '</table>';              $custdisp .= '</table>';
             $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp;              $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp;
Line 369  sub coursereq_externaluser { Line 390  sub coursereq_externaluser {
                       'reqcrsotherdom.official','reqcrsotherdom.unofficial',                        'reqcrsotherdom.official','reqcrsotherdom.unofficial',
                       'reqcrsotherdom.community');                        'reqcrsotherdom.community');
     @usertools = ('official','unofficial','community');      @usertools = ('official','unofficial','community');
     @options = ('approve','validate','autolimit');      @options = ('approval','validate','autolimit');
     %validations = &Apache::lonnet::auto_courserequest_checks($cdom);      %validations = &Apache::lonnet::auto_courserequest_checks($cdom);
     my $optregex = join('|',@options);      my $optregex = join('|',@options);
     my %reqtitles = &courserequest_titles();      my %reqtitles = &courserequest_titles();
Line 377  sub coursereq_externaluser { Line 398  sub coursereq_externaluser {
         my ($curroption,$currlimit,$tooloff);          my ($curroption,$currlimit,$tooloff);
         if ($userenv{'reqcrsotherdom.'.$item} ne '') {          if ($userenv{'reqcrsotherdom.'.$item} ne '') {
             my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});              my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});
             if (grep(/^\Q$cdom\E:($optregex)=?(\d*)$/,@curr)) {              foreach my $req (@curr) {
                 $curroption = $1;                  if ($req =~ /^\Q$cdom\E\:($optregex)=?(\d*)$/) {
                 $currlimit = $2;                      $curroption = $1;
                 if (!$curroption) {                      $currlimit = $2;
                     $curroption = 'norequest';                      last;
                 }                  }
             }              }
               if (!$curroption) {
                   $curroption = 'norequest';
                   $tooloff = ' checked="checked"';
               }
         } else {          } else {
             $curroption = 'norequest';              $curroption = 'norequest';
             $tooloff = ' checked="checked"';              $tooloff = ' checked="checked"';
         }          }
         $output.= &Apache::loncommon::start_data_table_row()."\n".          $output.= &Apache::loncommon::start_data_table_row()."\n".
                   '  <td><span class="LC_nobreak">'.$lt{$item}.': '.                    '  <td><span class="LC_nobreak">'.$lt{$item}.': </span></td><td>'.
                     '<table><tr><td valign="top">'."\n".
                   '<label><input type="radio" name="reqcrsotherdom_'.$item.                    '<label><input type="radio" name="reqcrsotherdom_'.$item.
                   '" value="0"'.$tooloff.' />'.$reqtitles{'norequest'}.                    '" value=""'.$tooloff.' />'.$reqtitles{'norequest'}.
                   '</label>&nbsp;';                    '</label></td>';
         foreach my $option (@options) {          foreach my $option (@options) {
             if ($option eq 'validate') {              if ($option eq 'validate') {
                 my $canvalidate = 0;                  my $canvalidate = 0;
Line 407  sub coursereq_externaluser { Line 433  sub coursereq_externaluser {
             if ($option eq $curroption) {              if ($option eq $curroption) {
                 $checked = ' checked="checked"';                  $checked = ' checked="checked"';
             }              }
             $output .= '<span class="LC_nobreak"><label>'.              $output .= '<td valign="top"><span class="LC_nobreak"><label>'.
                        '<input type="radio" name="reqcrsotherdom_'.$item.                         '<input type="radio" name="reqcrsotherdom_'.$item.
                        '" value="'.$option.'"'.$checked.' />'.                         '" value="'.$option.'"'.$checked.' />'.
                        $reqtitles{$option}.'</label>&nbsp;';                         $reqtitles{$option}.'</label>';
             if ($option eq 'autolimit') {              if ($option eq 'autolimit') {
                 $output .= '<input type="text" name="reqcrsotherdom_'.                  $output .= '&nbsp;<input type="text" name="reqcrsotherdom_'.
                            $item.'_limit" size="1" '.                             $item.'_limit" size="1" '.
                            'value="'.$currlimit.'" />';                             'value="'.$currlimit.'" /></span>'.
                              '<br />'.$reqtitles{'unlimited'};
               } else {
                   $output .= '</span>';
             }              }
             $output .= '&nbsp;'              $output .= '</td>';
         }          }
         $output .= '</span></td>'."\n".          $output .= '</td></tr></table></td>'."\n".
                    &Apache::loncommon::end_data_table_row()."\n";                     &Apache::loncommon::end_data_table_row()."\n";
     }      }
     return $output;      return $output;
Line 430  sub courserequest_titles { Line 459  sub courserequest_titles {
                                    unofficial => 'Unofficial',                                     unofficial => 'Unofficial',
                                    community  => 'Communities',                                     community  => 'Communities',
                                    norequest  => 'Not allowed',                                     norequest  => 'Not allowed',
                                    approve    => 'Approval by Dom. Coord.',                                     approval   => 'Approval by Dom. Coord.',
                                    validate   => 'With validation',                                     validate   => 'With validation',
                                    autolimit  => 'Numerical limit',                                     autolimit  => 'Numerical limit',
                                      unlimited  => '(blank for unlimited)',
                  );                   );
     return %titles;         return %titles;
 }                       }
       
 sub courserequest_display {  sub courserequest_display {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                                    approve    => 'Yes, need approval',                                     approval   => 'Yes, need approval',
                                    validate   => 'Yes, with validation',                                     validate   => 'Yes, with validation',
                                    norequest  => 'No',                                     norequest  => 'No',
    );        );
    return %titles;     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 468  sub print_username_entry_form { Line 498  sub print_username_entry_form {
         '// ]]>'."\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 493  sub print_username_entry_form { Line 528  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'  => "Next",                      '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>'.
 $choice $lt{'nr'}: <input type="text" size="15" name="newrolename" /><br />                        &Apache::loncommon::start_data_table().
 <input name="customeditor" type="submit" value="$lt{'cre'}" />                        &Apache::loncommon::start_data_table_row().
 </form>                        '<td>');
 ENDCUSTOM              if (keys(%existingroles) > 0) {
                   $r->print('<br /><label><input type="radio" name="customroleaction" value="new" checked="checked" onclick="setCustomFields();" /><b>'.$newroletext.'</b></label>');
               } else {
                   $r->print('<br /><input type="hidden" name="customroleaction" value="new" /><b>'.$newroletext.'</b>');
               }
               $r->print('</td><td align="center">'.$lt{'nr'}.'<br /><input type="text" size="15" name="newrolename" onfocus="setCustomAction('."'new'".');" /></td>'.
                         &Apache::loncommon::end_data_table_row());
               if (keys(%existingroles) > 0) {
                   $r->print(&Apache::loncommon::start_data_table_row().'<td><br />'.
                             '<label><input type="radio" name="customroleaction" value="edit" onclick="setCustomFields();"/><b>'.
                             &mt('View/Modify existing role:').'</b></label></td>'.
                             '<td align="center"><br />'.
                             '<select name="rolename" onchange="setCustomAction('."'edit'".');">'.
                             '<option value="" selected="selected">'.
                             &mt('Select'));
                   foreach my $role (sort(keys(%existingroles))) {
                       $r->print('<option value="'.$role.'">'.$role.'</option>');
                   }
                   $r->print('</select>'.
                             '</td>'.
                             &Apache::loncommon::end_data_table_row());
               }
               $r->print(&Apache::loncommon::end_data_table().'<p>'.
                         '<input name="customeditor" type="submit" value="'.
                         $lt{'cre'}.'" /></p>'.
                         '</form>');
         }          }
     } else {      } else {
         my $actiontext = $lt{'srad'};          my $actiontext = $lt{'srad'};
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $actiontext = $lt{'srst'};              if ($crstype eq 'Community') {
                   $actiontext = $lt{'srme'};
               } else {
                   $actiontext = $lt{'srst'};
               }
         }          }
         $r->print("          $r->print("<h3>$actiontext</h3>");
 <h3>$actiontext</h3>");  
         if ($env{'form.origform'} ne 'crtusername') {          if ($env{'form.origform'} ne 'crtusername') {
             $r->print("\n".$response);              $r->print("\n".$response);
         }          }
         $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));          $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response,$crstype));
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub customrole_javascript {
       my $js = <<"END";
   <script type="text/javascript">
   // <![CDATA[
   
   function setCustomFields() {
       if (document.docustom.customroleaction.length > 0) {
           for (var i=0; i<document.docustom.customroleaction.length; i++) {
               if (document.docustom.customroleaction[i].checked) {
                   if (document.docustom.customroleaction[i].value == 'new') {
                       document.docustom.rolename.selectedIndex = 0;
                   } else {
                       document.docustom.newrolename.value = '';
                   }
               }
           }
       }
       return;
   }
   
   function setCustomAction(caller) {
       if (document.docustom.customroleaction.length > 0) {
           for (var i=0; i<document.docustom.customroleaction.length; i++) {
               if (document.docustom.customroleaction[i].value == caller) {
                   document.docustom.customroleaction[i].checked = true;
               }
           }
       }
       setCustomFields();
       return;
   }
   
   // ]]>
   </script>
   END
       return $js;
   }
   
 sub entry_form {  sub entry_form {
     my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;      my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my ($usertype,$inexact);      my ($usertype,$inexact);
     if (ref($srch) eq 'HASH') {      if (ref($srch) eq 'HASH') {
Line 574  ENDBLOCK Line 673  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 585  ENDBLOCK Line 685  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 657  END Line 761  END
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_selection_page {  sub print_user_selection_page {
     my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements) = @_;      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 685  ENDSCRIPT Line 789  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",
Line 698  ENDSCRIPT Line 804  ENDSCRIPT
     } else {      } else {
         $r->print(&Apache::loncommon::start_page('User Management',$jscript));          $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'},
Line 708  ENDSCRIPT Line 814  ENDSCRIPT
               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">'.
Line 792  sub print_user_query_page { Line 910  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 827  sub print_user_modification_page { Line 945  sub print_user_modification_page {
             );              );
             my $response;              my $response;
             if ($env{'form.origform'} eq 'crtusername') {              if ($env{'form.origform'} eq 'crtusername') {
                 $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 found for the username [_1] in LON-CAPA domain: [_2]','<b>'.$ccuname.'</b>',$ccdomain).
                             '</span><br />';                              '</span><br />';
             }              }
             $response .= '<p class="LC_warning">'              $response .= '<p class="LC_warning">'
Line 837  sub print_user_modification_page { Line 955  sub print_user_modification_page {
                             ,'<a href="'.$helplink.'">','</a>')                              ,'<a href="'.$helplink.'">','</a>')
                         .'</p><br />';                          .'</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 861  sub print_user_modification_page { Line 979  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 888  sub print_user_modification_page { Line 1006  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 920  sub print_user_modification_page { Line 1038  sub print_user_modification_page {
 <input type="hidden" name="pres_type"   value="" />  <input type="hidden" name="pres_type"   value="" />
 <input type="hidden" name="pres_marker" value="" />  <input type="hidden" name="pres_marker" value="" />
 ENDFORMINFO  ENDFORMINFO
     my %inccourses;      my (%inccourses,$roledom);
     foreach my $key (keys(%env)) {      if ($context eq 'course') {
  if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {          $inccourses{$env{'request.course.id'}}=1;
     $inccourses{$1.'_'.$2}=1;          $roledom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       } elsif ($context eq 'author') {
           $roledom = $env{'request.role.domain'};
       } elsif ($context eq 'domain') {
           foreach my $key (keys(%env)) {
               $roledom = $env{'request.role.domain'};
               if ($key=~/^user\.priv\.cm\.\/($roledom)\/($match_username)/) {
                   $inccourses{$1.'_'.$2}=1;
               }
           }
       } else {
           foreach my $key (keys(%env)) {
       if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {
           $inccourses{$1.'_'.$2}=1;
               }
         }          }
     }      }
     if ($newuser) {      if ($newuser) {
Line 937  ENDFORMINFO Line 1069  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 955  $loginscript Line 1088  $loginscript
 <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 974  $lt{'hs'}: $home_server_pick Line 1111  $lt{'hs'}: $home_server_pick
             $r->print($home_server_pick);              $r->print($home_server_pick);
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses in this Domain?').'</h3>'.              $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table().                        &Apache::loncommon::start_data_table().
                       &build_tools_display($ccuname,$ccdomain,                        &build_tools_display($ccuname,$ccdomain,
                                            'requestcourses').                                             'requestcourses').
Line 1048  ENDAUTH Line 1185  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 1057  $forminfo Line 1195  $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 1071  ENDCHANGEUSER Line 1213  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 in this Domain?').'</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());
             if ($env{'request.role.domain'} eq $ccdomain) {              if ($env{'request.role.domain'} eq $ccdomain) {
                 $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));                  $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
Line 1150  ENDNOTOOLSPRIV Line 1292  ENDNOTOOLSPRIV
         }          }
         $r->print('</div><div class="LC_clear_float_footer"></div>');          $r->print('</div><div class="LC_clear_float_footer"></div>');
         if ($env{'form.action'} ne 'singlestudent') {          if ($env{'form.action'} ne 'singlestudent') {
             &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);              &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,
                                       $roledom,$crstype);
         }          }
     } ## End of new user/old user logic      } ## End of new user/old user logic
   
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onclick="setSections(this.form)" />'."\n");          my $btntxt;
           if ($crstype eq 'Community') {
               $btntxt = &mt('Enroll Member');
           } else {
               $btntxt = &mt('Enroll Student');
           }
           $r->print('<br /><input type="button" value="'.$btntxt.'" onclick="setSections(this.form)" />'."\n");
     } else {      } else {
         $r->print('<h3>'.&mt('Add Roles').'</h3>');          $r->print('<h3>'.&mt('Add Roles').'</h3>');
         my $addrolesdisplay = 0;          my $addrolesdisplay = 0;
Line 1194  ENDNOTOOLSPRIV Line 1342  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 1260  sub validation_javascript { Line 1413  sub validation_javascript {
 }  }
   
 sub display_existing_roles {  sub display_existing_roles {
     my ($r,$ccuname,$ccdomain,$inccourses) = @_;      my ($r,$ccuname,$ccdomain,$inccourses,$context,$roledom,$crstype) = @_;
     my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);      my $now=time;
     # Build up table of user roles to allow revocation and re-enabling of roles.      my %lt=&Apache::lonlocal::texthash(
     my ($tmp) = keys(%rolesdump);  
     if ($tmp !~ /^(con_lost|error)/i) {  
         my $now=time;  
         my %lt=&Apache::lonlocal::texthash(  
                     'rer'  => "Existing Roles",                      'rer'  => "Existing Roles",
                     'rev'  => "Revoke",                      'rev'  => "Revoke",
                     'del'  => "Delete",                      'del'  => "Delete",
Line 1276  sub display_existing_roles { Line 1425  sub display_existing_roles {
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End",                      'end'  => "End",
                                        );                                         );
         my (%roletext,%sortrole,%roleclass,%rolepriv);      my (%rolesdump,%roletext,%sortrole,%roleclass,%rolepriv);
         foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);      if ($context eq 'course' || $context eq 'author') {
                                     my $b1=join('_',(split('_',$b))[1,0]);          my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype);
                                     return $a1 cmp $b1;          my %roleshash = 
                                 } keys(%rolesdump)) {              &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles',
             next if ($area =~ /^rolesdef/);                                ['active','previous','future'],\@roles,$roledom,1);
             my $envkey=$area;          foreach my $key (keys(%roleshash)) {
             my $role = $rolesdump{$area};              my ($start,$end) = split(':',$roleshash{$key});
             my $thisrole=$area;              next if ($start eq '-1' || $end eq '-1');
             $area =~ s/\_\w\w$//;              my ($rnum,$rdom,$role,$sec) = split(':',$key);
             my ($role_code,$role_end_time,$role_start_time) =              if ($context eq 'course') {
                 split(/_/,$role);                  next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'})
                                && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'}));
               } elsif ($context eq 'author') {
                   next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'}));
               }
               my ($newkey,$newvalue,$newrole);
               $newkey = '/'.$rdom.'/'.$rnum;
               if ($sec ne '') {
                   $newkey .= '/'.$sec;
               }
               $newvalue = $role;
               if ($role =~ /^cr/) {
                   $newrole = 'cr';
               } else {
                   $newrole = $role;
               }
               $newkey .= '_'.$newrole;
               if ($start ne '' && $end ne '') {
                   $newvalue .= '_'.$end.'_'.$start;
               } elsif ($end ne '') {
                   $newvalue .= '_'.$end;
               }
               $rolesdump{$newkey} = $newvalue;
           }
       } else {
           %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
       }
       # Build up table of user roles to allow revocation and re-enabling of roles.
       my ($tmp) = keys(%rolesdump);
       return if ($tmp =~ /^(con_lost|error)/i);
       foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
                                   my $b1=join('_',(split('_',$b))[1,0]);
                                   return $a1 cmp $b1;
                               } keys(%rolesdump)) {
           next if ($area =~ /^rolesdef/);
           my $envkey=$area;
           my $role = $rolesdump{$area};
           my $thisrole=$area;
           $area =~ s/\_\w\w$//;
           my ($role_code,$role_end_time,$role_start_time) =
               split(/_/,$role);
 # Is this a custom role? Get role owner and title.  # Is this a custom role? Get role owner and title.
             my ($croleudom,$croleuname,$croletitle)=          my ($croleudom,$croleuname,$croletitle)=
                 ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});              ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
             my $allowed=0;          my $allowed=0;
             my $delallowed=0;          my $delallowed=0;
             my $sortkey=$role_code;          my $sortkey=$role_code;
             my $class='Unknown';          my $class='Unknown';
             if ($area =~ m{^/($match_domain)/($match_courseid)} ) {          if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
                 $class='Course';              $class='Course';
                 my ($coursedom,$coursedir) = ($1,$2);              my ($coursedom,$coursedir) = ($1,$2);
                 $sortkey.="\0$coursedom";              my $cid = $1.'_'.$2;
                 # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).              # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                 my %coursedata=              my %coursedata=
                     &Apache::lonnet::coursedescription($1.'_'.$2);                  &Apache::lonnet::coursedescription($cid);
                 my $carea;              if ($coursedir =~ /^$match_community$/) {
                 if (defined($coursedata{'description'})) {                  $class='Community';
                     $carea=$coursedata{'description'}.              }
                         '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).              $sortkey.="\0$coursedom";
      &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);              my $carea;
                     $sortkey.="\0".$coursedata{'description'};              if (defined($coursedata{'description'})) {
                     $class=$coursedata{'type'};                  $carea=$coursedata{'description'}.
                       '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
       &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
                   $sortkey.="\0".$coursedata{'description'};
               } else {
                   if ($class eq 'Community') {
                       $carea=&mt('Unavailable community').': '.$area;
                       $sortkey.="\0".&mt('Unavailable community').': '.$area;
                 } else {                  } else {
                     $carea=&mt('Unavailable course').': '.$area;                      $carea=&mt('Unavailable course').': '.$area;
                     $sortkey.="\0".&mt('Unavailable course').': '.$area;                      $sortkey.="\0".&mt('Unavailable course').': '.$area;
                 }                  }
                 $sortkey.="\0$coursedir";              }
                 $inccourses->{$1.'_'.$2}=1;              $sortkey.="\0$coursedir";
                 if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||              $inccourses->{$cid}=1;
                     (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {              if ((&Apache::lonnet::allowed('c'.$role_code,$coursedom.'/'.$coursedir)) ||
                     $allowed=1;                  (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                 }                  $allowed=1;
                 if ((&Apache::lonnet::allowed('dro',$1)) ||              }
                     (&Apache::lonnet::allowed('dro',$ccdomain))) {              unless ($allowed) {
                     $delallowed=1;                  my $isowner = &is_courseowner($cid,$coursedata{'internal.courseowner'});
                   if ($isowner) {
                       if (($role_code eq 'co') && ($class eq 'Community')) {
                           $allowed = 1;
                       } elsif (($role_code eq 'cc') && ($class eq 'Course')) {
                           $allowed = 1;
                       }
                 }                  }
               } 
               if ((&Apache::lonnet::allowed('dro',$coursedom)) ||
                   (&Apache::lonnet::allowed('dro',$ccdomain))) {
                   $delallowed=1;
               }
 # - custom role. Needs more info, too  # - custom role. Needs more info, too
                 if ($croletitle) {              if ($croletitle) {
                     if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {                  if (&Apache::lonnet::allowed('ccr',$coursedom.'/'.$coursedir)) {
                         $allowed=1;                      $allowed=1;
                         $thisrole.='.'.$role_code;                      $thisrole.='.'.$role_code;
                     }  
                 }                  }
                 # Compute the background color based on $area              }
                 if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {              if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
                     $carea.='<br />Section: '.$3;                  $carea.='<br />Section: '.$3;
                     $sortkey.="\0$3";                  $sortkey.="\0$3";
                     if (!$allowed) {                  if (!$allowed) {
                         if ($env{'request.course.sec'} eq $3) {                      if ($env{'request.course.sec'} eq $3) {
                             if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {                          if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
                                 $allowed = 1;                              $allowed = 1;
                             }  
                         }                          }
                     }                      }
                 }                  }
                 $area=$carea;              }
             } else {              $area=$carea;
                 $sortkey.="\0".$area;          } else {
                 # Determine if current user is able to revoke privileges              $sortkey.="\0".$area;
                 if ($area=~m{^/($match_domain)/}) {              # Determine if current user is able to revoke privileges
                     if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||              if ($area=~m{^/($match_domain)/}) {
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                  if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                         $allowed=1;                     (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                     }                     $allowed=1;
                     if (((&Apache::lonnet::allowed('dro',$1))  ||  
                          (&Apache::lonnet::allowed('dro',$ccdomain))) &&  
                         ($role_code ne 'dc')) {  
                         $delallowed=1;  
                     }  
                 } else {  
                     if (&Apache::lonnet::allowed('c'.$role_code,'/')) {  
                         $allowed=1;  
                     }  
                 }                  }
                 if ($role_code eq 'ca' || $role_code eq 'au') {                  if (((&Apache::lonnet::allowed('dro',$1))  ||
                     $class='Construction Space';                      (&Apache::lonnet::allowed('dro',$ccdomain))) &&
                 } elsif ($role_code eq 'su') {                      ($role_code ne 'dc')) {
                     $class='System';                      $delallowed=1;
                 } else {  
                     $class='Domain';  
                 }                  }
             }              } else {
             if (($role_code eq 'ca') || ($role_code eq 'aa')) {                  if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
                 $area=~m{/($match_domain)/($match_username)};  
                 if (&Apache::lonuserutils::authorpriv($2,$1)) {  
                     $allowed=1;                      $allowed=1;
                 } else {  
                     $allowed=0;  
                 }                  }
             }              }
             my $row = '';              if ($role_code eq 'ca' || $role_code eq 'au') {
             $row.= '<td>';                  $class='Construction Space';
             my $active=1;              } elsif ($role_code eq 'su') {
             $active=0 if (($role_end_time) && ($now>$role_end_time));                  $class='System';
             if (($active) && ($allowed)) {  
                 $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';  
             } else {              } else {
                 if ($active) {                  $class='Domain';
                    $row.='&nbsp;';  
                 } else {  
                    $row.=&mt('expired or revoked');  
                 }  
             }              }
             $row.='</td><td>';          }
             if ($allowed && !$active) {          if (($role_code eq 'ca') || ($role_code eq 'aa')) {
                 $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';              $area=~m{/($match_domain)/($match_username)};
               if (&Apache::lonuserutils::authorpriv($2,$1)) {
                   $allowed=1;
             } else {              } else {
                 $row.='&nbsp;';                  $allowed=0;
             }              }
             $row.='</td><td>';          }
             if ($delallowed) {          my $row = '';
                 $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';          $row.= '<td>';
           my $active=1;
           $active=0 if (($role_end_time) && ($now>$role_end_time));
           if (($active) && ($allowed)) {
               $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
           } else {
               if ($active) {
                  $row.='&nbsp;';
             } else {              } else {
                 $row.='&nbsp;';                 $row.=&mt('expired or revoked');
             }              }
             my $plaintext='';          }
             if (!$croletitle) {          $row.='</td><td>';
                 $plaintext=&Apache::lonnet::plaintext($role_code,$class)          if ($allowed && !$active) {
             } else {              $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
                 $plaintext=          } else {
               $row.='&nbsp;';
           }
           $row.='</td><td>';
           if ($delallowed) {
               $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
           } else {
               $row.='&nbsp;';
           }
           my $plaintext='';
           if (!$croletitle) {
               $plaintext=&Apache::lonnet::plaintext($role_code,$class)
           } else {
               $plaintext=
         "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";          "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
             }          }
             $row.= '</td><td>'.$plaintext.          $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;
             $roletext{$envkey}=$row;          $roletext{$envkey}=$row;
             $roleclass{$envkey}=$class;          $roleclass{$envkey}=$class;
             $rolepriv{$envkey}=$allowed;          $rolepriv{$envkey}=$allowed;
             #$r->print($row);      } # 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}}) ) {
                     $output{$type}.=                   $output{$type}.=
                           &Apache::loncommon::start_data_table_row().                        &Apache::loncommon::start_data_table_row().
                           $roletext{$sortrole{$which}}.                        $roletext{$sortrole{$which}}.
                           &Apache::loncommon::end_data_table_row();                        &Apache::loncommon::end_data_table_row();
                 }              }
             }          }
             unless($output{$type} eq '') {          unless($output{$type} eq '') {
                 $output{$type} = '<tr class="LC_info_row">'.              $output{$type} = '<tr class="LC_info_row">'.
                           "<td align='center' colspan='7'>".&mt($type)."</td></tr>".                        "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
                            $output{$type};                        $output{$type};
                 $rolesdisplay = 1;              $rolesdisplay = 1;
             }          }
         }      }
         if ($rolesdisplay == 1) {      if ($rolesdisplay == 1) {
             my $contextrole='';          my $contextrole='';
             if ($env{'request.course.id'}) {          if ($env{'request.course.id'}) {
                 $contextrole = 'Existing Roles in this Course';              if (&Apache::loncommon::course_type() eq 'Community') {
             } elsif ($env{'request.role'} =~ /^au\./) {                  $contextrole = &mt('Existing Roles in this Community');
                 $contextrole = 'Existing Co-Author Roles in your Construction Space';  
             } else {              } else {
                 $contextrole = 'Existing Roles in this Domain';                  $contextrole = &mt('Existing Roles in this Course');
             }              }
             $r->print('          } elsif ($env{'request.role'} =~ /^au\./) {
               $contextrole = &mt('Existing Co-Author Roles in your Construction Space');
           } else {
               $contextrole = &mt('Existing Roles in this Domain');
           }
           $r->print('
 <h3>'.$lt{'rer'}.'</h3>'.  <h3>'.$lt{'rer'}.'</h3>'.
 '<div>'.&mt($contextrole).'</div>'.  '<div>'.$contextrole.'</div>'.
 &Apache::loncommon::start_data_table("LC_createuser").  &Apache::loncommon::start_data_table("LC_createuser").
 &Apache::loncommon::start_data_table_header_row().  &Apache::loncommon::start_data_table_header_row().
 '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.  '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.
 '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.  '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
 '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.  '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
 &Apache::loncommon::end_data_table_header_row());  &Apache::loncommon::end_data_table_header_row());
            foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {          foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {
                 if ($output{$type}) {              if ($output{$type}) {
                     $r->print($output{$type}."\n");                  $r->print($output{$type}."\n");
                 }  
             }              }
             $r->print(&Apache::loncommon::end_data_table());  
         }          }
     }  # End of check for keys in rolesdump          $r->print(&Apache::loncommon::end_data_table());
       }
     return;      return;
 }  }
   
Line 1556  sub new_domain_roles { Line 1765  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 1854  sub personal_data_display { Line 2065  sub personal_data_display {
                 if ($canmodify_status{'inststatus'}) {                  if ($canmodify_status{'inststatus'}) {
                     $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types);                      $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types);
                 } else {                  } else {
                     $shown .= $userenv{'inststatus'};  
                     if ($userenv{'inststatus'} eq '') {                      if ($userenv{'inststatus'} eq '') {
                         $hiderow = 1;                          $hiderow = 1;
                       } else {
                           my @showitems;
                           foreach my $item ( map { &unescape($_); } split(':',$userenv{'inststatus'})) {
                               if (exists($usertypes->{$item})) {
                                   push(@showitems,$usertypes->{$item});
                               } else {
                                   push(@showitems,$item);
                               }
                           }
                           if (@showitems) {
                               $shown = join(', ',@showitems);
                           } else {
                               $hiderow = 1;
                           }
                     }                      }
                 }                  }
                 if (!$hiderow) {                  if (!$hiderow) {
Line 1952  sub get_inststatuses { Line 2176  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 1976  sub update_user_data { Line 2200  sub update_user_data {
                   $jsback."\n".                    $jsback."\n".
                   '// ]]>'."\n".                    '// ]]>'."\n".
                   '</script>'."\n";                    '</script>'."\n";
     my %breadcrumb_text = &singleuser_breadcrumb();      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 2074  sub update_user_data { Line 2298  sub update_user_data {
     $r->print('<h3>'.&mt('User [_1] in domain [_2]',      $r->print('<h3>'.&mt('User [_1] in domain [_2]',
  $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 @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
     my @usertools = ('aboutme','blog','portfolio');      my @usertools = ('aboutme','blog','portfolio');
     my @requestcourses = ('official','unofficial');      my @requestcourses = ('official','unofficial','community');
     my ($othertitle,$usertypes,$types) =       my ($othertitle,$usertypes,$types) = 
         &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});          &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
       my %canmodify_status =
           &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},
                                                      ['inststatus']);
     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 2137  sub update_user_data { Line 2365  sub update_user_data {
  $r->print(&mt('Generating user').': '.$result);   $r->print(&mt('Generating user').': '.$result);
         $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},          $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},
                                                $env{'form.ccdomain'});                                                 $env{'form.ccdomain'});
         my (%changeHash,%newcustom,%changed);          my (%changeHash,%newcustom,%changed,%changedinfo);
         if ($uhome ne 'no_host') {          if ($uhome ne 'no_host') {
             if ($env{'form.customquota'} == 1) {              if ($context eq 'domain') {
                 if ($env{'form.portfolioquota'} eq '') {                  if ($env{'form.customquota'} == 1) {
                     $newcustom{'quota'} = 0;                      if ($env{'form.portfolioquota'} eq '') {
                 } else {                          $newcustom{'quota'} = 0;
                     $newcustom{'quota'} = $env{'form.portfolioquota'};                      } else {
                     $newcustom{'quota'} =~ s/[^\d\.]//g;                          $newcustom{'quota'} = $env{'form.portfolioquota'};
                           $newcustom{'quota'} =~ s/[^\d\.]//g;
                       }
                       $changed{'quota'} = &quota_admin($newcustom{'quota'},\%changeHash);
                 }                  }
                 $changed{'quota'} = &quota_admin($newcustom{'quota'},\%changeHash);                  foreach my $item (@usertools) {
             }                      if ($env{'form.custom'.$item} == 1) {
             foreach my $item (@usertools) {                          $newcustom{$item} = $env{'form.tools_'.$item};
                 if ($env{'form.custom'.$item} == 1) {                          $changed{$item} = &tool_admin($item,$newcustom{$item},
                     $newcustom{$item} = $env{'form.tools_'.$item};                                                       \%changeHash,'tools');
                     $changed{$item} = &tool_admin($item,$newcustom{$item},                      }
                                                  \%changeHash,'tools');  
                 }                  }
             }                  foreach my $item (@requestcourses) {
             foreach my $item (@requestcourses) {                      $newcustom{$item} = $env{'form.crsreq_'.$item};
                 $newcustom{$item} = $env{'form.crsreq_'.$item};                      if ($env{'form.crsreq_'.$item} eq 'autolimit') {
                 if ($env{'form.crsreq_'.$item} eq 'autolimit') {                          $newcustom{$item} .= '=';
                     $newcustom{$item} .= '=';                          unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {
                     unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {                              $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};
                         $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};                          }
                     }                      }
                       $changed{$item} = &tool_admin($item,$newcustom{$item},
                                                     \%changeHash,'requestcourses');
                 }                  }
                 $changed{$item} = &tool_admin($item,$newcustom{$item},  
                                               \%changeHash,'requestcourses');  
             }              }
             if (exists($env{'form.inststatus'})) {              if ($canmodify_status{'inststatus'}) {
                 my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');                  if (exists($env{'form.inststatus'})) {
                 if (@inststatuses > 0) {                      my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
                     $changeHash{'inststatus'} = join(',',@inststatuses);                      if (@inststatuses > 0) {
                     $changed{'inststatus'} = $changeHash{'inststatus'};                          $changeHash{'inststatus'} = join(',',@inststatuses);
                           $changed{'inststatus'} = $changeHash{'inststatus'};
                       }
                 }                  }
             }              }
             if (keys(%changed)) {              if (keys(%changed)) {
                 $changeHash{'firstname'}  = $env{'form.cfirstname'};                  foreach my $item (@userinfo) {
                 $changeHash{'middlename'} = $env{'form.cmiddlename'};                      $changeHash{$item}  = $env{'form.c'.$item};
                 $changeHash{'lastname'}   = $env{'form.clastname'};                  }
                 $changeHash{'generation'} = $env{'form.cgeneration'};  
                 $changeHash{'id'}         = $env{'form.cid'};  
                 $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};  
                 my $chgresult =                  my $chgresult =
                      &Apache::lonnet::put('environment',\%changeHash,                       &Apache::lonnet::put('environment',\%changeHash,
                                           $env{'form.ccdomain'},$env{'form.ccuname'});                                            $env{'form.ccdomain'},$env{'form.ccuname'});
Line 2208  sub update_user_data { Line 2437  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 2294  sub update_user_data { Line 2524  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 %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);          my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);
         foreach my $item (@userinfo) {          foreach my $item (@userinfo) {
             # Strip leading and trailing whitespace              # Strip leading and trailing whitespace
Line 2344  sub update_user_data { Line 2573  sub update_user_data {
             }              }
         }          }
         my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus,          my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus,
             $inststatus,$newinststatus,$oldisdefault,$newisdefault,$olddefquotatext,              $newinststatus,$oldisdefault,$newisdefault,%oldsettings,
             $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext,              %oldsettingstext,%newsettings,%newsettingstext,@disporder);
             $oldinststatuses,$newinststatuses);          @disporder = ('inststatus');
         my ($defquota,$settingstatus) =           if ($env{'request.role.domain'} eq $env{'form.ccdomain'}) {
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);              push(@disporder,'requestcourses');
         my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom);          } else {
               push(@disporder,'reqcrsotherdom');
           }
           push(@disporder,('quota','tools'));
           my ($defquota,my $settingstatus) = 
               &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus);
           my %canshow;
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $showquota = 1;              $canshow{'quota'} = 1;
         }          }
         if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
             $showtools = 1;              $canshow{'tools'} = 1;
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
             $showrequestcourses = 1;              $canshow{'requestcourses'} = 1;
         } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $showreqotherdom = 1;              $canshow{'reqcrsotherdom'} = 1;
         }          }
         if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
             $showinststatus = 1;              $canshow{'inststatus'} = 1;
         }          }
         my (%changeHash,%changed);          my (%changeHash,%changed);
         $oldinststatus = $userenv{'inststatus'};          $oldinststatus = $userenv{'inststatus'};
         if ($oldinststatus eq '') {          if ($oldinststatus eq '') {
             $oldinststatuses = $othertitle;               $oldsettings{'inststatus'} = $othertitle; 
         } else {          } else {
             if (ref($usertypes) eq 'HASH') {              if (ref($usertypes) eq 'HASH') {
                 $oldinststatuses = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'})));                  $oldsettings{'inststatus'} = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'})));
             } else {              } else {
                 $oldinststatuses = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'})));                  $oldsettings{'inststatus'} = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'})));
             }              }
         }          }
         $changeHash{'inststatus'} = $userenv{'inststatus'};          $changeHash{'inststatus'} = $userenv{'inststatus'};
         my %canmodify_inststatus = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},['inststatus'],\@userroles);          if ($canmodify_status{'inststatus'}) {
         if ($canmodify_inststatus{'inststatus'}) {              $canshow{'inststatus'} = 1;
             if (exists($env{'form.inststatus'})) {              if (exists($env{'form.inststatus'})) {
                 my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');                  my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
                 if (@inststatuses > 0) {                  if (@inststatuses > 0) {
Line 2387  sub update_user_data { Line 2622  sub update_user_data {
                         $changed{'inststatus'} = $newinststatus;                          $changed{'inststatus'} = $newinststatus;
                     }                      }
                     if (ref($usertypes) eq 'HASH') {                      if (ref($usertypes) eq 'HASH') {
                         $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses));                           $newsettings{'inststatus'} = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); 
                     } else {                      } else {
                         $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses));                          $newsettings{'inststatus'} = join(', ',map{ $usertypes->{$_}; } (@inststatuses));
                     }  
                 } else {  
                     $newinststatus = '';  
                     $changeHash{'inststatus'} = $newinststatus;  
                     $newinststatuses = $othertitle;  
                     if ($newinststatus ne $oldinststatus) {  
                         $changed{'inststatus'} = $changeHash{'inststatus'};  
                     }                      }
                 }                  }
               } else {
                   $newinststatus = '';
                   $changeHash{'inststatus'} = $newinststatus;
                   $newsettings{'inststatus'} = $othertitle;
                   if ($newinststatus ne $oldinststatus) {
                       $changed{'inststatus'} = $changeHash{'inststatus'};
                   }
             }              }
           } elsif ($context ne 'selfcreate') {
               $canshow{'inststatus'} = 1;
         }          }
         $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};          $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
         if ($userenv{'portfolioquota'} ne '') {          if ($context eq 'domain') {
             $oldportfolioquota = $userenv{'portfolioquota'};              if ($userenv{'portfolioquota'} ne '') {
             if ($env{'form.customquota'} == 1) {                  $oldportfolioquota = $userenv{'portfolioquota'};
                 if ($env{'form.portfolioquota'} eq '') {                  if ($env{'form.customquota'} == 1) {
                     $newportfolioquota = 0;                      if ($env{'form.portfolioquota'} eq '') {
                           $newportfolioquota = 0;
                       } else {
                           $newportfolioquota = $env{'form.portfolioquota'};
                           $newportfolioquota =~ s/[^\d\.]//g;
                       }
                       if ($newportfolioquota != $oldportfolioquota) {
                           $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
                       }
                 } else {                  } else {
                     $newportfolioquota = $env{'form.portfolioquota'};                      $changed{'quota'} = &quota_admin('',\%changeHash);
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newportfolioquota = $defquota;
                 }                      $newisdefault = 1;
                 if ($newportfolioquota != $oldportfolioquota) {  
                     $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);  
                 }                  }
             } else {              } else {
                 $changed{'quota'} = &quota_admin('',\%changeHash);                  $oldisdefault = 1;
                 $newportfolioquota = $defquota;                  $oldportfolioquota = $defquota;
                 $newisdefault = 1;                  if ($env{'form.customquota'} == 1) {
             }                      if ($env{'form.portfolioquota'} eq '') {
         } else {                          $newportfolioquota = 0;
             $oldisdefault = 1;                      } else {
             $oldportfolioquota = $defquota;                          $newportfolioquota = $env{'form.portfolioquota'};
             if ($env{'form.customquota'} == 1) {                          $newportfolioquota =~ s/[^\d\.]//g;
                 if ($env{'form.portfolioquota'} eq '') {                      }
                     $newportfolioquota = 0;                      $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
                 } else {                  } else {
                     $newportfolioquota = $env{'form.portfolioquota'};                      $newportfolioquota = $defquota;
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newisdefault = 1;
                 }                  }
                 $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);              }
               if ($oldisdefault) {
                   $oldsettingstext{'quota'} = &get_defaultquota_text($settingstatus);
               }
               if ($newisdefault) {
                   $newsettingstext{'quota'} = &get_defaultquota_text($settingstatus);
               }
               &tool_changes('tools',\@usertools,\%oldsettings,\%oldsettingstext,\%userenv,
                             \%changeHash,\%changed,\%newsettings,\%newsettingstext);
               if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
                   &tool_changes('requestcourses',\@requestcourses,\%oldsettings,\%oldsettingstext,
                                 \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
             } else {              } else {
                 $newportfolioquota = $defquota;                  &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,
                 $newisdefault = 1;                                \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
             }              }
         }          }
         if ($oldisdefault) {          foreach my $item (@userinfo) {
             $olddefquotatext = &get_defaultquota_text($settingstatus);              if ($env{'form.c'.$item} ne $userenv{$item}) {
         }                  $namechanged{$item} = 1;
         if ($newisdefault) {              }
             $newdefquotatext = &get_defaultquota_text($settingstatus);  
         }  
         &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv,  
                       \%changeHash,\%changed,\%newaccess,\%newaccesstext);  
   
         if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {  
             &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext,  
                           \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);  
         } else {  
             &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,  
                           \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);  
         }  
         if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||  
             $env{'form.cmiddlename'} ne $userenv{'middlename'} ||  
             $env{'form.clastname'}   ne $userenv{'lastname'}   ||  
             $env{'form.cgeneration'} ne $userenv{'generation'} ||  
             $env{'form.cid'} ne $userenv{'id'}                 ||  
             $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {  
             $namechanged = 1;  
         }          }
         if (($namechanged) || (keys(%changed) > 0)) {          $oldsettings{'quota'} = $oldportfolioquota.' Mb';
           $newsettings{'quota'} = $newportfolioquota.' Mb';
           if ((keys(%namechanged) > 0) || (keys(%changed) > 0)) {
             $changeHash{'firstname'}  = $env{'form.cfirstname'};              $changeHash{'firstname'}  = $env{'form.cfirstname'};
             $changeHash{'middlename'} = $env{'form.cmiddlename'};              $changeHash{'middlename'} = $env{'form.cmiddlename'};
             $changeHash{'lastname'}   = $env{'form.clastname'};              $changeHash{'lastname'}   = $env{'form.clastname'};
Line 2476  sub update_user_data { Line 2713  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 '') {
                                     $newenvhash{'environment.canrequest.'.$key} =                                      $newenvhash{'environment.canrequest.'.$key} = 1;
                                         $changeHash{'requestcourses.'.$key};  
                                 } else {                                  } else {
                                     $newenvhash{'environment.canrequest.'.$key} =                                      $newenvhash{'environment.canrequest.'.$key} =
           &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},            &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
Line 2505  sub update_user_data { Line 2742  sub update_user_data {
                     }                      }
                 }                  }
             }              }
             if ($namechanged) {              if (keys(%namechanged) > 0) {
             # Make the change              # Make the change
                 $namechgresult =                  $namechgresult =
                     &Apache::lonnet::modifyuser($env{'form.ccdomain'},                      &Apache::lonnet::modifyuser($env{'form.ccdomain'},
Line 2521  sub update_user_data { Line 2758  sub update_user_data {
                                id         => $env{'form.cid'},                                 id         => $env{'form.cid'},
                              );                               );
             }              }
             if (($namechanged && $namechgresult eq 'ok') ||               if (((keys(%namechanged) > 0) && $namechgresult eq 'ok') || 
                 ((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(                  &display_userinfo($r,1,\@disporder,\%canshow,\@requestcourses,
                              'uic'        => 'User Information Changed',                                    \@usertools,\%userenv,\%changed,\%namechanged,
                              'frst'       => 'First Name',                                    \%oldsettings, \%oldsettingstext,\%newsettings,
                              'mddl'       => 'Middle Name',                                    \%newsettingstext);
                              'lst'        => 'Last Name',  
                              'gen'        => 'Generation',  
                              'id'         => 'Student/Employee ID',  
                              'mail'       => 'Permanent e-mail address',  
                              'disk'       => 'Disk space allocated to portfolio files',  
                              'blog'       => 'Blog Availability',  
                              'aboutme'    => 'Personal Information Page Availability',  
                              'portfolio'  => 'Portfolio Availability',  
                              'official'   => 'Can Request Official Courses',  
                              'unofficial' => 'Can Request Unofficial Courses',  
                              'inststatus' => "Affiliation",  
                              'prvs'       => 'Previous Value:',  
                              'chto'       => 'Changed To:'  
    );  
                 $r->print('<h4>'.$lt{'uic'}.'</h4>'.  
                           &Apache::loncommon::start_data_table().  
                           &Apache::loncommon::start_data_table_header_row());  
                 $r->print(<<"END");  
     <th>&nbsp;</th>  
     <th>$lt{'frst'}</th>  
     <th>$lt{'mddl'}</th>  
     <th>$lt{'lst'}</th>  
     <th>$lt{'gen'}</th>  
     <th>$lt{'id'}</th>  
     <th>$lt{'mail'}</th>  
 END  
                 if ($showinststatus) {  
                     $r->print("  
     <th>$lt{'inststatus'}</th>\n");  
                 }  
                 if ($showrequestcourses) {  
                     foreach my $item (@requestcourses) {  
                         $r->print("  
     <th>$lt{$item}</th>\n");  
                     }  
                 } elsif ($showreqotherdom) {  
                     foreach my $item (@requestcourses) {  
                         $r->print("  
     <th>$lt{$item}</th>\n");  
                     }  
                 }  
                 if ($showquota) {  
                     $r->print("  
     <th>$lt{'disk'}</th>\n");  
                 }  
                 if ($showtools) {  
                     foreach my $item (@usertools) {  
                         $r->print("  
     <th>$lt{$item}</th>\n");  
                     }  
                 }  
                 $r->print(&Apache::loncommon::end_data_table_header_row().  
                           &Apache::loncommon::start_data_table_row());  
                 $r->print(<<"END");  
     <td><b>$lt{'prvs'}</b></td>  
     <td>$userenv{'firstname'}  </td>  
     <td>$userenv{'middlename'} </td>  
     <td>$userenv{'lastname'}   </td>  
     <td>$userenv{'generation'} </td>  
     <td>$userenv{'id'}</td>  
     <td>$userenv{'permanentemail'} </td>  
 END  
                 if ($showinststatus) {  
                     $r->print("  
     <td>$oldinststatuses</td>\n");  
                 }    
                 if ($showrequestcourses) {  
                     foreach my $item (@requestcourses) {  
                         $r->print("  
     <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");  
                     }  
                 } elsif ($showreqotherdom) {  
                     foreach my $item (@requestcourses) {  
                         $r->print("  
     <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");  
                     }  
                 }  
                 if ($showquota) {  
                     $r->print("  
     <td>$oldportfolioquota Mb $olddefquotatext </td>\n");  
                 }  
                 if ($showtools) {  
                     foreach my $item (@usertools) {  
                         $r->print("  
     <td>$oldaccess{$item} $oldaccesstext{$item} </td>\n");  
                     }  
                 }  
                 $r->print(&Apache::loncommon::end_data_table_row().  
                           &Apache::loncommon::start_data_table_row());  
                 $r->print(<<"END");  
     <td><span class="LC_nobreak"><b>$lt{'chto'}</b></span></td>  
     <td>$env{'form.cfirstname'}  </td>  
     <td>$env{'form.cmiddlename'} </td>  
     <td>$env{'form.clastname'}   </td>  
     <td>$env{'form.cgeneration'} </td>  
     <td>$env{'form.cid'} </td>  
     <td>$env{'form.cpermanentemail'} </td>  
 END  
                 if ($showinststatus) {  
                     $r->print("  
     <td>$newinststatuses</td>\n");  
                 }  
                 if ($showrequestcourses) {  
                     foreach my $item (@requestcourses) {  
                         $r->print("  
     <td>$newaccess{$item} $newaccesstext{$item} </td>\n");  
                     }  
                 } elsif ($showreqotherdom) {  
                     foreach my $item (@requestcourses) {  
                         $r->print("  
     <td>$newaccess{$item} $newaccesstext{$item} </td>\n");  
                     }  
                 }  
                 if ($showquota) {  
                     $r->print("  
     <td>$newportfolioquota Mb $newdefquotatext </td>\n");  
                 }  
                 if ($showtools) {  
                     foreach my $item (@usertools) {  
                         $r->print("  
     <td>$newaccess{$item} $newaccesstext{$item} </td>\n");  
                     }  
                 }  
                 $r->print(&Apache::loncommon::end_data_table_row().  
                           &Apache::loncommon::end_data_table().'<br />');  
                 if ($env{'form.cid'} ne $userenv{'id'}) {                  if ($env{'form.cid'} ne $userenv{'id'}) {
                     &Apache::lonnet::idput($env{'form.ccdomain'},                      &Apache::lonnet::idput($env{'form.ccdomain'},
                          ($env{'form.ccuname'} => $env{'form.cid'}));                           ($env{'form.ccuname'} => $env{'form.cid'}));
Line 2678  END Line 2790  END
                       $env{'form.ccuname'}.' '.&mt('in domain').' '.                        $env{'form.ccuname'}.' '.&mt('in domain').' '.
                       $env{'form.ccdomain'}.'</span><br />');                        $env{'form.ccdomain'}.'</span><br />');
             }              }
         }  else { # End of if ($env ... ) logic          } else { # End of if ($env ... ) logic
             # They did not want to change the users name, quota, tool availability,              # They did not want to change the users name, quota, tool availability,
             # or ability to request creation of courses,               # or ability to request creation of courses, 
             # 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(              &display_userinfo($r,undef,\@disporder,\%canshow,\@requestcourses,
                            'id'         => "Student/Employee ID",                                \@usertools,\%userenv,\%changed,\%namechanged,\%oldsettings,
                            'mail'       => "Permanent e-mail address",                                \%oldsettingstext,\%newsettings,\%newsettingstext);
                            'disk'       => "Disk space allocated to user's portfolio files",  
                            'blog'       => "Blog Availability",  
                            'aboutme'    => "Personal Information Page Availability",  
                            'portfolio'  => "Portfolio Availability",  
                            'official'   => "Can Request Official Courses",  
                            'unofficial' => "Can Request Unofficial Course",  
                            'inststatus' => "Affiliation",  
        );  
             $r->print(<<"END");  
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}  
 END  
             if ($userenv{'permanentemail'} ne '') {  
                 $r->print('<br />['.$lt{'mail'}.': '.  
                           $userenv{'permanentemail'}.']');  
             }  
             if ($showinststatus) {  
                 $r->print('<br />['.$lt{'inststatus'}.': '.$oldinststatuses.']');  
             }  
             if ($showrequestcourses) {  
                 foreach my $item (@requestcourses) {  
                     $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.  
                               $newaccesstext{$item}.']'."\n");  
                 }  
             } elsif ($showreqotherdom) {  
                 foreach my $item (@requestcourses) {  
                     $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.  
                               $newaccesstext{$item}.']'."\n");  
                 }  
             }  
             if ($showtools) {  
                 foreach my $item (@usertools) {  
                     $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.  
                               $newaccesstext{$item}.']'."\n");  
                 }  
             }  
             if ($showquota) {  
                 $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.  
                           $olddefquotatext.']');  
             }  
             $r->print('</h4>');  
         }          }
         if (@mod_disallowed) {          if (@mod_disallowed) {
             my ($rolestr,$contextname);              my ($rolestr,$contextname);
Line 2761  END Line 2833  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 (keys(%namechanged) > 0) {
             if ($context eq 'course') {              if ($context eq 'course') {
                 if (@userroles > 0) {                  if (@userroles > 0) {
                     if ((@rolechanges == 0) ||                       if ((@rolechanges == 0) || 
Line 2795  END Line 2872  END
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub display_userinfo {
       my ($r,$changed,$order,$canshow,$requestcourses,$usertools,$userenv,
           $changedhash,$namechangedhash,$oldsetting,$oldsettingtext,
           $newsetting,$newsettingtext) = @_;
       return unless (ref($order) eq 'ARRAY' &&
                      ref($canshow) eq 'HASH' && 
                      ref($requestcourses) eq 'ARRAY' && 
                      ref($usertools) eq 'ARRAY' && 
                      ref($userenv) eq 'HASH' &&
                      ref($changedhash) eq 'HASH' &&
                      ref($oldsetting) eq 'HASH' &&
                      ref($oldsettingtext) eq 'HASH' &&
                      ref($newsetting) eq 'HASH' &&
                      ref($newsettingtext) eq 'HASH');
       my %lt=&Apache::lonlocal::texthash(
            'ui'             => 'User Information (unchanged)',
            'uic'            => 'User Information Changed',
            'firstname'      => 'First Name',
            'middlename'     => 'Middle Name',
            'lastname'       => 'Last Name',
            'generation'     => 'Generation',
            'id'             => 'Student/Employee ID',
            'permanentemail' => 'Permanent e-mail address',
            'quota'          => 'Disk space allocated to portfolio files',
            'blog'           => 'Blog Availability',
            'aboutme'        => 'Personal Information Page Availability',
            'portfolio'      => 'Portfolio Availability',
            'official'       => 'Can Request Official Courses',
            'unofficial'     => 'Can Request Unofficial Courses',
            'community'      => 'Can Request Communities',
            'inststatus'     => "Affiliation",
            'prvs'           => 'Previous Value:',
            'chto'           => 'Changed To:'
       );
       my $title = $lt{'ui'}; 
       if ($changed) {
           $title = $lt{'uic'};
       }
       $r->print('<h4>'.$title.'</h4>'.
                 &Apache::loncommon::start_data_table().
                 &Apache::loncommon::start_data_table_header_row());
       if ($changed) {
           $r->print("<th>&nbsp;</th>\n");
       }
       my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
       foreach my $item (@userinfo) {
           $r->print("<th>$lt{$item}</th>\n");
       }
       foreach my $entry (@{$order}) {
           if ($canshow->{$entry}) {
               if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {
                   foreach my $item (@{$requestcourses}) {
                       $r->print("<th>$lt{$item}</th>\n");
                   }
               } elsif ($entry eq 'tools') {
                   foreach my $item (@{$usertools}) {
                       $r->print("<th>$lt{$item}</th>\n");
                   }
               } else {
                   $r->print("<th>$lt{$entry}</th>\n");
               }
           }
       }
       $r->print(&Apache::loncommon::end_data_table_header_row().
                &Apache::loncommon::start_data_table_row());
       if ($changed) {
           $r->print('<td><b>'.$lt{'prvs'}.'</b></td>'."\n");
       }
       foreach my $item (@userinfo) {
           $r->print('<td>'.$userenv->{$item}.' </td>'."\n");
       }
       foreach my $entry (@{$order}) {
           if ($canshow->{$entry}) {
               if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {
                   foreach my $item (@{$requestcourses}) {
                       $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");
                   }
               } elsif ($entry eq 'tools') {
                   foreach my $item (@{$usertools}) {
                       $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");
                   }
               } else {
                   $r->print("<td>$oldsetting->{$entry} $oldsettingtext->{$entry} </td>\n");
               }
           }
       }
       $r->print(&Apache::loncommon::end_data_table_row());
       if ($changed) {
           $r->print(&Apache::loncommon::start_data_table_row().
                     '<td><span class="LC_nobreak"><b>'.$lt{'chto'}.'</b></span></td>'."\n");
           foreach my $item (@userinfo) {
               my $value = $env{'form.c'.$item};
               if ($namechangedhash->{$item}) {
                   $value = '<span class="LC_cusr_emph">'.$value.'</span>';
               }
               $r->print("<td>$value </td>\n");
           }
           foreach my $entry (@{$order}) {
               if ($canshow->{$entry}) {
                   if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {
                       foreach my $item (@{$requestcourses}) {
                           my $value = $newsetting->{$item}.' '.$newsettingtext->{$item};
                           if ($changedhash->{$item}) {
                               $value = '<span class="LC_cusr_emph">'.$value.'</span>';
                           }
                           $r->print("<td>$value </td>\n");
                       }
                   } elsif ($entry eq 'tools') {
                       foreach my $item (@{$usertools}) {
                           my $value = $newsetting->{$item}.' '.$newsettingtext->{$item};
                           if ($changedhash->{$item}) {
                               $value = '<span class="LC_cusr_emph">'.$value.'</span>';
                           }
                           $r->print("<td>$value </td>\n");
                       }
                   } else {
                       my $value = $newsetting->{$entry}.' '.$newsettingtext->{$entry};
                       if ($changedhash->{$entry}) {
                           $value = '<span class="LC_cusr_emph">'.$value.'</span>';
                       }
                       $r->print("<td>$value </td>\n");
                   }
               }
           }
           $r->print(&Apache::loncommon::end_data_table_row());
       }
       $r->print(&Apache::loncommon::end_data_table().'<br />');
       return;
   }
   
 sub tool_changes {  sub tool_changes {
     my ($context,$usertools,$oldaccess,$oldaccesstext,$userenv,$changeHash,      my ($context,$usertools,$oldaccess,$oldaccesstext,$userenv,$changeHash,
         $changed,$newaccess,$newaccesstext) = @_;          $changed,$newaccess,$newaccesstext) = @_;
Line 2805  sub tool_changes { Line 3012  sub tool_changes {
         return;          return;
     }      }
     if ($context eq 'reqcrsotherdom') {      if ($context eq 'reqcrsotherdom') {
         my @options = ('approve','validate','autolimit');          my @options = ('approval','validate','autolimit');
         my $optregex = join('|',@options);          my $optregex = join('|',@options);
         my %reqdisplay = &courserequest_display();          my %reqdisplay = &courserequest_display();
         my $cdom = $env{'request.role.domain'};          my $cdom = $env{'request.role.domain'};
         foreach my $tool (@{$usertools}) {          foreach my $tool (@{$usertools}) {
             $oldaccesstext->{$tool} = &mt('no');              $oldaccesstext->{$tool} = &mt('No');
               $newaccesstext->{$tool} = $oldaccesstext->{$tool};
             $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$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 ($userenv->{$context.'.'.$tool} eq '') {
                 if ($env{'form.'.$context.'_'.$tool}) {                  if ($newop) {
                     $changed->{$tool}=&tool_admin($tool,$cdom,                      $changed->{$tool}=&tool_admin($tool,$cdom.':'.$newop,
                                                   $changeHash,$context);                                                    $changeHash,$context);
                     if ($changed->{$tool}) {                      if ($changed->{$tool}) {
                         $newaccesstext->{$tool} = &mt('yes');                          $newaccesstext->{$tool} = &mt('Yes');
                     } else {                      } else {
                         $newaccesstext->{$tool} = $oldaccesstext->{$tool};                    }                          $newaccesstext->{$tool} = $oldaccesstext->{$tool};
                       }
                 }                  }
             } else {              } else {
                 my @curr = split(',',$userenv->{$context.'.'.$tool});                  my @curr = split(',',$userenv->{$context.'.'.$tool});
                 my @new;                  my @new;
                 my $changedoms;                  my $changedoms;
                 my $newop = $env{'form.'.$context.'_'.$tool};                  foreach my $req (@curr) {
                 if ($newop eq 'autolimit') {                      if ($req =~ /^\Q$cdom\E\:($optregex\=?\d*)$/) {
                     $newop .= '=';                          $oldaccesstext->{$tool} = &mt('Yes');
                     unless ($env{'form.'.$context.'_'.$tool.'_limit'} =~ /\D/) {                          my $oldop = $1;
                         $newop .= $env{'form.'.$context.'_'.$tool.'_limit'};                          if ($oldop ne $newop) {
                     }                              $changedoms = 1;
                 }                              foreach my $item (@curr) {
                 if (grep(/^\Q$cdom:($optregex\=?\d*)\E$/,@curr)) {                                  my ($reqdom,$option) = split(':',$item);
                     $oldaccesstext->{$tool} = &mt('yes');                                  unless ($reqdom eq $cdom) {
                     my $oldop = $1;                                      push(@new,$item);
                     if ($oldop ne $newop) {                                  }
                         $changedoms = 1;  
                         foreach my $dom (@curr) {  
                             unless ($dom eq $cdom) {  
                                 push(@new,$dom);  
                             }                              }
                               if ($newop) {
                                   push(@new,$cdom.':'.$newop);
                               }
                               @new = sort(@new);
                         }                          }
                         if ($newop) {                          last;
                             push(@new,$cdom.':'.$newop);  
                         }  
                         @new = sort(@new);  
                     }                      }
                 } elsif ($env{'form.'.$context.'_'.$tool}) {                  }
                   if ((!$changedoms) && ($newop)) {
                     $changedoms = 1;                      $changedoms = 1;
                     @new = sort(@curr,$cdom.':'.$newop);                      @new = sort(@curr,$cdom.':'.$newop);
                 }                  }
                 $newaccesstext->{$tool} = $oldaccesstext->{$tool};  
                 if ($changedoms) {                  if ($changedoms) {
                     my $newdomstr;                      my $newdomstr;
                     if (@new) {                      if (@new) {
Line 2862  sub tool_changes { Line 3077  sub tool_changes {
                     if ($changed->{$tool}) {                      if ($changed->{$tool}) {
                         if ($env{'form.'.$context.'_'.$tool}) {                          if ($env{'form.'.$context.'_'.$tool}) {
                             if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') {                              if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') {
                                 if ($env{'form.'.$context.'_'.$tool.'_limit'} =~ /\D/) {                                  my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};
                                     $newaccesstext->{$tool} = &mt('Yes, processed automatically');                                  $limit =~ s/\D+//g;
                                   if ($limit) {
                                       $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user.',$limit);
                                 } else {                                  } else {
                                     $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user).',$env{'form.'.$context.'_'.$tool.'_limit'});                                      $newaccesstext->{$tool} = &mt('Yes, processed automatically');
                                 }                                  }
                             } else {                              } else {
                                 $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}};                                  $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}};
Line 3222  sub update_roles { Line 3439  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 3256  sub enroll_single_student { Line 3479  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 3381  sub build_roles { Line 3610  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 3401  sub custom_role_editor { Line 3639  sub custom_role_editor {
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
     my $body_top;      my $body_top;
     my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]);  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
Line 3410  sub custom_role_editor { Line 3647  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 3449  sub custom_role_editor { Line 3689  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"
                     '// <![CDATA['."\n";                     .'// <![CDATA['."\n";
     my @template_roles = ("cc","in","ta","ep","st");      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".      my $context_code;
                     '// ]]>'."\n".      if ($context eq 'domain') {
                     '</script>'."\n";          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 3477  sub custom_role_editor { Line 3756  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 3495  ENDCCF Line 3783  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"'.
Line 3504  ENDCCF Line 3792  ENDCCF
     '</td><td>'.      '</td><td>'.
     ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'.      ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'.
     ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').      ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>');
     ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'.          if ($priv eq 'bre' && $crstype eq 'Community') {
     ($systemlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').              $r->print('&nbsp;');  
     '</td>'.          } else {
              &Apache::loncommon::end_data_table_row());              $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'}.'" />'.
Line 3520  ENDCCF Line 3812  ENDCCF
 }  }
 # --------------------------------------------------------  # --------------------------------------------------------
 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 3534  sub make_script_template { Line 3826  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 3586  sub make_script_template { Line 3879  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);
 }  }
Line 3601  sub set_custom_role { Line 3894  sub set_custom_role {
         return;          return;
     }      }
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'.      my $jscript = '<script type="text/javascript">'
                   '// <![CDATA['."\n".                   .'// <![CDATA['."\n"
                   $jsback."\n".                   .$jsback."\n"
                   '// ]]>'."\n".                   .'// ]]>'."\n"
                   '</script>';                   .'</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 3687  sub handler { Line 3980  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 3708  sub handler { Line 4002  sub handler {
     #SD Following files not added to help, because the corresponding .tex-files seem to      #SD Following files not added to help, because the corresponding .tex-files seem to
     #be missing: Course_Approve_Selfenroll,Course_User_Logs,      #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 3723  sub handler { Line 4017  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 3739  sub handler { Line 4033  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 3764  sub handler { Line 4058  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 3780  sub handler { Line 4074  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 3798  sub handler { Line 4092  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 3850  sub handler { Line 4144  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 3874  sub handler { Line 4180  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 3896  sub handler { Line 4208  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 3938  sub handler { Line 4250  sub handler {
             $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");              $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");
             $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,              $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,
                                                                        $cdom,$cnum));                                                                         $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 3962  sub handler { Line 4273  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 3981  sub header { Line 4292  sub header {
   
 sub add_script {  sub add_script {
     my ($js) = @_;      my ($js) = @_;
     return '<script type="text/javascript">'."\n".      return '<script type="text/javascript">'."\n"
            '// <![CDATA['."\n".            .'// <![CDATA['."\n"
            "\n".$js."\n".            .$js."\n"
            '// ]]>'."\n"            .'// ]]>'."\n"
            '</script>'."\n";            .'</script>'."\n";
 }  }
   
 sub verify_user_display {  sub verify_user_display {
Line 4006  END Line 4317  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 => 'Upload a File of Course Users',                              upload     => 'Upload a File of Course Users',
                                    singleuser => 'Add/Modify a Single Course User',                              singleuser => 'Add/Modify a Course User',
                                    listusers => 'Display Class Lists and Manage Multiple Users',                              listusers  => 'Manage Course Users',
                                  },                              },
                   community => {
                               upload     => 'Upload a File of Community Users',
                               singleuser => 'Add/Modify a Community User',
                               listusers  => 'Manage Community Users',
                              },
                 );                  );
        my %linktitles = (
                   domain => {
                               singleuser => 'Add a user to the domain, and/or a course or community in the domain.',
                               listusers  => 'Show and manage users in this domain.',
                               },
                   author => {
                               singleuser => 'Add a user with a co- or assistant author role.',
                               listusers  => 'Show and manage co- or assistant authors.',
                               },
                   course => {
                               singleuser => 'Add a user with a certain role to this course.',
                               listusers  => 'Show and manage users in this course.',
                               },
                   community => {
                               singleuser => 'Add a user with a certain role to this community.',
                               listusers  => 'Show and manage users in this community.',
                              },
                   );
     my @menu = ( {categorytitle => 'Single Users', 
            items =>
            [
               {
                linktext => $links{$linkcontext}{'singleuser'},
                icon => 'edit-redo.png',
                #help => 'Course_Change_Privileges',
                url => '/adm/createuser?action=singleuser',
                permission => $permission->{'cusr'},
                linktitle => $linktitles{$linkcontext}{'singleuser'},
               },
            ]},
   
     my @menu =           {categorytitle => 'Multiple Users',
         (           items => 
           { text => $links{$context}{'upload'},           [
             help => 'Course_Create_Class_List',              {
             action => 'upload',               linktext => $links{$linkcontext}{'upload'},
             permission => $permission->{'cusr'},               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'}, 
             },              },
           { text => $links{$context}{'singleuser'},  
             help => 'Course_Change_Privileges',           ]},
             action => 'singleuser',  
             permission => $permission->{'cusr'},           {categorytitle => 'Administration',
            items => [ ]},
          );
               
       if ($context eq 'domain'){
           
           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.',
             },              },
           { text => $links{$context}{'listusers'},  
             help => 'Course_View_Class_List',  
             action => 'listusers',  
             permission => ($permission->{'view'} || $permission->{'cusr'}),  
           },  
         );          );
     if ($context eq 'domain' || $context eq 'course') {          
         my $customlink =  { text => 'Edit Custom Roles',      }elsif ($context eq 'course'){
                             help => 'Course_Editing_Custom_Roles',  
                             action => 'custom',  
                             permission => $permission->{'custom'},  
                           };  
         push(@menu,$customlink);  
     }  
     if ($context eq 'course') {  
         my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
         my @courselinks =  
             (          my %linktext = (
               { text => 'Enroll a Single Student',                           'Course'    => {
                  help => 'Course_Add_Student',                                            single => 'Add/Modify a Student', 
                  action => 'singlestudent',                                            drop   => 'Drop Students',
                  permission => $permission->{'cusr'},                                            groups => 'Course Groups',
                  },                                          },
               { text => 'Drop Students',                           'Community' => {
                 help => 'Course_Drop_Student',                                            single => 'Add/Modify a Member', 
                 action => 'drop',                                            drop   => 'Drop Members',
                 permission => $permission->{'cusr'},                                            groups => 'Community Groups',
               });                                          },
         if (!exists($permission->{'cusr_section'})) {                         );
             push(@courselinks,  
                { text => 'Automated Enrollment Manager',          my %linktitle = (
                  help => 'Course_Automated_Enrollment',              'Course' => {
                  permission => (&Apache::lonnet::auto_run($cnum,$cdom)                    single => 'Add a user with the role of student to this course',
                                 && $permission->{'cusr'}),                    drop   => 'Remove a student from this course.',
                  url  => '/adm/populate',                    groups => 'Manage course groups',
                  },                          },
                { text => 'Configure User Self-enrollment',              'Community' => {
                  help => 'Course_Self_Enrollment',                    single => 'Add a user with the role of member to this community',
                  action => 'selfenroll',                    drop   => 'Remove a member from this community.',
                  permission => $permission->{'cusr'},                    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 => 'grps.png',
                #help => 'Course_Manage_Group',
                url => '/adm/coursegroups?refpage=cusr',
                permission => $permission->{'grp_manage'},
                linktitle => $linktitle{$crstype}{'groups'},
               },
               {
                linktext => 'Change Log',
                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(@courselinks,              push(@{ $menu[2]->{items} },
                     {   text => 'Enrollment Requests',                      {   
                         help => 'Course_Approve_Selfenroll',                       linktext => 'Enrollment Requests',
                         action => 'selfenrollqueue',                       icon => 'selfenrl-queue.png',
                         permission => $permission->{'cusr'},                       #help => 'Course_Approve_Selfenroll',
                     });                       url => '/adm/createuser?action=selfenrollqueue',
         }                       permission => $permission->{'cusr'},
         push(@courselinks,                       linktitle =>'Approve or reject enrollment requests.',
                { text => 'Manage Course Groups',                      },
                  help => 'Course_Manage_Group',              );
                  permission => $permission->{'grp_manage'},          }
                  url => '/adm/coursegroups?refpage=cusr',          
                },          if (!exists($permission->{'cusr_section'})){
                { text => 'View Change Logs',              if ($crstype ne 'Community') {
                  help => 'Course_User_Logs',                  push(@{ $menu[2]->{items} },
                  action => 'changelogs',                      {
                        linktext => 'Automated Enrollment',
                        icon => 'roles.png',
                        #help => 'Course_Automated_Enrollment',
                        permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                            && $permission->{'cusr'}),
                        url  => '/adm/populate',
                        linktitle => 'Automated enrollment manager.',
                       }
                   );
               }
               push(@{ $menu[2]->{items} }, 
                   {
                    linktext => 'User Self-Enrollment',
                    icon => 'cstr.png',
                    #help => 'Course_Self_Enrollment',
                    url => '/adm/createuser?action=selfenroll',
                  permission => $permission->{'cusr'},                   permission => $permission->{'cusr'},
                },);                   linktitle => 'Configure user self-enrollment.',
                   },
               );
           }
       };
   return Apache::lonhtmlcommon::generate_menu(@menu);
 #               { text => 'View Log-in History',  #               { text => 'View Log-in History',
 #                 help => 'Course_User_Logins',  #                 help => 'Course_User_Logins',
 #                 action => 'logins',  #                 action => 'logins',
 #                 permission => $permission->{'cusr'},  #                 permission => $permission->{'cusr'},
 #               });  #               });
         push(@menu,@courselinks);  
     }  
     my $menu_html = '';  
     foreach my $menu_item (@menu) {  
         next if (! $menu_item->{'permission'});  
         $menu_html.='<p>';  
         if (exists($menu_item->{'help'})) {  
             $menu_html.=  
                 &Apache::loncommon::help_open_topic($menu_item->{'help'});  
         }  
         $menu_html.='<font size="+1">';  
         if (exists($menu_item->{'url'})) {  
             $menu_html.=qq{<a href="$menu_item->{'url'}">};  
         } else {  
             $menu_html.=  
                 qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};      }  
         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';  
         $menu_html.='</p>';  
     }  
     return $menu_html;  
 }  }
   
 sub restore_prev_selections {  sub restore_prev_selections {
Line 4138  sub restore_prev_selections { Line 4552  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 4350  ENDSCRIPT Line 4765  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 4501  ENDSCRIPT Line 4914  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 4589  sub visible_in_cat { Line 5006  sub visible_in_cat {
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);      my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
     my ($cathash,%settable,@vismsgs,$cansetvis);      my ($cathash,%settable,@vismsgs,$cansetvis);
     my %visactions = &Apache::lonlocal::texthash(      my %visactions = &Apache::lonlocal::texthash(
                    vis => 'Your course currently appears in the Course Catalog for this domain.',                     vis => 'Your course/community currently appears in the Course/Community Catalog for this domain.',
                    gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',                     gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',
                    miss => 'Your course does not currently appear in the Course Catalog for this domain.',                     miss => 'Your course/community does not currently appear in the Course/Community Catalog for this domain.',
                    yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',                     yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
                    coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',                     coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
                    make => 'Make any changes to self-enrollment settings below, click "Save", 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:',
Line 4807  sub print_userchangelogs_display { Line 5224  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); }
   
     $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">');  
     my %saveable_parameters = ('show' => 'scalar',);      my %saveable_parameters = ('show' => 'scalar',);
     &Apache::loncommon::store_course_settings('roles_log',      &Apache::loncommon::store_course_settings('roles_log',
                                               \%saveable_parameters);                                                \%saveable_parameters);
Line 4845  sub print_userchangelogs_display { Line 5262  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));  
     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 4862  sub print_userchangelogs_display { Line 5271  sub print_userchangelogs_display {
             $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};              $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
         }          }
     }      }
   
       # Form Header
       $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">'.
                 &role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype));
   
       # Create navigation
       my ($nav_script,$nav_links) = &userlogdisplay_nav($formname,\%curr,$more_records);
       my $showntableheader = 0;
   
       # 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();
   
       # Display user change log data
     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 4883  sub print_userchangelogs_display { Line 5316  sub print_userchangelogs_display {
         }          }
         $count ++;          $count ++;
         next if ($count < $minshown);          next if ($count < $minshown);
         if (!$showntablehdr) {          unless ($showntableheader) {
             $r->print($tablehdr);              $r->print($nav_script
             $showntablehdr = 1;                       .$nav_links
                        .&Apache::loncommon::start_data_table()
                        .$tableheader);
               $r->rflush();
               $showntableheader = 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'}} =
Line 4921  sub print_userchangelogs_display { Line 5358  sub print_userchangelogs_display {
         if ($roleslog{$id}{'logentry'}{'selfenroll'}) {          if ($roleslog{$id}{'logentry'}{'selfenroll'}) {
             $chgcontext = 'selfenroll';              $chgcontext = 'selfenroll';
         }          }
         my %lt = &rolechg_contexts();          my %lt = &rolechg_contexts($crstype);
         if ($chgcontext ne '' && $lt{$chgcontext} ne '') {          if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
             $chgcontext = $lt{$chgcontext};              $chgcontext = $lt{$chgcontext};
         }          }
         $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td><td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td><td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td><td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).'</td><td>'.$sec.'</td><td>'.$chgcontext.'</td><td>'.$rolestart.'</td><td>'.$roleend.'</td>'.&Apache::loncommon::end_data_table_row()."\n");          $r->print(
               &Apache::loncommon::start_data_table_row()
              .'<td>'.$count.'</td>'
              .'<td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td>'
              .'<td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td>'
              .'<td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td>'
              .'<td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'</td>'
              .'<td>'.$sec.'</td>'
              .'<td>'.$chgcontext.'</td>'
              .'<td>'.$rolestart.'</td>'
              .'<td>'.$roleend.'</td>'
              .&Apache::loncommon::end_data_table_row()."\n");
       }
   
       if ($showntableheader) { # Table footer, if content displayed above
           $r->print(&Apache::loncommon::end_data_table()
                    .$nav_links);
       } else { # No content displayed above
           $r->print('<p class="LC_info">'
                    .&mt('There are no records to display.')
                    .'</p>'
           );
     }      }
     if ($showntablehdr) {  
         $r->print(&Apache::loncommon::end_data_table().'<br />');      # Form Footer
         if (($curr{'page'} > 1) || ($more_records)) {      $r->print( 
             $r->print('<table><tr>');          '<input type="hidden" name="page" value="'.$curr{'page'}.'" />'
             if ($curr{'page'} > 1) {         .'<input type="hidden" name="action" value="changelogs" />'
                 $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');         .'</form>');
             }      return;
             if ($more_records) {  }
                 $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');  
             }  sub userlogdisplay_nav {
             $r->print('</tr></table>');      my ($formname,$curr,$more_records) = @_;
             $r->print(<<"ENDSCRIPT");      my ($nav_script,$nav_links);
       if (ref($curr) eq 'HASH') {
           # Create Navigation:
           # Navigation Script
           $nav_script = <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function chgPage(caller) {  function chgPage(caller) {
Line 4948  function chgPage(caller) { Line 5410  function chgPage(caller) {
     if (caller == 'next') {      if (caller == 'next') {
         document.$formname.page.value ++;          document.$formname.page.value ++;
     }      }
     document.$formname.submit();       document.$formname.submit();
     return;      return;
 }  }
 // ]]>  // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
           # Navigation Buttons
           $nav_links = '<p>';
           if (($curr->{'page'} > 1) || ($more_records)) {
               if ($curr->{'page'} > 1) {
                   $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'})
                                .'" />';
               }
         }          }
     } else {          $nav_links .= '</p>';
         $r->print('<p class="LC_info">'.  
                   &mt('There are no records to display').  
                   '</p>');  
     }      }
     $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.      return ($nav_script,$nav_links);
               '<input type="hidden" name="action" value="changelogs" /></form>');  
     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></span><br />'.                   '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
Line 4982  sub role_display_filter { Line 5455  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 5006  sub role_display_filter { Line 5483  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) {
             $selstr = ' selected="selected"';              $selstr = ' selected="selected"';
Line 5027  sub role_display_filter { Line 5506  sub role_display_filter {
               .'</p>';                .'</p>';
   
     # Server version info      # Server version info
     $output .= '<p style="font-size: smaller;" class="LC_info">'      $output .= '<p class="LC_info">'
               .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'                .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                   ,'2.6.99.0');                    ,'2.6.99.0');
     if ($version) {      if ($version) {
         $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);          $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
     }      }
     $output .= '</p><hr /><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 5045  sub rolechg_contexts { Line 5525  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 5130  sub user_search_result { Line 5616  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 5366  sub build_search_response { Line 5861  sub build_search_response {
     my ($context,$srch,%srch_results) = @_;      my ($context,$srch,%srch_results) = @_;
     my ($currstate,$response,$forcenewuser);      my ($currstate,$response,$forcenewuser);
     my %names = (      my %names = (
           'uname' => 'username',            'uname'     => 'username',
           'lastname' => 'last name',            'lastname'  => 'last name',
           'lastfirst' => 'last name, first name',            'lastfirst' => 'last name, first name',
           'crs' => 'this course',            'crs'       => 'this course',
           'dom' => 'LON-CAPA domain: ',            'dom'       => 'LON-CAPA domain',
           'instd' => 'the institutional directory for domain: ',            'instd'     => 'the institutional directory for domain',
     );      );
   
     my %single = (      my %single = (
Line 5391  sub build_search_response { Line 5886  sub build_search_response {
             $currstate = 'modify';              $currstate = 'modify';
             $response = &mt("$single{$srch->{'srchtype'}} was found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'});              $response = &mt("$single{$srch->{'srchtype'}} was found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'});
             if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {              if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {
                 $response .= &display_domain_info($srch->{'srchdomain'});                  $response .= ': '.&display_domain_info($srch->{'srchdomain'});
             }              }
         } else {          } else { # Search has nothing found. Prepare message to user.
             $response = '<span class="LC_warning">'.&mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}",$srch->{'srchterm'});              $response = '<span class="LC_warning">';
             if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {              if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {
                 $response .= &display_domain_info($srch->{'srchdomain'});                  $response .= &mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} [_1] in $names{$srch->{'srchin'}}: [_2]",
                                    '<b>'.$srch->{'srchterm'}.'</b>',
                                    &display_domain_info($srch->{'srchdomain'}));
               } else {
                   $response .= &mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} [_1] in $names{$srch->{'srchin'}}.",
                                    '<b>'.$srch->{'srchterm'}.'</b>');
             }              }
             $response .= '</span>';              $response .= '</span>';
   
             if ($srch->{'srchin'} ne 'alc') {              if ($srch->{'srchin'} ne 'alc') {
                 $forcenewuser = 1;                  $forcenewuser = 1;
                 my $cansrchinst = 0;                   my $cansrchinst = 0; 
Line 5432  sub build_search_response { Line 5933  sub build_search_response {
                     &Apache::lonuserutils::can_create_user($createdom,$context);                      &Apache::lonuserutils::can_create_user($createdom,$context);
                 my $targetdom = '<span class="LC_cusr_emph">'.$createdom.'</span>';                  my $targetdom = '<span class="LC_cusr_emph">'.$createdom.'</span>';
                 if ($cancreate) {                  if ($cancreate) {
                     my $showdom = &display_domain_info($createdom);                      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 />';
Line 5441  sub build_search_response { Line 5942  sub build_search_response {
                     } else {                      } else {
                         $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom);                          $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom);
                     }                      }
                     $response .= '<ul><li>'                      $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 5459  sub build_search_response { Line 5960  sub build_search_response {
                         $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);                          $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);
                     }                      }
                     $response .= '<br />'                      $response .= '<br />'
                                 .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'                                   .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'
                                     ,' <a'.$helplink.'>'                                      ,' <a'.$helplink.'>'
                                     ,'</a>')                                      ,'</a>')
                                 .'<br /><br />';                                   .'<br /><br />';
                 }                  }
             }              }
         }          }
Line 5548  sub course_level_table { Line 6049  sub course_level_table {
             'end'  => "End"              'end'  => "End"
     );      );
   
     foreach my $protectedcourse (sort( keys(%inccourses))) {      foreach my $protectedcourse (sort(keys(%inccourses))) {
  my $thiscourse=$protectedcourse;   my $thiscourse=$protectedcourse;
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
           my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'});
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
         my $type=$coursedata{'type'};          my $crstype=$coursedata{'type'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count;          my %sections_count;
Line 5563  sub course_level_table { Line 6065  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
         my @roles = &Apache::lonuserutils::roles_by_context('course');          my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);
  foreach my $role (@roles) {   foreach my $role (@roles) {
             my $plrole=&Apache::lonnet::plaintext($role);              my $plrole=&Apache::lonnet::plaintext($role,$crstype);
     if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {      if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) ||
                   ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) {
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $plrole,\%sections_count,\%lt);                                                  $plrole,\%sections_count,\%lt);
             } elsif ($env{'request.course.sec'} ne '') {              } elsif ($env{'request.course.sec'} ne '') {
                 if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
                                              $env{'request.course.sec'})) {                                               $env{'request.course.sec'})) {
Line 5578  sub course_level_table { Line 6081  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 5609  sub course_level_row { Line 6113  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 5657  sub course_level_dc { Line 6161  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 5669  sub course_level_dc { Line 6173  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 5696  sub course_level_dc { Line 6200  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 5966  sub update_selfenroll_config { Line 6471  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 6069  sub get_selfenroll_titles { Line 6574  sub get_selfenroll_titles {
     return (\@row,\%lt);      return (\@row,\%lt);
 }  }
   
   sub is_courseowner {
       my ($thiscourse,$courseowner) = @_;
       if ($courseowner eq '') {
           if ($env{'request.course.id'} eq $thiscourse) {
               $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
           }
       }
       if ($courseowner ne '') {
           if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) {
               return 1;
           }
       }
       return;
   }
   
 #---------------------------------------------- end functions for &phase_two  #---------------------------------------------- end functions for &phase_two
   
 #--------------------------------- functions for &phase_two and &phase_three  #--------------------------------- functions for &phase_two and &phase_three

Removed from v.1.295.2.7  
changed lines
  Added in v.1.335


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