Diff for /loncom/interface/loncreateuser.pm between versions 1.224 and 1.270

version 1.224, 2007/12/24 16:00:13 version 1.270, 2008/12/18 16:58:26
Line 33  package Apache::loncreateuser; Line 33  package Apache::loncreateuser;
   
 =head1 NAME  =head1 NAME
   
 Apache::loncreateuser - handler to create users and custom roles  Apache::loncreateuser.pm
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Apache::loncreateuser provides an Apache handler for creating users,      Handler to create users and custom roles
   
       Provides an Apache handler for creating users,
     editing their login parameters, roles, and removing roles, and      editing their login parameters, roles, and removing roles, and
     also creating and assigning custom roles.      also creating and assigning custom roles.
   
Line 76  my $authformfsys; Line 78  my $authformfsys;
 my $authformloc;  my $authformloc;
   
 sub initialize_authen_forms {  sub initialize_authen_forms {
     my ($dom,$curr_authtype,$mode) = @_;       my ($dom,$formname,$curr_authtype,$mode) = @_;
     my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/);      my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($dom);
     $krbdefdom= uc($krbdefdom);      my %param = ( formname => $formname,
     my %param = ( formname => 'document.cu',  
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                     kerb_def_auth => $krbdef,
                   domain => $dom,                    domain => $dom,
                 );                  );
     my %abv_auth = &auth_abbrev();      my %abv_auth = &auth_abbrev();
     if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):$/) {      if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):(.*)$/) {
         my $long_auth = $1;          my $long_auth = $1;
           my $curr_autharg = $2;
         my %abv_auth = &auth_abbrev();          my %abv_auth = &auth_abbrev();
         $param{'curr_authtype'} = $abv_auth{$long_auth};          $param{'curr_authtype'} = $abv_auth{$long_auth};
         if ($long_auth =~ /^krb(4|5)$/) {          if ($long_auth =~ /^krb(4|5)$/) {
             $param{'curr_kerb_ver'} = $1;              $param{'curr_kerb_ver'} = $1;
               $param{'curr_autharg'} = $curr_autharg;
         }          }
         if ($mode eq 'modifyuser') {          if ($mode eq 'modifyuser') {
             $param{'mode'} = $mode;              $param{'mode'} = $mode;
         }          }
     }      }
 # no longer static due to configurable kerberos defaults      $loginscript  = &Apache::loncommon::authform_header(%param);
 #    $loginscript  = &Apache::loncommon::authform_header(%param);      $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
     $authformnop  = &Apache::loncommon::authform_nochange(%param);      $authformnop  = &Apache::loncommon::authform_nochange(%param);
 # no longer static due to configurable kerberos defaults  
 #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  
     $authformint  = &Apache::loncommon::authform_internal(%param);      $authformint  = &Apache::loncommon::authform_internal(%param);
     $authformfsys = &Apache::loncommon::authform_filesystem(%param);      $authformfsys = &Apache::loncommon::authform_filesystem(%param);
     $authformloc  = &Apache::loncommon::authform_local(%param);      $authformloc  = &Apache::loncommon::authform_local(%param);
Line 120  sub auth_abbrev { Line 122  sub auth_abbrev {
 sub portfolio_quota {  sub portfolio_quota {
     my ($ccuname,$ccdomain) = @_;      my ($ccuname,$ccdomain) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                    'disk' => "Disk space allocated to user's portfolio files",                     'usrt'      => "User Tools",
                    'cuqu' => "Current quota",                     'blog'      => "Personal User Blog",
                    'cust' => "Custom quota",                     'aboutme'   => "Personal Information Page",
                    'defa' => "Default",                     'portfolio' => "Personal User Portfolio",
                    'chqu' => "Change quota",                     'avai'      => "Available",
                      'cusa'      => "availability",
                      'chse'      => "Change setting",
                      'disk'      => "Disk space allocated to user's portfolio files",
                      'cuqu'      => "Current quota",
                      'cust'      => "Custom quota",
                      'defa'      => "Default",
                      'usde'      => "Use default",
                      'uscu'      => "Use custom",
                      'chqu'      => "Change quota",
     );      );
     my ($currquota,$quotatype,$inststatus,$defquota) =       my ($currquota,$quotatype,$inststatus,$defquota) = 
         &Apache::loncommon::get_user_quota($ccuname,$ccdomain);          &Apache::loncommon::get_user_quota($ccuname,$ccdomain);
Line 156  END_SCRIPT Line 167  END_SCRIPT
         $custom_off = ' ';          $custom_off = ' ';
         $showquota = $currquota;          $showquota = $currquota;
         if ($longinsttype eq '') {          if ($longinsttype eq '') {
             $defaultinfo = &mt('For this user, the default quota would be [_1]              $defaultinfo = &mt('For this user, the default quota would be [_1]'
                             Mb.',$defquota);                              .' Mb.',$defquota);
         } else {          } else {
             $defaultinfo = &mt("For this user, the default quota would be [_1]               $defaultinfo = &mt("For this user, the default quota would be [_1]".
                             Mb, as determined by the user's institutional                                 " Mb, as determined by the user's institutional".
                            affiliation ([_2]).",$defquota,$longinsttype);                                 " affiliation ([_2]).",$defquota,$longinsttype);
         }          }
     } else {      } else {
         if ($longinsttype eq '') {          if ($longinsttype eq '') {
             $defaultinfo = &mt('For this user, the default quota is [_1]              $defaultinfo = &mt('For this user, the default quota is [_1]'
                             Mb.',$defquota);                              .' Mb.',$defquota);
         } else {          } else {
             $defaultinfo = &mt("For this user, the default quota of [_1]              $defaultinfo = &mt("For this user, the default quota of [_1]".
                             Mb, is determined by the user's institutional                                 " Mb, is determined by the user's institutional".
                             affiliation ([_2]).",$defquota,$longinsttype);                                 " affiliation ([_2]).",$defquota,$longinsttype);
         }          }
     }      }
     my $output = $quota_javascript.  
                  '<h3>'.$lt{'disk'}.'</h3>'.      my $output = $quota_javascript."\n".
                  &Apache::loncommon::start_data_table().                   '<h3>'.$lt{'usrt'}.'</h3>'."\n".
                  &Apache::loncommon::start_data_table_row().                   &Apache::loncommon::start_data_table();
                  '<td>'.$lt{'cuqu'}.': '.$currquota.'&nbsp;Mb.&nbsp;&nbsp;'.  
                  $defaultinfo.'</td>'.      if (&Apache::lonnet::allowed('mut',$ccdomain)) {
                  &Apache::loncommon::end_data_table_row().          my %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                  &Apache::loncommon::start_data_table_row().                            'tools.aboutme','tools.portfolio','tools.blog');
                  '<td><span class="LC_nobreak">'.$lt{'chqu'}.          my @usertools = ('aboutme','blog','portfolio');
                  ': <label>'.          foreach my $item (@usertools) {
                  '<input type="radio" name="customquota" value="0" '.              my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off);
                  $custom_off.' onchange="javascript:quota_changes('."'custom'".')"              $cust_off = 'checked="checked" ';
                   />'.$lt{'defa'}.'&nbsp;('.$defquota.' Mb).</label>&nbsp;'.              $tool_on = 'checked="checked" ';
                  '&nbsp;<label><input type="radio" name="customquota" value="1" '.               $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item);
                  $custom_on.'  onchange="javascript:quota_changes('."'custom'".')" />'.              if ($userenv{'tools.'.$item} eq '') {
                  $lt{'cust'}.':</label>&nbsp;'.                  $custom_access = 'default';
                  '<input type="text" name="portfolioquota" size ="5" value="'.                  if (!$curr_access) {
                  $showquota.'" onfocus="javascript:quota_changes('."'quota'".')" '.                      $tool_off = 'checked="checked" ';
                  '/>&nbsp;Mb</span></td>'.                      $tool_on = '';
                  &Apache::loncommon::end_data_table_row().                  }
                  &Apache::loncommon::end_data_table();              } else {
                   $custom_access = 'custom';
                   $cust_on = ' checked="checked" ';
                   $cust_off = '';
                   if ($userenv{'tools.'.$item} == 0) {
                       $tool_off = 'checked="checked" ';
                       $tool_on = '';
                   }
               }
               $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item);
               $output .= '  <tr class="LC_info_row">'."\n".
                          '   <td>'.$lt{$item}.'</td>'."\n".
                          '  </tr>'."\n".
                          &Apache::loncommon::start_data_table_row()."\n".
                          '  <td>'.&mt('Availability determined currently from [_1] setting.',$custom_access).
                          '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'avai'}.': '.
                          ($curr_access?&mt('Yes'):&mt('No')).'</td>'."\n".
                          &Apache::loncommon::end_data_table_row()."\n".
                          &Apache::loncommon::start_data_table_row()."\n".
                          '  <td><span class="LC_nobreak">'.$lt{'chse'}.': <label>'.
                          '<input type="radio" name="custom'.$item.'" value="0" '.
                          $cust_off.'/>'.$lt{'usde'}.'</label>&nbsp;&nbsp;&nbsp;'.
                          '<label><input type="radio" name="custom'.$item.'" value="1" '.
                          $cust_on.'/>'.$lt{'uscu'}.'</label>&nbsp;&nbsp;--&nbsp;&nbsp;'.
                          $lt{'cusa'}.':&nbsp;<label>'.
                          '<input type="radio" name="tools_'.$item.'" value="1" '.
                          $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.
                          '<input type="radio" name="tools_'.$item.'" value="0" '.
                          $tool_off.'/>'.&mt('Off').'</label></span></td>'."\n".
                          &Apache::loncommon::end_data_table_row()."\n";
           }
       }
       if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
           $output .= '<tr class="LC_info_row">'."\n".
                      '    <td>'.$lt{'disk'}.'</td>'."\n".
                      '  </tr>'."\n".
                      &Apache::loncommon::start_data_table_row()."\n".
                      '  <td>'.$lt{'cuqu'}.': '.
                      $currquota.'&nbsp;Mb.&nbsp;&nbsp;'.
                      $defaultinfo.'</td>'."\n".
                      &Apache::loncommon::end_data_table_row()."\n".
                      &Apache::loncommon::start_data_table_row()."\n".
                      '  <td><span class="LC_nobreak">'.$lt{'chqu'}.
                      ': <label>'.
                      '<input type="radio" name="customquota" value="0" '.
                      $custom_off.' onchange="javascript:quota_changes('."'custom'".')"'.
                      ' />'.$lt{'defa'}.'&nbsp;('.$defquota.' Mb).</label>&nbsp;'.
                      '&nbsp;<label><input type="radio" name="customquota" value="1" '. 
                      $custom_on.'  onchange="javascript:quota_changes('."'custom'".')" />'.
                      $lt{'cust'}.':</label>&nbsp;'.
                      '<input type="text" name="portfolioquota" size ="5" value="'.
                      $showquota.'" onfocus="javascript:quota_changes('."'quota'".')" '.
                      '/>&nbsp;Mb</span></td>'."\n".
                      &Apache::loncommon::end_data_table_row()."\n";
       }  
       $output .= &Apache::loncommon::end_data_table();
     return $output;      return $output;
 }  }
   
Line 220  sub print_username_entry_form { Line 286  sub print_username_entry_form {
     my %loaditems = (      my %loaditems = (
                 'onload' => "javascript:setFormElements(document.$formtoset)",                  'onload' => "javascript:setFormElements(document.$formtoset)",
                     );                      );
       my %breadcrumb_text = &singleuser_breadcrumb();
     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 230  sub print_username_entry_form { Line 297  sub print_username_entry_form {
     } else {      } else {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"javascript:backPage(document.crtuser)",            ({href=>"javascript:backPage(document.crtuser)",
             text=>"Single user search",              text=>$breadcrumb_text{'search'},
             faq=>282,bug=>'Instructor Interface',});              faq=>282,bug=>'Instructor Interface',});
     }      }
     my $helpitem = 'Course_Change_Privileges';      my $helpitem = 'Course_Change_Privileges';
Line 245  sub print_username_entry_form { Line 312  sub print_username_entry_form {
     my $choice=&Apache::loncommon::select_form('make new role','rolename',      my $choice=&Apache::loncommon::select_form('make new role','rolename',
  ('make new role' => 'Generate new role ...',%existingroles));   ('make new role' => 'Generate new role ...',%existingroles));
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'srch' => "User Search",                      'srst' => 'Search for a user and enroll as a student',
                      or    => "or",                      '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' => "Edit Custom Role Privileges",
                     'nr'   => "Name of Role",                      'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor",                      'cre'  => "Custom Role Editor",
                     'mod'  => "to modify user information or add/modify roles",  
                     'enrl' => "to enroll one student",  
        );         );
     my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface');  
     my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');  
     if ($sellink) {  
         $sellink = "$lt{'or'} ".$sellink;  
     }   
     $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','/')) {
Line 274  $lt{'nr'}: $choice <input type="text" si Line 334  $lt{'nr'}: $choice <input type="text" si
 ENDCUSTOM  ENDCUSTOM
         }          }
     } else {      } else {
         my $actiontext = $lt{'mod'};          my $actiontext = $lt{'srad'};
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $actiontext = $lt{'enrl'};              $actiontext = $lt{'srst'};
         }          }
         $r->print("          $r->print("
 <h3>$lt{'srch'} $sellink $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);
         }          }
Line 291  ENDCUSTOM Line 351  ENDCUSTOM
 sub entry_form {  sub entry_form {
     my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;      my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my $usertype;      my ($usertype,$inexact);
     if (ref($srch) eq 'HASH') {      if (ref($srch) eq 'HASH') {
         if (($srch->{'srchin'} eq 'dom') &&          if (($srch->{'srchin'} eq 'dom') &&
             ($srch->{'srchby'} eq 'uname') &&              ($srch->{'srchby'} eq 'uname') &&
Line 301  sub entry_form { Line 361  sub entry_form {
             my ($rules,$ruleorder) =              my ($rules,$ruleorder) =
                 &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');                  &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');
             $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules);              $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules);
           } else {
               $inexact = 1;
         }          }
     }      }
     my $cancreate =      my $cancreate =
Line 309  sub entry_form { Line 371  sub entry_form {
        &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,         &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
                                        'document.crtuser',$cancreate,$usertype);                                         'document.crtuser',$cancreate,$usertype);
     my $srchbutton = &mt('Search');      my $srchbutton = &mt('Search');
       if ($env{'form.action'} eq 'singlestudent') {
           $srchbutton = &mt('Search and Enroll');
       } elsif ($cancreate && $responsemsg ne '' && $inexact) {
           $srchbutton = &mt('Search or Add New User');
       }
     my $output = <<"ENDBLOCK";      my $output = <<"ENDBLOCK";
 <form action="/adm/createuser" method="post" name="crtuser">  <form action="/adm/createuser" method="post" name="crtuser">
 <input type="hidden" name="action" value="$env{'form.action'}" />  <input type="hidden" name="action" value="$env{'form.action'}" />
Line 317  $userpicker Line 384  $userpicker
 <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />  <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />
 </form>  </form>
 ENDBLOCK  ENDBLOCK
     if ($cancreate && $env{'form.phase'} eq '') {      if ($env{'form.phase'} eq '') {
         my $defdom=$env{'request.role.domain'};          my $defdom=$env{'request.role.domain'};
         my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');          my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
         my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges');  
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                     'enro' => 'Enroll one student',
                     'admo' => 'Add/modify a single user',
                     'crea' => 'create new user if required',
                     'uskn' => "username is known",
                   'crnu' => 'Create a new user',                    'crnu' => 'Create a new user',
                   'usr'  => 'Username',                    'usr'  => 'Username',
                   'dom'  => 'in domain',                    'dom'  => 'in domain',
                   'cra'  => 'Create user',                    'enrl' => 'Enroll',
                     'cram'  => 'Create/Modify user',
         );          );
           my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');
           my ($title,$buttontext,$showresponse);
           if ($env{'form.action'} eq 'singlestudent') {   
               $title = $lt{'enro'};
               $buttontext = $lt{'enrl'};
           } else {
               $title = $lt{'admo'};
               $buttontext = $lt{'cram'};
           }
           if ($cancreate) {
               $title .= ' <span class="LC_cusr_subheading">('.$lt{'crea'}.')</span>';
           } else {
               $title .= ' <span class="LC_cusr_subheading">('.$lt{'uskn'}.')</span>';
           }
           if ($env{'form.origform'} eq 'crtusername') {
               $showresponse = $responsemsg;
           }
         $output .= <<"ENDDOCUMENT";          $output .= <<"ENDDOCUMENT";
   <br />
 <form action="/adm/createuser" method="post" name="crtusername">  <form action="/adm/createuser" method="post" name="crtusername">
 <input type="hidden" name="action" value="$env{'form.action'}" />  <input type="hidden" name="action" value="$env{'form.action'}" />
 <input type="hidden" name="phase" value="createnewuser" />  <input type="hidden" name="phase" value="createnewuser" />
 <input type="hidden" name="srchtype" value="exact" />  <input type="hidden" name="srchtype" value="exact" />
 <input type="hidden" name="srchby" value="username" />  <input type="hidden" name="srchby" value="uname" />
 <input type="hidden" name="srchin" value="dom" />  <input type="hidden" name="srchin" value="dom" />
 <input type="hidden" name="forcenewuser" value="1" />  <input type="hidden" name="forcenewuser" value="1" />
 <input type="hidden" name="origform" value="crtusername" />  <input type="hidden" name="origform" value="crtusername" />
 <h3>$lt{crnu}$helpcrt</h3>  <h3>$title</h3>
 $responsemsg  $showresponse
 <table>  <table>
  <tr>   <tr>
   <td>$lt{'usr'}:</td>    <td>$lt{'usr'}:</td>
   <td><input type="text" size="15" name="srchterm" /></td>    <td><input type="text" size="15" name="srchterm" /></td>
   <td>&nbsp;$lt{'dom'}:</td><td>$domform</td>    <td>&nbsp;$lt{'dom'}:</td><td>$domform</td>
   <td>&nbsp;<input name="userrole" type="submit" value="$lt{'cra'}" /></td>    <td>&nbsp;$sellink&nbsp;</td>
     <td>&nbsp;<input name="userrole" type="submit" value="$buttontext" /></td>
  </tr>   </tr>
 </table>  </table>
 </form>  </form>
Line 381  END Line 471  END
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_selection_page {  sub print_user_selection_page {
     my ($r,$response,$srch,$srch_results,$operation,$srcharray,$context) = @_;      my ($r,$response,$srch,$srch_results,$srcharray,$context) = @_;
     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 416  ENDSCRIPT Line 506  ENDSCRIPT
                                        'permanentemail' => "permanent e-mail",                                         'permanentemail' => "permanent e-mail",
                                       );                                        );
     $r->print(&Apache::loncommon::start_page('User Management',$jscript));      $r->print(&Apache::loncommon::start_page('User Management',$jscript));
     if ($operation eq 'createuser') {  
         &Apache::lonhtmlcommon::add_breadcrumb      my %breadcrumb_text = &singleuser_breadcrumb();
             ({href=>"javascript:backPage(document.usersrchform,'','')",      &Apache::lonhtmlcommon::add_breadcrumb
               text=>"Create/modify user",          ({href=>"javascript:backPage(document.usersrchform,'','')",
               faq=>282,bug=>'Instructor Interface',},            text=>$breadcrumb_text{'search'},
              {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",            faq=>282,bug=>'Instructor Interface',},
               text=>"Select User",           {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
               faq=>282,bug=>'Instructor Interface',});            text=>$breadcrumb_text{'userpicked'},
             faq=>282,bug=>'Instructor Interface',});
       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));
         $r->print('<h3>'.$lt{'usel'}.'</h3>');          $r->print('<h3>'.$lt{'usel'}.'</h3>');
     } elsif ($operation eq 'enrollstudent') {      } elsif ($env{'form.action'} eq 'singlestudent') {
         &Apache::lonhtmlcommon::add_breadcrumb  
             ({href=>"javascript:backPage(document.usersrchform,'','')",  
               text=>"Create/modify student",  
               faq=>282,bug=>'Instructor Interface',},  
              {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",  
               text=>"Select Student",  
               faq=>282,bug=>'Instructor Interface',});  
         $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>$lt{'stusrch'}</b><br />");
Line 515  sub print_user_modification_page { Line 600  sub print_user_modification_page {
         $formname = 'cu';          $formname = 'cu';
     }      }
     my %abv_auth = &auth_abbrev();      my %abv_auth = &auth_abbrev();
     my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser,      my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules);
         %alerts,%curr_rules,%got_rules);  
     my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);      my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
     if ($uhome eq 'no_host') {      if ($uhome eq 'no_host') {
         my $usertype;          my $usertype;
Line 571  sub print_user_modification_page { Line 655  sub print_user_modification_page {
         }          }
     } else {      } else {
         $newuser = 0;          $newuser = 0;
         my $currentauth =   
             &Apache::lonnet::queryauthenticate($ccuname,$ccdomain);  
         if ($currentauth =~ /^(krb4|krb5|unix|internal|localauth):/) {  
             $curr_authtype = $abv_auth{$1};  
             if ($currentauth =~ /^krb(4|5)/) {  
                 $curr_kerb_ver = $1;  
             }  
         }  
     }      }
     if ($response) {      if ($response) {
         $response = '<br />'.$response;          $response = '<br />'.$response;
     }      }
     my $defdom=$env{'request.role.domain'};  
   
     my ($krbdef,$krbdefdom) =  
        &Apache::loncommon::get_kerberos_defaults($defdom);  
   
     my %param = ( formname => 'document.cu',  
                   kerb_def_dom => $krbdefdom,  
                   kerb_def_auth => $krbdef,  
                   curr_authtype => $curr_authtype,  
                   curr_kerb_ver => $curr_kerb_ver,  
                   domain => $ccdomain,  
                 );  
     $loginscript  = &Apache::loncommon::authform_header(%param);  
     $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  
   
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $dc_setcourse_code = '';      my $dc_setcourse_code = '';
Line 607  sub print_user_modification_page { Line 669  sub print_user_modification_page {
   
     my $js = &validation_javascript($context,$ccdomain,$pjump_def,      my $js = &validation_javascript($context,$ccdomain,$pjump_def,
                                $groupslist,$newuser,$formname,\%loaditem);                                 $groupslist,$newuser,$formname,\%loaditem);
       my $args = {'add_entries' => \%loaditem};  
       if ($env{'form.popup'}) {
          $args->{'no_nav_bar'} = 1; 
       }
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('User Management',   &Apache::loncommon::start_page('User Management',$js,$args);
        $js,{'add_entries' => \%loaditem,});  
     my %breadcrumb_text = &singleuser_breadcrumb();      my %breadcrumb_text = &singleuser_breadcrumb();
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage($form)",       ({href=>"javascript:backPage($form)",
Line 650  ENDFORMINFO Line 715  ENDFORMINFO
     }      }
     if ($newuser) {      if ($newuser) {
         my $portfolioform;          my $portfolioform;
         if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {          if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||
             # Current user has quota modification privileges              (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {
               # Current user has quota or user tools modification privileges
             $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);              $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);
         }          }
         &initialize_authen_forms($ccdomain);          &initialize_authen_forms($ccdomain,$formname);
         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',
Line 775  ENDCHANGEUSER Line 841  ENDCHANGEUSER
             $r->print(&Apache::lonuserutils::forceid_change($context));              $r->print(&Apache::lonuserutils::forceid_change($context));
         }          }
         $r->print('</div>');          $r->print('</div>');
         my $user_auth_text =           my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);
             &user_authentication($ccuname,$ccdomain,$krbdefdom,\%abv_auth);          my ($user_quota_text,$user_tools_text);
         my $user_quota_text;          if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
         if (&Apache::lonnet::allowed('mpq',$ccdomain)) {              (&Apache::lonnet::allowed('mut',$ccdomain))) {
             # Current user has quota modification privileges              # Current user has quota modification privileges
             $user_quota_text = &portfolio_quota($ccuname,$ccdomain);              $user_quota_text = &portfolio_quota($ccuname,$ccdomain);
         } elsif (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {          }
             # Get the user's portfolio information          if (!&Apache::lonnet::allowed('mpq',$ccdomain)) {
             my %portq = &Apache::lonnet::get('environment',['portfolioquota'],              if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
                                              $ccdomain,$ccuname);                  # Get the user's portfolio information
                   my %portq = &Apache::lonnet::get('environment',['portfolioquota'],
             my %lt=&Apache::lonlocal::texthash(                                                   $ccdomain,$ccuname);
                 'dska'  => "Disk space allocated to user's portfolio files",                  my %lt=&Apache::lonlocal::texthash(
                 'youd'  => "You do not have privileges to modify the portfolio quota for this user.",                      'dska'  => "Disk space allocated to user's portfolio files",
                 'ichr'  => "If a change is required, contact a domain coordinator for the domain",                      'youd'  => "You do not have privileges to modify the portfolio quota for this user.",
             );                      'ichr'  => "If a change is required, contact a domain coordinator for the domain",
             $user_quota_text = <<ENDNOPORTPRIV;                  );
                   $user_quota_text = <<ENDNOPORTPRIV;
 <h3>$lt{'dska'}</h3>  <h3>$lt{'dska'}</h3>
 $lt{'youd'} $lt{'ichr'}: $ccdomain  $lt{'youd'} $lt{'ichr'}: $ccdomain
 ENDNOPORTPRIV  ENDNOPORTPRIV
               }
           }
           if (!&Apache::lonnet::allowed('mut',$ccdomain)) {
               if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) {
                   my %lt=&Apache::lonlocal::texthash(
                       'utav'  => "User Tools Availability",
                       'yodo'  => "You do not have privileges to modify Portfolio, Blog or Home Page settings for this user.",
                       'ifch'  => "If a change is required, contact a domain coordinator for the domain",
                   );
                   $user_tools_text = <<ENDNOTOOLSPRIV;
   <h3>$lt{'utav'}</h3>
   $lt{'yodo'} $lt{'ifch'}: $ccdomain
   ENDNOTOOLSPRIV
               }
         }          }
         if ($user_auth_text ne '') {          if ($user_auth_text ne '') {
             $r->print('<div class="LC_left_float">'.$user_auth_text);              $r->print('<div class="LC_left_float">'.$user_auth_text);
             if ($user_quota_text ne '') {              if ($user_quota_text ne '') {
                 $r->print($user_quota_text);                  $r->print($user_quota_text);
             }              }
               if ($user_tools_text ne '') {
                   $r->print($user_tools_text);
               }
             if ($env{'form.action'} eq 'singlestudent') {              if ($env{'form.action'} eq 'singlestudent') {
                 $r->print(&date_sections_select($context,$newuser,$formname));                  $r->print(&date_sections_select($context,$newuser,$formname));
             }              }
         } elsif ($user_quota_text ne '') {          } elsif ($user_quota_text ne '') {
             $r->print('<div class="LC_left_float">'.$user_quota_text);              $r->print('<div class="LC_left_float">'.$user_quota_text);
               if ($user_tools_text ne '') {
                   $r->print($user_tools_text);
               }
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print(&date_sections_select($context,$newuser,$formname));
               }
           } elsif ($user_tools_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_tools_text);
             if ($env{'form.action'} eq 'singlestudent') {              if ($env{'form.action'} eq 'singlestudent') {
                 $r->print(&date_sections_select($context,$newuser,$formname));                  $r->print(&date_sections_select($context,$newuser,$formname));
             }              }
Line 835  ENDNOPORTPRIV Line 927  ENDNOPORTPRIV
                 $addrolesdisplay = $add_domainroles;                  $addrolesdisplay = $add_domainroles;
             }              }
             $r->print(&course_level_dc($env{'request.role.domain'},'Course'));              $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
             $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");              $r->print('<br /><input type="button" value="'.&mt('Save').'" onClick="setCourse()" />'."\n");
         } elsif ($context eq 'author') {          } elsif ($context eq 'author') {
             if ($addrolesdisplay) {              if ($addrolesdisplay) {
                 $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');                  $r->print('<br /><input type="button" value="'.&mt('Save').'"');
                 if ($newuser) {                  if ($newuser) {
                     $r->print(' onClick="verify_message(this.form)" \>'."\n");                      $r->print(' onClick="auth_check()" \>'."\n");
                 } else {                  } else {
                     $r->print('onClick="this.form.submit()" \>'."\n");                      $r->print('onClick="this.form.submit()" \>'."\n");
                 }                  }
Line 850  ENDNOPORTPRIV Line 942  ENDNOPORTPRIV
             }              }
         } else {          } else {
             $r->print(&course_level_table(%inccourses));              $r->print(&course_level_table(%inccourses));
             $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections(this.form)" />'."\n");              $r->print('<br /><input type="button" value="'.&mt('Save').'" onClick="setSections(this.form)" />'."\n");
         }          }
     }      }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));      $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
Line 867  sub singleuser_breadcrumb { Line 959  sub singleuser_breadcrumb {
         $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 {
         $breadcrumb_text{'search'} = 'Create/modify user';          $breadcrumb_text{'search'} = 'Create/modify a user';
         $breadcrumb_text{'userpicked'} = 'Select a user',          $breadcrumb_text{'userpicked'} = 'Select a user',
         $breadcrumb_text{'modify'} = 'Set user role',          $breadcrumb_text{'modify'} = 'Set user role',
     }      }
Line 897  sub validation_javascript { Line 989  sub validation_javascript {
     if ($context eq 'domain') {      if ($context eq 'domain') {
         my $dcdom = $env{'request.role.domain'};          my $dcdom = $env{'request.role.domain'};
         $loaditem->{'onload'} = "document.cu.coursedesc.value='';";          $loaditem->{'onload'} = "document.cu.coursedesc.value='';";
         $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser');          $dc_setcourse_code = 
               &Apache::lonuserutils::dc_setcourse_js('cu','singleuser',$context);
     } else {      } else {
         $nondc_setsection_code =          my $checkauth; 
             &Apache::lonuserutils::setsections_javascript($formname,$groupslist);          if (($newuser) || (&Apache::lonnet::allowed('mau',$ccdomain))) {
               $checkauth = 1;
           }
           if ($context eq 'course') {
               $nondc_setsection_code =
                   &Apache::lonuserutils::setsections_javascript($formname,$groupslist,
                                                                 undef,$checkauth);
           }
           if ($checkauth) {
               $nondc_setsection_code .= 
                   &Apache::lonuserutils::verify_authen($formname,$context);
           }
     }      }
     my $js = &user_modification_js($pjump_def,$dc_setcourse_code,      my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
                                    $nondc_setsection_code,$groupslist);                                     $nondc_setsection_code,$groupslist);
   
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $javascript_validations;  
     if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($newuser)) {  
         my ($krbdef,$krbdefdom) =  
             &Apache::loncommon::get_kerberos_defaults($ccdomain);  
         $javascript_validations =  
             &Apache::lonuserutils::javascript_validations('createuser',$krbdefdom,undef,  
                                                           undef,$ccdomain);  
     }  
     $js .= "\n".      $js .= "\n".
            '<script type="text/javascript">'."\n".$jsback."\n".             '<script type="text/javascript">'."\n".$jsback."\n".'</script>';
            $javascript_validations.'</script>';  
     return $js;      return $js;
 }  }
   
Line 967  sub display_existing_roles { Line 1061  sub display_existing_roles {
                 if (defined($coursedata{'description'})) {                  if (defined($coursedata{'description'})) {
                     $carea=$coursedata{'description'}.                      $carea=$coursedata{'description'}.
                         '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).                          '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);       &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
                     $sortkey.="\0".$coursedata{'description'};                      $sortkey.="\0".$coursedata{'description'};
                     $class=$coursedata{'type'};                      $class=$coursedata{'type'};
                 } else {                  } else {
Line 1241  sub new_domain_roles { Line 1335  sub new_domain_roles {
 }  }
   
 sub user_authentication {  sub user_authentication {
     my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_;      my ($ccuname,$ccdomain,$formname) = @_;
     my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);      my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
     my ($loginscript,$outcome);      my $outcome;
     if ($currentauth=~/^(krb)(4|5):(.*)/) {  
         my $long_auth = $1.$2;  
         my $curr_kerb_ver = $2;  
         my $krbdefdom=$3;  
         my $curr_authtype = $abv_auth->{$long_auth};  
         my %param = ( formname      => 'document.cu',  
                       kerb_def_dom  => $krbdefdom,  
                       domain        => $ccdomain,  
                       curr_authtype => $curr_authtype,  
                       curr_kerb_ver => $curr_kerb_ver,  
                           );  
         $loginscript  = &Apache::loncommon::authform_header(%param);  
     }  
     # Check for a bad authentication type      # Check for a bad authentication type
     if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) {      if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) {
         # bad authentication scheme          # bad authentication scheme
Line 1268  sub user_authentication { Line 1349  sub user_authentication {
                        'ld'    => "Login Data"                         'ld'    => "Login Data"
         );          );
         if (&Apache::lonnet::allowed('mau',$ccdomain)) {          if (&Apache::lonnet::allowed('mau',$ccdomain)) {
             &initialize_authen_forms($ccdomain);              &initialize_authen_forms($ccdomain,$formname);
   
             my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);              my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
             $outcome = <<ENDBADAUTH;              $outcome = <<ENDBADAUTH;
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
Line 1289  $lt{'uuas'} ($currentauth). $lt{'adcs'}. Line 1371  $lt{'uuas'} ($currentauth). $lt{'adcs'}.
 ENDBADAUTH  ENDBADAUTH
         }          }
     } else { # Authentication type is valid      } else { # Authentication type is valid
         &initialize_authen_forms($ccdomain,$currentauth,'modifyuser');          &initialize_authen_forms($ccdomain,$formname,$currentauth,'modifyuser');
         my ($authformcurrent,$can_modify,@authform_others) =          my ($authformcurrent,$can_modify,@authform_others) =
             &modify_login_block($ccdomain,$currentauth);              &modify_login_block($ccdomain,$currentauth);
         if (&Apache::lonnet::allowed('mau',$ccdomain)) {          if (&Apache::lonnet::allowed('mau',$ccdomain)) {
Line 1333  ENDBADAUTH Line 1415  ENDBADAUTH
                 $outcome .= <<ENDNOPRIV;                  $outcome .= <<ENDNOPRIV;
 <h3>$lt{'ccld'}</h3>  <h3>$lt{'ccld'}</h3>
 $lt{'yodo'} $lt{'ifch'}: $ccdomain  $lt{'yodo'} $lt{'ifch'}: $ccdomain
   <input type="hidden" name="login" value="nochange" />
 ENDNOPRIV  ENDNOPRIV
             }              }
         }          }
Line 1407  sub modify_login_block { Line 1490  sub modify_login_block {
 }  }
   
 sub personal_data_display {  sub personal_data_display {
     my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_;      my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;
     my ($output,$showforceid,%userenv,%canmodify);      my ($output,$showforceid,%userenv,%canmodify);
     my @userinfo = ('firstname','middlename','lastname','generation',      my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');                      'permanentemail','id');
       my $rowcount = 0;
       my $editable = 0;
     if (!$newuser) {      if (!$newuser) {
         # Get the users information          # Get the users information
         %userenv = &Apache::lonnet::get('environment',          %userenv = &Apache::lonnet::get('environment',
Line 1418  sub personal_data_display { Line 1503  sub personal_data_display {
                     'permanentemail','id'],$ccdomain,$ccuname);                      'permanentemail','id'],$ccdomain,$ccuname);
         %canmodify =          %canmodify =
             &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,              &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
                                                        \@userinfo);                                                         \@userinfo,$rolesarray);
       } elsif ($context eq 'selfcreate') {
           %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo,
                                              $inst_results,$rolesarray);
     }      }
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                 'pd'             => "Personal Data",                  'pd'             => "Personal Data",
Line 1427  sub personal_data_display { Line 1515  sub personal_data_display {
                 'lastname'       => "Last Name",                  'lastname'       => "Last Name",
                 'generation'     => "Generation",                  'generation'     => "Generation",
                 'permanentemail' => "Permanent e-mail address",                  'permanentemail' => "Permanent e-mail address",
                 'id'             => "ID/Student Number",                  'id'             => "Student/Employee ID",
                 'lg'             => "Login Data"                  'lg'             => "Login Data"
     );      );
     my %textboxsize = (      my %textboxsize = (
Line 1443  sub personal_data_display { Line 1531  sub personal_data_display {
               &Apache::lonhtmlcommon::start_pick_box();                &Apache::lonhtmlcommon::start_pick_box();
     foreach my $item (@userinfo) {      foreach my $item (@userinfo) {
         my $rowtitle = $lt{$item};          my $rowtitle = $lt{$item};
           my $hiderow = 0;
         if ($item eq 'generation') {          if ($item eq 'generation') {
             $rowtitle = $genhelp.$rowtitle;              $rowtitle = $genhelp.$rowtitle;
         }          }
         $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";          my $row = &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
         if ($newuser) {          if ($newuser) {
             if (ref($inst_results) eq 'HASH') {              if (ref($inst_results) eq 'HASH') {
                 if ($inst_results->{$item} ne '') {                  if ($inst_results->{$item} ne '') {
                     $output .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};                      $row .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};
                 } else {                  } else {
                     $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';                      if ($context eq 'selfcreate') {
                           if ($canmodify{$item}) { 
                               $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                               $editable ++;
                           } else {
                               $hiderow = 1;
                           }
                       } else {
                           $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                       }
                 }                  }
             } else {              } else {
                 $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';                  if ($context eq 'selfcreate') {
                       if ($canmodify{$item}) {
                           $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                           $editable ++;
                       } else {
                           $hiderow = 1;
                       }
                   } else {
                       $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                   }
             }              }
         } else {          } else {
             if ($canmodify{$item}) {              if ($canmodify{$item}) {
                 $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';                  $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';
             } else {              } else {
                 $output .= $userenv{$item};                  $row .= $userenv{$item};
             }              }
             if ($item eq 'id') {              if ($item eq 'id') {
                 $showforceid = $canmodify{$item};                  $showforceid = $canmodify{$item};
             }              }
         }          }
         $output .= &Apache::lonhtmlcommon::row_closure(1);          $row .= &Apache::lonhtmlcommon::row_closure(1);
           if (!$hiderow) {
               $output .= $row;
               $rowcount ++;
           }
     }      }
     $output .= &Apache::lonhtmlcommon::end_pick_box();      $output .= &Apache::lonhtmlcommon::end_pick_box();
     if (wantarray) {      if (wantarray) {
         return ($output,$showforceid);          if ($context eq 'selfcreate') {
               return($output,$rowcount,$editable);
           } else {
               return ($output,$showforceid);
           }
     } else {      } else {
         return $output;          return $output;
     }      }
 }  }
   
   sub selfcreate_canmodify {
       my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_;
       if (ref($inst_results) eq 'HASH') {
           my @inststatuses = &get_inststatuses($inst_results);
           if (@inststatuses == 0) {
               @inststatuses = ('default');
           }
           $rolesarray = \@inststatuses;
       }
       my %canmodify =
           &Apache::lonuserutils::can_modify_userinfo($context,$dom,$userinfo,
                                                      $rolesarray);
       return %canmodify;
   }
   
   sub get_inststatuses {
       my ($insthashref) = @_;
       my @inststatuses = ();
       if (ref($insthashref) eq 'HASH') {
           if (ref($insthashref->{'inststatus'}) eq 'ARRAY') {
               @inststatuses = @{$insthashref->{'inststatus'}};
           }
       }
       return @inststatuses;
   }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my ($r,$context) = @_;       my ($r,$context) = @_; 
Line 1501  sub update_user_data { Line 1642  sub update_user_data {
     my $jscript = '<script type="text/javascript">'."\n".      my $jscript = '<script type="text/javascript">'."\n".
                   $jsback."\n".'</script>'."\n";                    $jsback."\n".'</script>'."\n";
     my %breadcrumb_text = &singleuser_breadcrumb();      my %breadcrumb_text = &singleuser_breadcrumb();
     $r->print(&Apache::loncommon::start_page($title,$jscript));      my $args;
       if ($env{'form.popup'}) {
           $args->{'no_nav_bar'} = 1;
       } else {
           $args = undef;
       }
       $r->print(&Apache::loncommon::start_page($title,$jscript,$args));
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.userupdate)",         ({href=>"javascript:backPage(document.userupdate)",
          text=>$breadcrumb_text{'search'},           text=>$breadcrumb_text{'search'},
Line 1592  sub update_user_data { Line 1739  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 @usertools = ('aboutme','blog','portfolio');
     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 1651  sub update_user_data { Line 1799  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);
           if ($uhome ne 'no_host') {
               if ($env{'form.customquota'} == 1) {
                   if ($env{'form.portfolioquota'} eq '') {
                       $newcustom{'quota'} = 0;
                   } else {
                       $newcustom{'quota'} = $env{'form.portfolioquota'};
                       $newcustom{'quota'} =~ s/[^\d\.]//g;
                   }
                   $changed{'quota'} = &quota_admin($newcustom{'quota'},\%changeHash);
               }
               foreach my $item (@usertools) {
                   if ($env{'form.custom'.$item} == 1) {
                       $newcustom{$item} = $env{'form.tools_'.$item};
                       $changed{$item} = &tool_admin($item,$newcustom{$item},\%changeHash);
                   }
               }
               if (keys(%changed)) {
                   $changeHash{'firstname'}  = $env{'form.cfirstname'};
                   $changeHash{'middlename'} = $env{'form.cmiddlename'};
                   $changeHash{'lastname'}   = $env{'form.clastname'};
                   $changeHash{'generation'} = $env{'form.cgeneration'};
                   $changeHash{'id'}         = $env{'form.cid'};
                   $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
                   my $chgresult =
                        &Apache::lonnet::put('environment',\%changeHash,
                                             $env{'form.ccdomain'},$env{'form.ccuname'});
               } 
           }
         $r->print('<br />'.&mt('Home server').': '.$uhome.' '.          $r->print('<br />'.&mt('Home server').': '.$uhome.' '.
                   &Apache::lonnet::hostname($uhome));                    &Apache::lonnet::hostname($uhome));
     } elsif (($env{'form.login'} ne 'nochange') &&      } elsif (($env{'form.login'} ne 'nochange') &&
Line 1682  sub update_user_data { Line 1859  sub update_user_data {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation',              ('environment',['firstname','middlename','lastname','generation',
              'id','permanentemail','portfolioquota','inststatus'],               'id','permanentemail','portfolioquota','inststatus','tools.aboutme',
                'tools.blog','tools.portfolio'],
               $env{'form.ccdomain'},$env{'form.ccuname'});                $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
Line 1773  sub update_user_data { Line 1951  sub update_user_data {
                 $env{'form.c'.$item} = $userenv{$item};                  $env{'form.c'.$item} = $userenv{$item};
             }              }
         }          }
         # Check to see if we can change the ID/student number          # Check to see if we can change the Student/Employee ID
         my $forceid = $env{'form.forceid'};          my $forceid = $env{'form.forceid'};
         my $recurseid = $env{'form.recurseid'};          my $recurseid = $env{'form.recurseid'};
         my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);          my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
Line 1784  sub update_user_data { Line 1962  sub update_user_data {
             (!$forceid)) {              (!$forceid)) {
             if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {              if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                 $env{'form.cid'} = $userenv{'id'};                  $env{'form.cid'} = $userenv{'id'};
                 $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').'<br />'.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').'<br />'."\n";                          $no_forceid_alert = &mt('New Student/Employee ID does not match existing ID for this user.')
                                      .'<br />'
                                      .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")
                                      .'<br />'."\n";
             }              }
         }          }
         if ($env{'form.cid'} ne $userenv{'id'}) {          if ($env{'form.cid'} ne $userenv{'id'}) {
Line 1804  sub update_user_data { Line 1985  sub update_user_data {
         }          }
         my ($quotachanged,$oldportfolioquota,$newportfolioquota,          my ($quotachanged,$oldportfolioquota,$newportfolioquota,
             $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,              $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,
             $newdefquotatext);              $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext);
         my ($defquota,$settingstatus) =           my ($defquota,$settingstatus) = 
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);              &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
         my $showquota;          my ($showquota,$showtools);
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $showquota = 1;              $showquota = 1;
         }          }
         my %changeHash;          if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
               $showtools = 1;
           }
           my (%changeHash,%changed);
         $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};          $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
         if ($userenv{'portfolioquota'} ne '') {          if ($userenv{'portfolioquota'} ne '') {
             $oldportfolioquota = $userenv{'portfolioquota'};              $oldportfolioquota = $userenv{'portfolioquota'};
Line 1823  sub update_user_data { Line 2007  sub update_user_data {
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newportfolioquota =~ s/[^\d\.]//g;
                 }                  }
                 if ($newportfolioquota != $oldportfolioquota) {                  if ($newportfolioquota != $oldportfolioquota) {
                     $quotachanged = &quota_admin($newportfolioquota,\%changeHash);                      $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
                 }                  }
             } else {              } else {
                 $quotachanged = &quota_admin('',\%changeHash);                  $changed{'quota'} = &quota_admin('',\%changeHash);
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $newisdefault = 1;                   $newisdefault = 1; 
             }              }
Line 1840  sub update_user_data { Line 2024  sub update_user_data {
                     $newportfolioquota = $env{'form.portfolioquota'};                      $newportfolioquota = $env{'form.portfolioquota'};
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newportfolioquota =~ s/[^\d\.]//g;
                 }                  }
                 $quotachanged = &quota_admin($newportfolioquota,\%changeHash);                  $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
             } else {              } else {
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $newisdefault = 1;                  $newisdefault = 1;
Line 1852  sub update_user_data { Line 2036  sub update_user_data {
         if ($newisdefault) {          if ($newisdefault) {
             $newdefquotatext = &get_defaultquota_text($settingstatus);              $newdefquotatext = &get_defaultquota_text($settingstatus);
         }          }
           
           foreach my $tool (@usertools) {
               if ($userenv{'tools.'.$tool} ne '') {
                   $oldaccess{$tool} = &mt('custom');
                   if ($userenv{'tools_'.$tool}) {
                       $oldaccesstext{$tool} = &mt("availability set to 'on'");
                   } else {
                       $oldaccesstext{$tool} = &mt("availability set to 'off'");
                   }
                   $changeHash{'tools.'.$tool} = $userenv{'tools.'.$tool};
                   if ($env{'form.custom'.$tool} == 1) {
                       if ($env{'form.tools_'.$tool} ne $userenv{'tools.'.$tool}) {
                           $changed{$tool} = &tool_admin($tool,$env{'form.tools_'.$tool},
                                                         \%changeHash);
                           if ($changed{$tool}) {
                               $newaccess{$tool} = &mt('custom');
                               if ($env{'form.tools_'.$tool}) { 
                                   $newaccesstext{$tool} = &mt("availability set to 'on'");
                               } else {
                                   $newaccesstext{$tool} = &mt("availability set to 'off'");
                               }
                           } else {
                               $newaccess{$tool} = $oldaccess{$tool};
                               if ($userenv{'tools.'.$tool}) {
                                   $newaccesstext{$tool} = &mt("availability set to 'on'");
                               } else {
                                   $newaccesstext{$tool} = &mt("availability set to 'off'");
                               }
                           }
                       } else {
                           $newaccess{$tool} = $oldaccess{$tool};
                           $newaccesstext{$tool} = $oldaccesstext{$tool};
                       }
                   } else {
                       $changed{$tool} = &tool_admin($tool,'',\%changeHash);
                       print STDERR "for $tool - changed is $changed{$tool}\n";
                       if ($changed{$tool}) {
                           $newaccess{$tool} = &mt('default');
                       } else {
                           $newaccess{$tool} = $oldaccess{$tool};
                           if ($userenv{'tools.'.$tool}) {
                                $newaccesstext{$tool} = &mt("availability set to 'on'");
                           } else {
                                $newaccesstext{$tool} = &mt("availability set to 'off'");
                           }
                       }
                   }
               } else {
                   $oldaccess{$tool} = &mt('default');
                   if ($env{'form.custom'.$tool} == 1) {
                       $changed{$tool} = &tool_admin($tool,$env{'form.tools_'.$tool},
                                                     \%changeHash);
                       if ($changed{$tool}) {
                           $newaccess{$tool} = &mt('custom');
                           if ($env{'form.tools_'.$tool}) {
                               $newaccesstext{$tool} = &mt("availability set to 'on'");
                           } else {
                               $newaccesstext{$tool} = &mt("availability set to 'off'");
                           }
                       } else {
                           $newaccess{$tool} = $oldaccess{$tool};
                       }
                   } else {
                       $newaccess{$tool} = $oldaccess{$tool};
                   }
               }
           }
   
         if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||          if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
             $env{'form.cmiddlename'} ne $userenv{'middlename'} ||              $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
             $env{'form.clastname'}   ne $userenv{'lastname'}   ||              $env{'form.clastname'}   ne $userenv{'lastname'}   ||
Line 1860  sub update_user_data { Line 2112  sub update_user_data {
             $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {              $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {
             $namechanged = 1;              $namechanged = 1;
         }          }
         if ($namechanged || $quotachanged) {          if (($namechanged) || (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'};
             $changeHash{'generation'} = $env{'form.cgeneration'};              $changeHash{'generation'} = $env{'form.cgeneration'};
             $changeHash{'id'}         = $env{'form.cid'};              $changeHash{'id'}         = $env{'form.cid'};
             $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};              $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
             my ($quotachgresult,$namechgresult);              my ($chgresult,$namechgresult);
             if ($quotachanged) {              if (keys(%changed) > 0) {
                 $quotachgresult =                   $chgresult = 
                     &Apache::lonnet::put('environment',\%changeHash,                      &Apache::lonnet::put('environment',\%changeHash,
                                   $env{'form.ccdomain'},$env{'form.ccuname'});                                    $env{'form.ccdomain'},$env{'form.ccuname'});
                   if ($chgresult eq 'ok') {
                       if (($env{'user.name'} eq $env{'form.ccuname'}) &&
                           ($env{'user.domain'} eq $env{'form.ccdomain'})) {
                           my %newenvhash;
                           foreach my $key (keys(%changed)) {
                               if ($key ne 'quota') {
                                   $newenvhash{'environment.tools.'.$key} = 
                                       $changeHash{'tools.'.$key};
                                   $newenvhash{'environment.availabletools.'.$key} =
                                       $changeHash{'tools.'.$key};
                               }
                           }
                           &Apache::lonnet::appenv(\%newenvhash);
                       }
                   }
             }              }
             if ($namechanged) {              if ($namechanged) {
             # Make the change              # Make the change
Line 1890  sub update_user_data { Line 2157  sub update_user_data {
                              );                               );
             }              }
             if (($namechanged && $namechgresult eq 'ok') ||               if (($namechanged && $namechgresult eq 'ok') || 
                 ($quotachanged && $quotachgresult eq 'ok')) {                  ((keys(%changed) > 0) && $chgresult eq 'ok')) {
             # Tell the user we changed the name              # Tell the user we changed the name
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                              'uic'  => "User Information Changed",                                            'uic'       => "User Information Changed",             
                              'frst' => "first",                               'frst'      => "First",
                              'mddl' => "middle",                               'mddl'      => "Middle",
                              'lst'  => "last",                               'lst'       => "Last",
      'gen'  => "generation",       'gen'       => "Generation",
                              'id'   => "ID/Student number",                               'id'        => "Student/Employee ID",
                              'mail' => "permanent e-mail",                               'mail'      => "Permanent E-mail",
                              'disk' => "disk space allocated to portfolio files",                               'disk'      => "Disk space allocated to portfolio files",
                              'prvs' => "Previous",                               'blog'      => "Blog Availability",
                              'chto' => "Changed To"                               'aboutme'   => "Home Page Availability",
                                'portfolio' => "Portfolio Availability",
                                'prvs'      => "Previous",
                                'chto'      => "Changed To"
    );     );
                 $r->print('<h4>'.$lt{'uic'}.'</h4>'.                  $r->print('<h4>'.$lt{'uic'}.'</h4>'.
                           &Apache::loncommon::start_data_table().                            &Apache::loncommon::start_data_table().
Line 1920  END Line 2190  END
                     $r->print("                      $r->print("
     <th>$lt{'disk'}</th>\n");      <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().                  $r->print(&Apache::loncommon::end_data_table_header_row().
                           &Apache::loncommon::start_data_table_row());                            &Apache::loncommon::start_data_table_row());
                 $r->print(<<"END");                  $r->print(<<"END");
Line 1935  END Line 2211  END
                     $r->print("                      $r->print("
     <td>$oldportfolioquota Mb $olddefquotatext </td>\n");      <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().                  $r->print(&Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::start_data_table_row());                            &Apache::loncommon::start_data_table_row());
                 $r->print(<<"END");                  $r->print(<<"END");
     <td><b>$lt{'chto'}</b></td>      <td><span class="LC_nobreak"><b>$lt{'chto'}</b></span></td>
     <td>$env{'form.cfirstname'}  </td>      <td>$env{'form.cfirstname'}  </td>
     <td>$env{'form.cmiddlename'} </td>      <td>$env{'form.cmiddlename'} </td>
     <td>$env{'form.clastname'}   </td>      <td>$env{'form.clastname'}   </td>
Line 1950  END Line 2232  END
                     $r->print("                      $r->print("
     <td>$newportfolioquota Mb $newdefquotatext </td>\n");      <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().                  $r->print(&Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::end_data_table().'<br />');                            &Apache::loncommon::end_data_table().'<br />');
                 if ($env{'form.cid'} ne $userenv{'id'}) {                  if ($env{'form.cid'} ne $userenv{'id'}) {
Line 1970  END Line 2258  END
                     foreach my $key (keys(%changeHash)) {                      foreach my $key (keys(%changeHash)) {
                         $newenvhash{'environment.'.$key} = $changeHash{$key};                          $newenvhash{'environment.'.$key} = $changeHash{$key};
                     }                      }
                     &Apache::lonnet::appenv(%newenvhash);                      &Apache::lonnet::appenv(\%newenvhash);
                 }                  }
             } else { # error occurred              } else { # error occurred
                 $r->print('<span class="LC_error">'.&mt('Unable to successfully change environment for').' '.                  $r->print('<span class="LC_error">'.&mt('Unable to successfully change environment for').' '.
Line 1978  END Line 2266  END
                       $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 or quota but we can              # They did not want to change the users name, quota or tool availability,
             # still tell them what the name and quota are               # but we can still tell them what the name and quota and availabilities are  
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                            'id'   => "ID/Student number",                             'id'        => "Student/Employee ID",
                            'mail' => "Permanent e-mail",                             'mail'      => "Permanent e-mail",
                            'disk' => "Disk space allocated to user's portfolio files",                             'disk'      => "Disk space allocated to user's portfolio files",
                              'blog'      => "Blog Availability",
                              'aboutme'   => "Home Page Availability",
                              'portfolio' => "Portfolio Availability",
        );         );
             $r->print(<<"END");              $r->print(<<"END");
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
Line 1992  END Line 2283  END
                 $r->print('<br />['.$lt{'mail'}.': '.                  $r->print('<br />['.$lt{'mail'}.': '.
                           $userenv{'permanentemail'}.']');                            $userenv{'permanentemail'}.']');
             }              }
               if ($showtools) {
                   foreach my $item (@usertools) {
                       $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                                 $newaccesstext{$item}.']'."\n");
                   }
               }
             if ($showquota) {              if ($showquota) {
                 $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.                   $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.
                           $olddefquotatext.']');                            $olddefquotatext.']');
             }              }
             $r->print('</h4>');              $r->print('</h4>');
Line 2024  END Line 2321  END
             $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.              $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.
                       &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');                        &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');
         }          }
         $r->print($no_forceid_alert.          $r->print('<span class="LC_warning">'
                   &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules));                    .$no_forceid_alert
                     .&Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules)
                     .'</span>');
     }      }
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser);          &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);
           $r->print('<p><a href="javascript:backPage(document.userupdate)">'.
                     &mt('Enroll Another Student').'</a></p>');
     } else {      } else {
         my $rolechanges = &update_roles($r);          my @rolechanges = &update_roles($r,$context);
         if (!$rolechanges && $namechanged) {          if ($namechanged) {
             if ($context eq 'course') {              if ($context eq 'course') {
                 if (@userroles > 0) {                  if (@userroles > 0) {
                     if (grep(/^st$/,@userroles)) {                      if ((@rolechanges == 0) || 
                         my $classlistupdated =                          (!(grep(/^st$/,@rolechanges)))) {
                             &Apache::lonuserutils::update_classlist($cdom,                          if (grep(/^st$/,@userroles)) {
                               my $classlistupdated =
                                   &Apache::lonuserutils::update_classlist($cdom,
                                               $cnum,$env{'form.ccdomain'},                                                $cnum,$env{'form.ccdomain'},
                                        $env{'form.ccuname'},\%userupdate);                                         $env{'form.ccuname'},\%userupdate);
                           }
                     }                      }
                 }                  }
             }              }
         }          }
           my $userinfo = &Apache::loncommon::plainname($env{'form.ccuname'},
                                                        $env{'form.ccdomain'});
           if ($env{'form.popup'}) {
               $r->print('<p><a href="javascript:window.close()">'.&mt('Close window').'</a></p>');
           } else {
               $r->print('<p><a href="javascript:backPage(document.userupdate,'."'$env{'form.prevphase'}','modify'".')">'
                        .&mt('Modify this user: [_1]','<span class="LC_cusr_emph">'.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')</span>').'</a>'
                        .('&nbsp;'x5).'<a href="javascript:backPage(document.userupdate)">'
                        .&mt('Create/Modify Another User').'</a></p>');
           }
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub update_roles {  sub update_roles {
     my ($r) = @_;      my ($r,$context) = @_;
     my $now=time;      my $now=time;
     my $rolechanges = 0;      my @rolechanges;
     my %disallowed;      my %disallowed;
     $r->print('<h3>'.&mt('Modifying Roles').'</h3>');      $r->print('<h3>'.&mt('Modifying Roles').'</h3>');
     foreach my $key (keys (%env)) {      foreach my $key (keys (%env)) {
Line 2064  sub update_roles { Line 2378  sub update_roles {
  my $result =   my $result =
     &Apache::lonnet::revokerole($env{'form.ccdomain'},      &Apache::lonnet::revokerole($env{'form.ccdomain'},
  $env{'form.ccuname'},   $env{'form.ccuname'},
  $scope,$role);   $scope,$role,'','',$context);
         $r->print(&mt('Revoking [_1] in [_2]: [_3]',          $r->print(&mt('Revoking [_1] in [_2]: [_3]',
       $role,$scope,'<b>'.$result.'</b>').'<br />');        $role,$scope,'<b>'.$result.'</b>').'<br />');
  if ($role eq 'st') {   if ($role eq 'st') {
Line 2074  sub update_roles { Line 2388  sub update_roles {
     $now);      $now);
     $r->print($result);      $r->print($result);
  }   }
                   if (!grep(/^\Q$role\E$/,@rolechanges)) {
                       push(@rolechanges,$role);
                   }
     }      }
     if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {      if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {
 # Revoke custom role  # Revoke custom role
  $r->print(&mt('Revoking custom role:').   $r->print(&mt('Revoking custom role:').
                       ' '.$4.' by '.$3.':'.$2.' in '.$1.': <b>'.                        ' '.$4.' by '.$3.':'.$2.' in '.$1.': <b>'.
                       &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},                        &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
   $env{'form.ccuname'},$1,$2,$3,$4).    $env{'form.ccuname'},$1,$2,$3,$4,'','',$context).
  '</b><br />');   '</b><br />');
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
     }      }
             $rolechanges ++;  
  } elsif ($key=~/^form\.del/) {   } elsif ($key=~/^form\.del/) {
     if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {      if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
 # Delete standard role  # Delete standard role
Line 2091  sub update_roles { Line 2410  sub update_roles {
  my $result =   my $result =
     &Apache::lonnet::assignrole($env{'form.ccdomain'},      &Apache::lonnet::assignrole($env{'form.ccdomain'},
  $env{'form.ccuname'},   $env{'form.ccuname'},
  $scope,$role,$now,0,1);   $scope,$role,$now,0,1,'',
                                                   $context);
         $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,          $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
       '<b>'.$result.'</b>').'<br />');        '<b>'.$result.'</b>').'<br />');
  if ($role eq 'st') {   if ($role eq 'st') {
Line 2101  sub update_roles { Line 2421  sub update_roles {
     $now);      $now);
     $r->print($result);      $r->print($result);
  }   }
                   if (!grep(/^\Q$role\E$/,@rolechanges)) {
                       push(@rolechanges,$role);
                   }
             }              }
     if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {      if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                 my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);                  my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
Line 2109  sub update_roles { Line 2432  sub update_roles {
                       $rolename,$rnam,$rdom,$url).': <b>'.                        $rolename,$rnam,$rdom,$url).': <b>'.
                       &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},                        &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
                          $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,                           $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
                          0,1).'</b><br />');                           0,1,$context).'</b><br />');
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
             }              }
             $rolechanges ++;  
  } elsif ($key=~/^form\.ren/) {   } elsif ($key=~/^form\.ren/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
Line 2139  sub update_roles { Line 2464  sub update_roles {
                     }                      }
                 } else {                  } else {
     my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},      my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                $env{'form.ccuname'},$url,$role,0,$now);                                 $env{'form.ccuname'},$url,$role,0,$now,'','',
     $output = &mt('Re-enabling [_1] in [_2]: <b>[_3]</b>',                                 $context);
       $role,$url,$result).'<br />';      $output = &mt('Re-enabling [_1] in [_2]: [_3]',
         $role,$url,'<b>'.$result.'</b>').'<br />';
  }   }
                 $r->print($output);                  $r->print($output);
                   if (!grep(/^\Q$role\E$/,@rolechanges)) {
                       push(@rolechanges,$role);
                   }
     }      }
 # Re-enable custom role  # Re-enable custom role
     if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {      if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                 my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);                  my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
                 my $result = &Apache::lonnet::assigncustomrole(                  my $result = &Apache::lonnet::assigncustomrole(
                                $env{'form.ccdomain'}, $env{'form.ccuname'},                                 $env{'form.ccdomain'}, $env{'form.ccuname'},
                                $url,$rdom,$rnam,$rolename,0,$now);                                 $url,$rdom,$rnam,$rolename,0,$now,undef,$context);
                 $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',                  $r->print(&mt('Re-enabling custom role [_1] by [_2]:[_3] in [_4] : [_5]',
                           $rolename,$rnam,$rdom,$url,$result).'<br />');                            $rolename,$rnam,$rdom,$url,'<b>'.$result.'</b>').'<br />');
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
             }              }
             $rolechanges ++;  
  } elsif ($key=~/^form\.act/) {   } elsif ($key=~/^form\.act/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
Line 2175  sub update_roles { Line 2506  sub update_roles {
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);                  my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));                      $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end,$context));
                 } else {                  } else {
     my %curr_groups =      my %curr_groups =
  &Apache::longroup::coursegroups($one,$two);   &Apache::longroup::coursegroups($one,$two);
Line 2186  sub update_roles { Line 2517  sub update_roles {
                             next;                              next;
                         }                          }
                         my $securl = $url.'/'.$sec;                          my $securl = $url.'/'.$sec;
         $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));          $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end,$context));
                     }                      }
                 }                  }
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
     } elsif ($key=~/^form\.act\_($match_domain)\_($match_name)\_([^\_]+)$/) {      } elsif ($key=~/^form\.act\_($match_domain)\_($match_name)\_([^\_]+)$/) {
  # Activate roles for sections with 3 id numbers   # Activate roles for sections with 3 id numbers
  # set start, end times, and the url for the class   # set start, end times, and the url for the class
Line 2205  sub update_roles { Line 2539  sub update_roles {
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context));
                 } else {                  } else {
                     my %curr_groups =                       my %curr_groups = 
  &Apache::longroup::coursegroups($one,$two);   &Apache::longroup::coursegroups($one,$two);
Line 2219  sub update_roles { Line 2553  sub update_roles {
                                 next;                                  next;
                             }                              }
                             my $securl = $url.'/'.$sec;                              my $securl = $url.'/'.$sec;
                             $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec,$context));
                         } else {                          } else {
                             $emptysec = 1;                              $emptysec = 1;
                         }                          }
                     }                      }
                     if ($emptysec) {                      if ($emptysec) {
                         $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));                          $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context));
                     }                      }
                 }                   }
                   if (!grep(/^\Q$three\E$/,@rolechanges)) {
                       push(@rolechanges,$three);
                   }
     } elsif ($key=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {      } elsif ($key=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
  # Activate roles for sections with two id numbers   # Activate roles for sections with two id numbers
  # set start, end times, and the url for the class   # set start, end times, and the url for the class
Line 2237  sub update_roles { Line 2574  sub update_roles {
  my $end   = ( $env{'form.end_'.$1.'_'.$2} ?    my $end   = ( $env{'form.end_'.$1.'_'.$2} ? 
       $env{'form.end_'.$1.'_'.$2} :        $env{'form.end_'.$1.'_'.$2} :
       0 );        0 );
  my $url='/'.$1.'/';                  my $one = $1;
                   my $two = $2;
    my $url='/'.$one.'/';
                 # split multiple sections                  # split multiple sections
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two},\%sections,$two);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context));
                 } else {                  } else {
                     my $emptysec = 0;                      my $emptysec = 0;
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                         if ($sec ne '') {                          if ($sec ne '') {
                             my $securl = $url.'/'.$sec;                              my $securl = $url.'/'.$sec;
                             $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec,$context));
                         } else {                          } else {
                             $emptysec = 1;                              $emptysec = 1;
                         }                          }
                     }                      }
                     if ($emptysec) {                      if ($emptysec) {
                         $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                          $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context));
                     }                      }
                 }                  }
                   if (!grep(/^\Q$two\E$/,@rolechanges)) {
                       push(@rolechanges,$two);
                   }
     } else {      } else {
  $r->print('<p><span class="LC_error">'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$key.'</tt></span></p><br />');   $r->print('<p><span class="LC_error">'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$key.'</tt></span></p><br />');
             }              }
Line 2268  sub update_roles { Line 2610  sub update_roles {
                 }                  }
                 $r->print(' '.&mt('Please <a href="javascript:history.go(-1)">go back</a> and choose a different section name.').'</p><br />');                  $r->print(' '.&mt('Please <a href="javascript:history.go(-1)">go back</a> and choose a different section name.').'</p><br />');
             }              }
             $rolechanges ++;  
  }   }
     } # End of foreach (keys(%env))      } # End of foreach (keys(%env))
 # Flush the course logs so reverse user roles immediately updated  # Flush the course logs so reverse user roles immediately updated
     &Apache::lonnet::flushcourselogs();      &Apache::lonnet::flushcourselogs();
     if (!$rolechanges) {      if (@rolechanges == 0) {
         $r->print(&mt('No roles to modify'));          $r->print(&mt('No roles to modify'));
     }      }
     return $rolechanges;      return @rolechanges;
 }  }
   
 sub enroll_single_student {  sub enroll_single_student {
     my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_;      my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_;
     $r->print('<h3>'.&mt('Enrolling Student').'</h3>');      $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
   
     # Remove non alphanumeric values from section      # Remove non alphanumeric values from section
Line 2295  sub enroll_single_student { Line 2636  sub enroll_single_student {
             $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'},              $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'},
             $env{'form.cmiddlename'},$env{'form.clastname'},              $env{'form.cmiddlename'},$env{'form.clastname'},
             $env{'form.generation'},$env{'form.sections'},$enddate,              $env{'form.generation'},$env{'form.sections'},$enddate,
             $startdate,'manual',undef,$env{'request.course.id'});              $startdate,'manual',undef,$env{'request.course.id'},'',$context);
     if ($enroll_result =~ /^ok/) {      if ($enroll_result =~ /^ok/) {
         $r->print(&mt('<b>[_1]</b> enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'}));          $r->print(&mt('<b>[_1]</b> enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'}));
         if ($env{'form.sections'} ne '') {          if ($env{'form.sections'} ne '') {
Line 2369  sub quota_admin { Line 2710  sub quota_admin {
     my $quotachanged;      my $quotachanged;
     if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {      if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
         # Current user has quota modification privileges          # Current user has quota modification privileges
         $quotachanged = 1;          if (ref($changeHash) eq 'HASH') {
         $changeHash->{'portfolioquota'} = $setquota;              $quotachanged = 1;
               $changeHash->{'portfolioquota'} = $setquota;
           }
     }      }
     return $quotachanged;      return $quotachanged;
 }  }
   
   sub tool_admin {
       my ($tool,$settool,$changeHash) = @_;
       my $toolchanged;
       if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
           # Current user has quota modification privileges
           if (ref($changeHash) eq 'HASH') {
               $toolchanged = 1;
               $changeHash->{'tools.'.$tool} = $settool;
           }
       }
       return $toolchanged;
   }
   
 sub build_roles {  sub build_roles {
     my ($sectionstr,$sections,$role) = @_;      my ($sectionstr,$sections,$role) = @_;
     my $num_sections = 0;      my $num_sections = 0;
Line 2484  sub custom_role_editor { Line 2840  sub custom_role_editor {
     my @template_roles = ("cc","in","ta","ep","st");      my @template_roles = ("cc","in","ta","ep","st");
     foreach my $role (@template_roles) {      foreach my $role (@template_roles) {
         $head_script .= &make_script_template($role);          $head_script .= &make_script_template($role);
         $button_code .= &make_button_code($role);          $button_code .= &make_button_code($role).' ';
     }      }
     $head_script .= "\n".$jsback."\n".'</script>'."\n";      $head_script .= "\n".$jsback."\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));
Line 2504  sub custom_role_editor { Line 2860  sub custom_role_editor {
     'crl'  => "Course Level",      'crl'  => "Course Level",
                     'dml'  => "Domain Level",                      'dml'  => "Domain Level",
                     'ssl'  => "System Level");                      'ssl'  => "System Level");
     $r->print('Select a Template<br />');  
     $r->print('<form action="">');      $r->print('<div>'
     $r->print($button_code);               .'<form action=""><fieldset>'
     $r->print('</form>');               .'<legend>'.&mt('Select a Template').'</legend>'
                .$button_code
                .'</fieldset></form>'
                .'</div>'
       );
   
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form name="form1" method="post">  <form name="form1" method="post">
 <input type="hidden" name="phase" value="set_custom_roles" />  <input type="hidden" name="phase" value="set_custom_roles" />
Line 2567  sub make_script_template { Line 2928  sub make_script_template {
         my ($priv_item, $dummy) = split(/\&/,$priv);          my ($priv_item, $dummy) = split(/\&/,$priv);
         $role_c{$priv_item} = 1;          $role_c{$priv_item} = 1;
     }      }
       my %role_d;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_d{$priv_item} = 1;
       }
       my %role_s;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_s{$priv_item} = 1;
       }
     foreach my $priv_item (keys(%full_c)) {      foreach my $priv_item (keys(%full_c)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_c{$priv})) {          if ((exists($role_c{$priv})) || (exists($role_d{$priv})) || 
               (exists($role_s{$priv}))) {
             $return_script .= "document.form1.$priv"."_c.checked = true;\n";              $return_script .= "document.form1.$priv"."_c.checked = true;\n";
         } else {          } else {
             $return_script .= "document.form1.$priv"."_c.checked = false;\n";              $return_script .= "document.form1.$priv"."_c.checked = false;\n";
         }          }
     }      }
     my %role_d;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_d{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_d)) {      foreach my $priv_item (keys(%full_d)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_d{$priv})) {          if ((exists($role_d{$priv})) || (exists($role_s{$priv}))) {
             $return_script .= "document.form1.$priv"."_d.checked = true;\n";              $return_script .= "document.form1.$priv"."_d.checked = true;\n";
         } else {          } else {
             $return_script .= "document.form1.$priv"."_d.checked = false;\n";              $return_script .= "document.form1.$priv"."_d.checked = false;\n";
         }          }
     }      }
     my %role_s;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_s{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_s)) {      foreach my $priv_item (keys(%full_s)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_s{$priv})) {          if (exists($role_s{$priv})) {
Line 2610  sub make_script_template { Line 2972  sub make_script_template {
 sub make_button_code {  sub make_button_code {
     my ($role) = @_;      my ($role) = @_;
     my $label = &Apache::lonnet::plaintext($role);      my $label = &Apache::lonnet::plaintext($role);
     my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';          my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';
     return ($button_code);      return ($button_code);
 }  }
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my ($r) = @_;      my ($r,$context) = @_;
     my $rolename=$env{'form.rolename'};      my $rolename=$env{'form.rolename'};
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
     if (!$rolename) {      if (!$rolename) {
Line 2690  sub set_custom_role { Line 3052  sub set_custom_role {
  $url,   $url,
  $env{'user.domain'},   $env{'user.domain'},
  $env{'user.name'},   $env{'user.name'},
  $rolename));   $rolename,undef,undef,undef,$context));
     }      }
     $r->print('<p><a href="javascript:backPage(document.customresult,'."'pickrole'".')">'.&mt('Create or edit another custom role').'</a></p><form name="customresult" method="post">');      $r->print('<p><a href="javascript:backPage(document.customresult,'."'pickrole'".')">'.&mt('Create or edit another custom role').'</a></p><form name="customresult" method="post">');
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'</form>');      $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'</form>');
Line 2714  sub handler { Line 3076  sub handler {
         $context = 'domain';          $context = 'domain';
     }      }
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['action','state','callingform','roletype','showrole','bulkaction']);          ['action','state','callingform','roletype','showrole','bulkaction','popup','phase',
            'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($env{'form.action'} ne 'dateselect') {      if ($env{'form.action'} ne 'dateselect') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
Line 2771  sub handler { Line 3134  sub handler {
  foreach my $item (@search) {   foreach my $item (@search) {
     $srch->{$item} = $env{'form.'.$item};      $srch->{$item} = $env{'form.'.$item};
  }   }
   
         if (($phase eq 'get_user_info') || ($phase eq 'userpicked') ||          if (($phase eq 'get_user_info') || ($phase eq 'userpicked') ||
             ($phase eq 'createnewuser')) {              ($phase eq 'createnewuser')) {
             if ($env{'form.phase'} eq 'createnewuser') {              if ($env{'form.phase'} eq 'createnewuser') {
Line 2794  sub handler { Line 3156  sub handler {
                     $currstate = $env{'form.currstate'};                      $currstate = $env{'form.currstate'};
                 }                  }
                 if ($currstate eq 'select') {                  if ($currstate eq 'select') {
                     my $operation;   
                     if ($env{'form.action'} eq 'singleuser') {  
                         $operation = 'createuser';  
                     } elsif ($env{'form.action'} eq 'singlestudent') {  
                         $operation = 'enrollstudent';  
                     }  
                     &print_user_selection_page($r,$response,$srch,$results,                      &print_user_selection_page($r,$response,$srch,$results,
                                                $operation,\@search,$context);                                                 \@search,$context);
                 } 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 2823  sub handler { Line 3179  sub handler {
                 } 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'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,                      &print_username_entry_form($r,$context,$response,$srch,
                                                $forcenewuser);                                                 $forcenewuser);
                 }                  }
Line 2839  sub handler { Line 3196  sub handler {
         }          }
     } 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') {
             &set_custom_role($r);              &set_custom_role($r,$context);
         } else {          } else {
             &custom_role_editor($r);              &custom_role_editor($r);
         }          }
Line 2923  sub handler { Line 3280  sub handler {
                      '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'.                        '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'. 
                      &Apache::loncommon::end_page());                       &Apache::loncommon::end_page());
         }          }
       } elsif ($env{'form.action'} eq 'selfenroll') {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=selfenroll',
                 text=>"Configure Self-enrollment"});
           if (!exists($env{'form.state'})) {
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Configure Self-enrollment',
                                                             'Course_Self_Enrollment'));
               $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
               &print_selfenroll_menu($r,$context,$permission);
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=selfenroll',
                 text=>"Result"});
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enrollment result',
                                                             'Course_Self_Enrollment'));
               $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
               &update_selfenroll_config($r,$context,$permission);
           }
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'changelogs') {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=changelogs',
                 text=>"User Management Logs"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Changes',
                                                         'Course_User_Logs'));
               &print_userchangelogs_display($r,$context,$permission);
           $r->print(&Apache::loncommon::end_page());        
     } else {      } else {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
Line 2979  sub print_main_menu { Line 3365  sub print_main_menu {
                                    listusers => 'Display Co-authors and Manage Multiple Users',                                     listusers => 'Display Co-authors and Manage Multiple Users',
                                  },                                   },
                        course => {                         course => {
                                    upload => 'Upload a File of Course Users',                                     upload => 'File of Course Users',
                                    singleuser => 'Add/Modify a Single Course User',                                     singleuser => 'Single Course User',
                                    listusers => 'Display Class Lists and Manage Multiple Users',                                     listusers => 'Course User Lists',
                                  },                                   },
                      );                       );
     my @menu =    my @menu = ( {categorytitle => 'Add Users',
         (       items =>
           { text => $links{$context}{'upload'},       [{
             help => 'Course_Create_Class_List',           linktext => $links{$context}{'upload'},
             action => 'upload',           icon => 'sctr.png',
             permission => $permission->{'cusr'},           #help => 'Course_Create_Class_List',
             },           url => '/adm/createuser?action=upload',
           { text => $links{$context}{'singleuser'},            permission => $permission->{'cusr'},
             help => 'Course_Change_Privileges',           linktitle => 'Upload a CSV or a text file containing users.',
             action => 'singleuser',       },
             permission => $permission->{'cusr'},       {
             },           linktext => $links{$context}{'singleuser'},
           { text => $links{$context}{'listusers'},           icon => 'edit-redo.png',
             help => 'Course_View_Class_List',           #help => 'Course_Change_Privileges',
             action => 'listusers',           url => '/adm/createuser?action=singleuser',
             permission => ($permission->{'view'} || $permission->{'cusr'}),           permission => $permission->{'cusr'},
           },           linktitle => 'Add a user with a certain role to this course.',
         );       }]},
     if ($context eq 'domain' || $context eq 'course') {       {categorytitle => 'Administration',
         my $customlink =  { text => 'Edit Custom Roles',       items =>
                             help => 'Course_Editing_Custom_Roles',       [{
                             action => 'custom',           linktext => $links{$context}{'listusers'},
                             permission => $permission->{'custom'},                   icon => 'edit-find.png',
                           };                   #help => 'Course_View_Class_List',
         push(@menu,$customlink);                   url => '/adm/createuser?action=listusers',
     }           permission => ($permission->{'view'} || $permission->{'cusr'}),
     if ($context eq 'course') {           linktitle => 'Show and manage users of this course.',
         my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();       }]},
         my @courselinks =       {categorytitle => 'Configuration',
             (       items =>
               { text => 'Enroll a Single Student',       [
                  help => 'Course_Add_Student',       ]},
                  action => 'singlestudent',     );
                  permission => $permission->{'cusr'},  
                  },      if ($context eq 'domain'){
               { text => 'Drop Students',  
                 help => 'Course_Drop_Student',   push(@{ $menu[1]->{items} },
                 action => 'drop',   { linktext => 'Custom Roles',
                 permission => $permission->{'cusr'},   icon => 'emblem-photos.png',
               });   #help => 'Course_Editing_Custom_Roles',
         if (!exists($permission->{'cusr_section'})) {   url => '/adm/createuser?action=custom',
             push(@courselinks,   permission => $permission->{'custom'},
                { text => 'Automated Student Enrollment Manager',   linktitle => 'Configure a custom role.',
                  permission => (&Apache::lonnet::auto_run($cnum,$cdom)   });
                                 && $permission->{'cusr'}),  
                  url  => '/adm/populate',      }elsif ($context eq 'course'){
                  });      my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
         }  
         push(@courselinks,          push(@{ $menu[0]->{items} },
                { text => 'Manage Course Groups',   { linktext => 'Single Student',
                  help => 'Course_Manage_Group',              #help => 'Course_Add_Student',
                  permission => $permission->{'grp_manage'},   icon => 'list-add.png',
                  url => '/adm/coursegroups?refpage=cusr',              url => '/adm/createuser?action=singlestudent',
                });   permission => $permission->{'cusr'},
         push(@menu,@courselinks);              linktitle => 'Add a user with the role student to this course.',
     }          });
     my $menu_html = '';  
     foreach my $menu_item (@menu) {          push(@{ $menu[1]->{items} },  
         next if (! $menu_item->{'permission'});   { linktext => 'Drop Students',
         $menu_html.='<p>';   icon => 'edit-undo.png',
         $menu_html.='<font size="+1">';              #help => 'Course_Drop_Student',
         if (exists($menu_item->{'url'})) {              url => '/adm/createuser?action=drop',
             $menu_html.=qq{<a href="$menu_item->{'url'}">};   permission => $permission->{'cusr'},
         } else {              linktitle =>'Remove a student from this course.',
             $menu_html.=          },
                 qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};   { linktext => 'Custom Roles',
         }   icon => 'emblem-photos.png',
         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';              #help => 'Course_Editing_Custom_Roles',
         if (exists($menu_item->{'help'})) {              url => '/adm/createuser?action=custom',
             $menu_html.=   permission => $permission->{'custom'},
                 &Apache::loncommon::help_open_topic($menu_item->{'help'});   linktitle => 'Configure a custom role.',
         }          });
         $menu_html.='</p>';  
     }          if (!exists($permission->{'cusr_section'})){
     return $menu_html;         
    push(@{ $menu[2]->{items} },
    { 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.',
    },
    { linktext => 'User Self-Enrollment',
    icon => 'cstr.png',
          #help => 'Course_Self_Enrollment',
    url => '/adm/createuser?action=selfenroll',
    permission => $permission->{'cusr'},
    linktitle => 'Configure user self enrollment.',
           });
   
    }
   
    push(@{ $menu[2]->{items} },
    { linktext => 'Course Groups',
    icon => 'conf.png',
           #help => 'Course_Manage_Group',
               url => '/adm/coursegroups?refpage=cusr',
    permission => $permission->{'grp_manage'},
    linktitle => 'Manage course groups.',
           },
           { linktext => 'Change Logs',
    icon => 'document-properties.png',
           #help => 'Course_User_Logs',
           url => '/adm/createuser?action=changelogs',
    permission => $permission->{'cusr'},
    linktitle => 'View change log.',
           });
       };
   return Apache::lonhtmlcommon::generate_menu(@menu);
   #               { text => 'View Log-in History',
   #                 help => 'Course_User_Logins',
   #                 action => 'logins',
   #                 permission => $permission->{'cusr'},
   #               });
 }  }
   
 sub restore_prev_selections {  sub restore_prev_selections {
Line 3072  sub restore_prev_selections { Line 3499  sub restore_prev_selections {
  \%saveable_parameters);   \%saveable_parameters);
 }  }
   
   sub print_selfenroll_menu {
       my ($r,$context,$permission) = @_;
       my $formname = 'enrollstudent';
       my $nolink = 1;
       my ($row,$lt) = &get_selfenroll_titles();
       my $groupslist = &Apache::lonuserutils::get_groupslist();
       my $setsec_js = 
           &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
       my %alerts = &Apache::lonlocal::texthash(
           acto => 'Activation of self-enrollment was selected for the following domain(s)',
           butn => 'but no user types have been checked.',
           wilf => "Please uncheck 'activate' or check at least one type.",
       );
       my $selfenroll_js = <<"ENDSCRIPT";
   function update_types(caller,num) {
       var delidx = getIndexByName('selfenroll_delete');
       var actidx = getIndexByName('selfenroll_activate');
       if (caller == 'selfenroll_all') {
           var selall;
           for (var i=0; i<document.$formname.selfenroll_all.length; i++) {
               if (document.$formname.selfenroll_all[i].checked) {
                   selall = document.$formname.selfenroll_all[i].value;
               }
           }
           if (selall == 1) {
               if (delidx != -1) {
                   if (document.$formname.selfenroll_delete.length) {
                       for (var j=0; j<document.$formname.selfenroll_delete.length; j++) {
                           document.$formname.selfenroll_delete[j].checked = true;
                       }
                   } else {
                       document.$formname.elements[delidx].checked = true;
                   }
               }
               if (actidx != -1) {
                   if (document.$formname.selfenroll_activate.length) {
                       for (var j=0; j<document.$formname.selfenroll_activate.length; j++) {
                           document.$formname.selfenroll_activate[j].checked = false;
                       }
                   } else {
                       document.$formname.elements[actidx].checked = false;
                   }
               }
               document.$formname.selfenroll_newdom.selectedIndex = 0; 
           }
       }
       if (caller == 'selfenroll_activate') {
           if (document.$formname.selfenroll_activate.length) {
               for (var j=0; j<document.$formname.selfenroll_activate.length; j++) {
                   if (document.$formname.selfenroll_activate[j].value == num) {
                       if (document.$formname.selfenroll_activate[j].checked) {
                           for (var i=0; i<document.$formname.selfenroll_all.length; i++) {
                               if (document.$formname.selfenroll_all[i].value == '1') {
                                   document.$formname.selfenroll_all[i].checked = false;
                               }
                               if (document.$formname.selfenroll_all[i].value == '0') {
                                   document.$formname.selfenroll_all[i].checked = true;
                               }
                           }
                       }
                   }
               }
           } else {
               for (var i=0; i<document.$formname.selfenroll_all.length; i++) {
                   if (document.$formname.selfenroll_all[i].value == '1') {
                       document.$formname.selfenroll_all[i].checked = false;
                   }
                   if (document.$formname.selfenroll_all[i].value == '0') {
                       document.$formname.selfenroll_all[i].checked = true;
                   }
               }
           }
       }
       if (caller == 'selfenroll_delete') {
           if (document.$formname.selfenroll_delete.length) {
               for (var j=0; j<document.$formname.selfenroll_delete.length; j++) {
                   if (document.$formname.selfenroll_delete[j].value == num) {
                       if (document.$formname.selfenroll_delete[j].checked) {
                           var delindex = getIndexByName('selfenroll_types_'+num);
                           if (delindex != -1) { 
                               if (document.$formname.elements[delindex].length) {
                                   for (var k=0; k<document.$formname.elements[delindex].length; k++) {
                                       document.$formname.elements[delindex][k].checked = false;
                                   }
                               } else {
                                   document.$formname.elements[delindex].checked = false;
                               }
                           }
                       }
                   }
               }
           } else {
               if (document.$formname.selfenroll_delete.checked) {
                   var delindex = getIndexByName('selfenroll_types_'+num);
                   if (delindex != -1) {
                       if (document.$formname.elements[delindex].length) {
                           for (var k=0; k<document.$formname.elements[delindex].length; k++) {
                               document.$formname.elements[delindex][k].checked = false;
                           }
                       } else {
                           document.$formname.elements[delindex].checked = false;
                       }
                   }
               }
           }
       }
       return;
   }
   
   function validate_types(form) {
       var needaction = new Array();
       var countfail = 0;
       var actidx = getIndexByName('selfenroll_activate');
       if (actidx != -1) {
           if (document.$formname.selfenroll_activate.length) {
               for (var j=0; j<document.$formname.selfenroll_activate.length; j++) {
                   var num = document.$formname.selfenroll_activate[j].value;
                   if (document.$formname.selfenroll_activate[j].checked) {
                       countfail = check_types(num,countfail,needaction)
                   }
               }
           } else {
               if (document.$formname.selfenroll_activate.checked) {
                   var num = document.enrollstudent.selfenroll_activate.value;
                   countfail = check_types(num,countfail,needaction)
               }
           }
       }
       if (countfail > 0) {
           var msg = "$alerts{'acto'}\\n";
           var loopend = needaction.length -1;
           if (loopend > 0) {
               for (var m=0; m<loopend; m++) {
                   msg += needaction[m]+", ";
               }
           }
           msg += needaction[loopend]+"\\n$alerts{'butn'}\\n$alerts{'wilf'}";
           alert(msg);
           return; 
       }
       setSections(form);
   }
   
   function check_types(num,countfail,needaction) {
       var typeidx = getIndexByName('selfenroll_types_'+num);
       var count = 0;
       if (typeidx != -1) {
           if (document.$formname.elements[typeidx].length) {
               for (var k=0; k<document.$formname.elements[typeidx].length; k++) {
                   if (document.$formname.elements[typeidx][k].checked) {
                       count ++;
                   }
               }
           } else {
               if (document.$formname.elements[typeidx].checked) {
                   count ++;
               }
           }
           if (count == 0) {
               var domidx = getIndexByName('selfenroll_dom_'+num);
               if (domidx != -1) {
                   var domname = document.$formname.elements[domidx].value;
                   needaction[countfail] = domname;
                   countfail ++;
               }
           }
       }
       return countfail;
   }
   
   function getIndexByName(item) {
       for (var i=0;i<document.$formname.elements.length;i++) {
           if (document.$formname.elements[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   ENDSCRIPT
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   
       my $output = '<script type="text/javascript">'."\n".
                    $setsec_js."\n".$selfenroll_js."\n".
                    '</script>'."\n".
                    '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n";
       my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
       if (ref($visactions) eq 'HASH') {
           if ($visible) {
               $output .= '<p>'.$visactions->{'vis'}.'</p>';
           } else {
               $output .= $visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
                          '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};
               if (ref($vismsgs) eq 'ARRAY') {
                   $output .= '<br />'.$visactions->{'make'}.'<ul>';
                   foreach my $item (@{$vismsgs}) {
                       $output .= '<li>'.$visactions->{$item}.'</li>';
                   }
                   $output .= '</ul>';
               }
               $output .= '</p>';
           }
       }
       $output .= '<form name="'.$formname.'" method="post" action="/adm/createuser">'."\n".
                  &Apache::lonhtmlcommon::start_pick_box();
       if (ref($row) eq 'ARRAY') {
           foreach my $item (@{$row}) {
               my $title = $item; 
               if (ref($lt) eq 'HASH') {
                   $title = $lt->{$item};
               }
               $output .= 
                   &Apache::lonhtmlcommon::row_title($title,
                                'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n";
               if ($item eq 'types') {
                   my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'};
                   my $showdomdesc = 1;
                   my $includeempty = 1;
                   my $num = 0;
                   $output .= &Apache::loncommon::start_data_table().
                              &Apache::loncommon::start_data_table_row()
                              .'<td colspan="2"><span class="LC_nobreak"><label>'
                              .&mt('Any user in any domain:')
                              .'&nbsp;<input type="radio" name="selfenroll_all" value="1" ';
                   if ($curr_types eq '*') {
                       $output .= ' checked="checked" '; 
                   }
                   $output .= 'onchange="javascript:update_types('.
                              "'selfenroll_all'".');" />'.&mt('Yes').'</label>'.
                              '&nbsp;&nbsp;<input type="radio" name="selfenroll_all" value="0" ';
                   if ($curr_types ne '*') {
                       $output .= ' checked="checked" ';
                   }
                   $output .= ' onchange="javascript:update_types('.
                              "'selfenroll_all'".');"/>'.&mt('No').'</label></td>'.
                              &Apache::loncommon::end_data_table_row().
                              &Apache::loncommon::end_data_table().
                              &mt('Or').'<br />'.
                              &Apache::loncommon::start_data_table();
                   my %currdoms;
                   if ($curr_types eq '') {
                       $output .= &new_selfenroll_dom_row($cdom,'0');
                   } elsif ($curr_types ne '*') {
                       my @entries = split(/;/,$curr_types);
                       if (@entries > 0) {
                           foreach my $entry (@entries) {
                               my ($currdom,$typestr) = split(/:/,$entry);
                               $currdoms{$currdom} = 1;
                               my $domdesc = &Apache::lonnet::domain($currdom);
                               my @currinsttypes = split(',',$typestr);
                               $output .= &Apache::loncommon::start_data_table_row()
                                          .'<td valign="top"><span class="LC_nobreak">'.&mt('Domain:').'<b>'
                                          .'&nbsp;'.$domdesc.' ('.$currdom.')'
                                          .'</b><input type="hidden" name="selfenroll_dom_'.$num
                                          .'" value="'.$currdom.'" /></span><br />'
                                          .'<span class="LC_nobreak"><label><input type="checkbox" '
                                          .'name="selfenroll_delete" value="'.$num.'" onchange="javascript:update_types('."'selfenroll_delete','$num'".');" />'
                                          .&mt('Delete').'</label></span></td>';
                               $output .= '<td valign="top">&nbsp;&nbsp;'.&mt('User types:').'<br />'
                                          .&selfenroll_inst_types($num,$currdom,\@currinsttypes).'</td>'
                                          .&Apache::loncommon::end_data_table_row();
                               $num ++;
                           }
                       }
                   }
                   my $add_domtitle = &mt('Users in additional domain:');
                   if ($curr_types eq '*') { 
                       $add_domtitle = &mt('Users in specific domain:');
                   } elsif ($curr_types eq '') {
                       $add_domtitle = &mt('Users in other domain:');
                   }
                   $output .= &Apache::loncommon::start_data_table_row()
                              .'<td colspan="2"><span class="LC_nobreak">'.$add_domtitle.'</span><br />'
                              .&Apache::loncommon::select_dom_form('','selfenroll_newdom',
                                                                   $includeempty,$showdomdesc)
                              .'<input type="hidden" name="selfenroll_types_total" value="'.$num.'" />'
                              .'</td>'.&Apache::loncommon::end_data_table_row()
                              .&Apache::loncommon::end_data_table();
               } elsif ($item eq 'registered') {
                   my ($regon,$regoff);
                   if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_registered'}) {
                       $regon = ' checked="checked" ';
                       $regoff = ' ';
                   } else {
                       $regon = ' ';
                       $regoff = ' checked="checked" ';
                   }
                   $output .= '<label>'.
                              '<input type="radio" name="selfenroll_registered" value="1"'.$regon.'/>'.
                              &mt('Yes').'</label>&nbsp;&nbsp;<label>'.
                              '<input type="radio" name="selfenroll_registered" value="0"'.$regoff.'/>'.
                              &mt('No').'</label>';
               } elsif ($item eq 'enroll_dates') {
                   my $starttime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_start_date'};
                   my $endtime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_end_date'};
                   if ($starttime eq '') {
                       $starttime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_start_date'};
                   }
                   if ($endtime eq '') {
                       $endtime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_end_date'};
                   }
                   my $startform =
                       &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_start_date',$starttime,
                                         undef,undef,undef,undef,undef,undef,undef,$nolink);
                   my $endform =
                       &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_end_date',$endtime,
                                         undef,undef,undef,undef,undef,undef,undef,$nolink);
                   $output .= &selfenroll_date_forms($startform,$endform);
               } elsif ($item eq 'access_dates') {
                   my $starttime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_start_access'};
                   my $endtime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_end_access'};
                   if ($starttime eq '') {
                       $starttime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_start_date'};
                   }
                   if ($endtime eq '') {
                       $endtime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_end_date'};
                   }
                   my $startform =
                       &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_start_access',$starttime,
                                         undef,undef,undef,undef,undef,undef,undef,$nolink);
                   my $endform =
                       &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_end_access',$endtime,
                                         undef,undef,undef,undef,undef,undef,undef,$nolink);
                   $output .= &selfenroll_date_forms($startform,$endform);
               } elsif ($item eq 'section') {
                   my $currsec = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_section'}; 
                   my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
                   my $newsecval;
                   if ($currsec ne 'none' && $currsec ne '') {
                       if (!defined($sections_count{$currsec})) {
                           $newsecval = $currsec;
                       }
                   }
                   my $sections_select = 
                       &Apache::lonuserutils::course_sections(\%sections_count,'st',$currsec);
                   $output .= '<table class="LC_createuser">'."\n".
                              '<tr class="LC_section_row">'."\n".
                              '<td align="center">'.&mt('Existing sections')."\n".
                              '<br />'.$sections_select.'</td><td align="center">'.
                              &mt('New section').'<br />'."\n".
                              '<input type="text" name="newsec" size="15" value="'.$newsecval.'" />'."\n".
                              '<input type="hidden" name="sections" value="" />'."\n".
                              '<input type="hidden" name="state" value="done" />'."\n".
                              '</td></tr></table>'."\n";
               }
               $output .= &Apache::lonhtmlcommon::row_closure(1);
           }
       }
       $output .= &Apache::lonhtmlcommon::end_pick_box().
                  '<br /><input type="button" name="selfenrollconf" value="'
                  .&mt('Save changes').'" onclick="validate_types(this.form);" />'
                  .'<input type="hidden" name="action" value="selfenroll" /></form>';
       $r->print($output);
       return;
   }
   
   sub visible_in_cat {
       my ($cdom,$cnum) = @_;
       my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
       my ($cathash,%settable,@vismsgs,$cansetvis);
       my %visactions = &Apache::lonlocal::texthash(
                      vis => 'Your course currently appears in the Course 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.',
                      miss => 'Your course does not currently appear in the Course Catalog for this domain.',
                      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.',
                      make => 'Make any changes to self-enrollment settings below, click "Save changes", then take action to include the course in the Catalog:',
                      take => 'Take the following action to ensure the course appears in the Catalog:',
                      dc_unhide  => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',
                      dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',
                      dc_instcode => 'Ask a domain coordinator to assign an institutional code (if this is an official course).',
                      dc_catalog  => 'Ask a domain coordinator to enable or create at least one course category in the domain.',
                      dc_categories => 'Ask a domain coordinator to create a hierarchy of categories and sub categories for courses in the domain.',
                      dc_chgcat => 'Ask a domain coordinator to change the category assigned to the course, as the one currently assigned is no longer used in the domain',
                      dc_addcat => 'Ask a domain coordinator to assign a category to the course.',
       );
       $visactions{'unhide'} = &mt('Use [_1]Set course environment[_2] to change the "Exclude from course catalog" setting.','"<a href="/adm/parmset?action=crsenv">','</a>"');
       $visactions{'chgcat'} = &mt('Use [_1]Set course environment[_2] to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','"<a href="/adm/parmset?action=crsenv">','</a>"');
       $visactions{'addcat'} = &mt('Use [_1]Set course environment[_2] to assign a category to the course.','"<a href="/adm/parmset?action=crsenv">','</a>"');
       if (ref($domconf{'coursecategories'}) eq 'HASH') {
           if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
               $settable{'togglecats'} = 1;
           }
           if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
               $settable{'categorize'} = 1;
           }
           $cathash = $domconf{'coursecategories'}{'cats'};
       }
       if ($settable{'togglecats'} && $settable{'categorize'}) {
           $cansetvis = &mt('You are able to both assign a course category and choose to exclude this course from the catalog.');   
       } elsif ($settable{'togglecats'}) {
           $cansetvis = &mt('You are able to choose to exclude this course from the catalog, but only a Domain Coordinator may assign a course category.'); 
       } elsif ($settable{'categorize'}) {
           $cansetvis = &mt('You may assign a course category, but only a Domain Coordinator may choose to exclude this course from the catalog.');  
       } else {
           $cansetvis = &mt('Only a Domain Coordinator may assign a course category or choose to exclude this course from the catalog.'); 
       }
        
       my %currsettings =
           &Apache::lonnet::get('environment',['hidefromcat','categories','internal.coursecode'],
                                $cdom,$cnum);
       my $visible = 0;
       if ($currsettings{'internal.coursecode'} ne '') {
           if (ref($domconf{'coursecategories'}) eq 'HASH') {
               $cathash = $domconf{'coursecategories'}{'cats'};
               if (ref($cathash) eq 'HASH') {
                   if ($cathash->{'instcode::0'} eq '') {
                       push(@vismsgs,'dc_addinst'); 
                   } else {
                       $visible = 1;
                   }
               } else {
                   $visible = 1;
               }
           } else {
               $visible = 1;
           }
       } else {
           if (ref($cathash) eq 'HASH') {
               if ($cathash->{'instcode::0'} ne '') {
                   push(@vismsgs,'dc_instcode');
               }
           } else {
               push(@vismsgs,'dc_instcode');
           }
       }
       if ($currsettings{'categories'} ne '') {
           my $cathash;
           if (ref($domconf{'coursecategories'}) eq 'HASH') {
               $cathash = $domconf{'coursecategories'}{'cats'};
               if (ref($cathash) eq 'HASH') {
                   if (keys(%{$cathash}) == 0) {
                       push(@vismsgs,'dc_catalog');
                   } elsif ((keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} ne '')) {
                       push(@vismsgs,'dc_categories');
                   } else {
                       my @currcategories = split('&',$currsettings{'categories'});
                       my $matched = 0;
                       foreach my $cat (@currcategories) {
                           if ($cathash->{$cat} ne '') {
                               $visible = 1;
                               $matched = 1;
                               last;
                           }
                       }
                       if (!$matched) {
                           if ($settable{'categorize'}) { 
                               push(@vismsgs,'chgcat');
                           } else {
                               push(@vismsgs,'dc_chgcat');
                           }
                       }
                   }
               }
           }
       } else {
           if (ref($cathash) eq 'HASH') {
               if ((keys(%{$cathash}) > 1) || 
                   (keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} eq '')) {
                   if ($settable{'categorize'}) {
                       push(@vismsgs,'addcat');
                   } else {
                       push(@vismsgs,'dc_addcat');
                   }
               }
           }
       }
       if ($currsettings{'hidefromcat'} eq 'yes') {
           $visible = 0;
           if ($settable{'togglecats'}) {
               unshift(@vismsgs,'unhide');
           } else {
               unshift(@vismsgs,'dc_unhide')
           }
       }
       return ($visible,$cansetvis,\@vismsgs,\%visactions);
   }
   
   sub new_selfenroll_dom_row {
       my ($newdom,$num) = @_;
       my $domdesc = &Apache::lonnet::domain($newdom);
       my $output;
       if ($domdesc ne '') {
           $output .= &Apache::loncommon::start_data_table_row()
                      .'<td valign="top"><span class="LC_nobreak">'.&mt('Domain:').'&nbsp;<b>'.$domdesc
                      .' ('.$newdom.')</b><input type="hidden" name="selfenroll_dom_'.$num
                      .'" value="'.$newdom.'" /></span><br />'
                      .'<span class="LC_nobreak"><label><input type="checkbox" '
                      .'name="selfenroll_activate" value="'.$num.'" '
                      .'onchange="javascript:update_types('
                      ."'selfenroll_activate','$num'".');" />'
                      .&mt('Activate').'</label></span></td>';
           my @currinsttypes;
           $output .= '<td>'.&mt('User types:').'<br />'
                      .&selfenroll_inst_types($num,$newdom,\@currinsttypes).'</td>'
                      .&Apache::loncommon::end_data_table_row();
       }
       return $output;
   }
   
   sub selfenroll_inst_types {
       my ($num,$currdom,$currinsttypes) = @_;
       my $output;
       my $numinrow = 4;
       my $count = 0;
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($currdom);
       my $othervalue = 'any';
       if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
           if (keys(%{$usertypes}) > 0) {
               $othervalue = 'other';
           }
           $output .= '<table><tr>';
           foreach my $type (@{$types}) {
               if (($count > 0) && ($count%$numinrow == 0)) {
                   $output .= '</tr><tr>';
               }
               if (defined($usertypes->{$type})) {
                   my $esc_type = &escape($type);
                   $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.
                              $esc_type.'" ';
                   if (ref($currinsttypes) eq 'ARRAY') {
                       if (@{$currinsttypes} > 0) {
                           if (grep(/^any$/,@{$currinsttypes})) {
                               $output .= 'checked="checked"';
                           } elsif (grep(/^\Q$esc_type\E$/,@{$currinsttypes})) {
                               $output .= 'checked="checked"';
                           }
                       } else {
                           $output .= 'checked="checked"';
                       }
                   }
                   $output .= ' name="selfenroll_types_'.$num.'" />'.$usertypes->{$type}.'</label></span></td>';
               }
               $count ++;
           }
           if (($count > 0) && ($count%$numinrow == 0)) {
               $output .= '</tr><tr>';
           }
           $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.$othervalue.'"';
           if (ref($currinsttypes) eq 'ARRAY') {
               if (@{$currinsttypes} > 0) {
                   if (grep(/^any$/,@{$currinsttypes})) { 
                       $output .= ' checked="checked"';
                   } elsif ($othervalue eq 'other') {
                       if (grep(/^\Q$othervalue\E$/,@{$currinsttypes})) {
                           $output .= ' checked="checked"';
                       }
                   }
               } else {
                   $output .= ' checked="checked"';
               }
           } else {
               $output .= ' checked="checked"';
           }
           $output .= ' name="selfenroll_types_'.$num.'" />'.$othertitle.'</label></span></td></tr></table>';
       }
       return $output;
   }
   
   sub selfenroll_date_forms {
       my ($startform,$endform) = @_;
       my $output .= &Apache::lonhtmlcommon::start_pick_box()."\n".
                     &Apache::lonhtmlcommon::row_title(&mt('Start date'),
                                                       'LC_oddrow_value')."\n".
                     $startform."\n".
                     &Apache::lonhtmlcommon::row_closure(1).
                     &Apache::lonhtmlcommon::row_title(&mt('End date'),
                                                      'LC_oddrow_value')."\n".
                     $endform."\n".
                     &Apache::lonhtmlcommon::row_closure(1).
                     &Apache::lonhtmlcommon::end_pick_box();
       return $output;
   }
   
   sub print_userchangelogs_display {
       my ($r,$context,$permission) = @_;
       my $formname = 'roleslog';
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
       if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
   
       $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">');
       my %saveable_parameters = ('show' => 'scalar',);
       &Apache::loncommon::store_course_settings('roles_log',
                                                 \%saveable_parameters);
       &Apache::loncommon::restore_course_settings('roles_log',
                                                   \%saveable_parameters);
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago 
       my %defaults = (
                        page               => '1',
                        show               => '10',
                        role               => 'any',
                        chgcontext         => 'any',
                        rolelog_start_date => $defstart,
                        rolelog_end_date   => $now,
                      );
       my $more_records = 0;
   
       # set current
       my %curr;
       foreach my $item ('show','page','role','chgcontext') {
           $curr{$item} = $env{'form.'.$item};
       }
       my ($startdate,$enddate) = 
           &Apache::lonuserutils::get_dates_from_form('rolelog_start_date','rolelog_end_date');
       $curr{'rolelog_start_date'} = $startdate;
       $curr{'rolelog_end_date'} = $enddate;
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my (%whodunit,%changed,$version);
       ($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);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) { 
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) {
           next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) ||
                    ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'}));
           if ($curr{'show'} ne &mt('all')) {
               if ($count >= $curr{'page'} * $curr{'show'}) {
                   $more_records = 1;
                   last;
               }
           }
           if ($curr{'role'} ne 'any') {
               next if ($roleslog{$id}{'logentry'}{'role'} ne $curr{'role'}); 
           }
           if ($curr{'chgcontext'} ne 'any') {
               if ($curr{'chgcontext'} eq 'selfenroll') {
                   next if (!$roleslog{$id}{'logentry'}{'selfenroll'});
               } else {
                   next if ($roleslog{$id}{'logentry'}{'context'} ne $curr{'chgcontext'});
               }
           }
           $count ++;
           next if ($count < $minshown);
           if (!$showntablehdr) {
               $r->print($tablehdr);
               $showntablehdr = 1;
           }
           if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {
               $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =
                   &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});
           }
           if ($changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}} eq '') {
               $changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}} =
                   &Apache::loncommon::plainname($roleslog{$id}{'uname'},$roleslog{$id}{'udom'});
           }
           my $sec = $roleslog{$id}{'logentry'}{'section'};
           if ($sec eq '') {
               $sec = &mt('None');
           }
           my ($rolestart,$roleend);
           if ($roleslog{$id}{'delflag'}) {
               $rolestart = &mt('deleted');
               $roleend = &mt('deleted');
           } else {
               $rolestart = $roleslog{$id}{'logentry'}{'start'};
               $roleend = $roleslog{$id}{'logentry'}{'end'};
               if ($rolestart eq '' || $rolestart == 0) {
                   $rolestart = &mt('No start date'); 
               } else {
                   $rolestart = &Apache::lonlocal::locallocaltime($rolestart);
               }
               if ($roleend eq '' || $roleend == 0) { 
                   $roleend = &mt('No end date');
               } else {
                   $roleend = &Apache::lonlocal::locallocaltime($roleend);
               }
           }
           my $chgcontext = $roleslog{$id}{'logentry'}{'context'};
           if ($roleslog{$id}{'logentry'}{'selfenroll'}) {
               $chgcontext = 'selfenroll';
           }
           my %lt = &rolechg_contexts();
           if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
               $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");
       }
       if ($showntablehdr) {
           $r->print(&Apache::loncommon::end_data_table().'<br />');
           if (($curr{'page'} > 1) || ($more_records)) {
               $r->print('<table><tr>');
               if ($curr{'page'} > 1) {
                   $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
               }
               if ($more_records) {
                   $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
               }
               $r->print('</tr></table>');
               $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit(); 
       return;
   }
   </script>
   ENDSCRIPT
           }
       } else {
           $r->print(&mt('There are no records to display'));
       }
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
                 '<input type="hidden" name="action" value="changelogs" /></form>');
       return;
   }
   
   sub role_display_filter {
       my ($formname,$cdom,$cnum,$curr,$version) = @_;
       my $context = 'course';
       my $nolink = 1;
       my $output = '<table><tr><td valign="top">'.
                    '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b><br />'.
                    &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
                                                 (&mt('all'),5,10,20,50,100,1000,10000)).
                    '</td><td>&nbsp;&nbsp;</td>';
       my $startform =
           &Apache::lonhtmlcommon::date_setter($formname,'rolelog_start_date',
                                               $curr->{'rolelog_start_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my $endform =
           &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',
                                               $curr->{'rolelog_end_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my %lt = &rolechg_contexts();
       $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br /><table><tr><td>'.&mt('After:').
                  '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.
                  $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>'.
                  '<td valign="top"><b>'.&mt('Role:').'</b><br />'.
                  '<select name="role"><option value="any"';
       if ($curr->{'role'} eq 'any') {
           $output .= ' selected="selected"';
       }
       $output .=  '>'.&mt('Any').'</option>'."\n";
       my @roles = &Apache::lonuserutils::course_roles($context,undef,1);
       foreach my $role (@roles) {
           my $plrole;
           if ($role eq 'cr') {
               $plrole = &mt('Custom Role');
           } else {
               $plrole=&Apache::lonnet::plaintext($role);
           }
           my $selstr = '';
           if ($role eq $curr->{'role'}) {
               $selstr = ' selected="selected"';
           }
           $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';
       }
       $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.
                  &mt('Context:').'</b><br /><select name="chgcontext">';
       foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll') {
           my $selstr = '';
           if ($curr->{'chgcontext'} eq $chgtype) {
               $output .= $selstr = ' selected="selected"';
           }
           if (($chgtype eq 'auto') || ($chgtype eq 'updatenow')) {
               next if (!&Apache::lonnet::auto_run($cnum,$cdom));
           }
           $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";
       }
       $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.
                  &mt('Update Display').'" /></tr></table>'.
                  '<span class="LC_roleslog_note">'.
                  &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.6.99.0 or later are displayed.');
       if ($version) {
           $output .= ' '.&mt('This server is version [_3].','<b>','</b>',$version);    }
       $output .= '</span><hr noshade><br />';
       return $output;
   }
   
   sub rolechg_contexts {
       my %lt = &Apache::lonlocal::texthash (
                                                any          => 'Any',
                                                auto         => 'Automated enrollment',
                                                updatenow    => 'Roster Update',
                                                createcourse => 'Course Creation',
                                                course       => 'User Management in course',
                                                domain       => 'User Management in domain',
                                                selfenroll   => 'Self-enrolled', 
                                            );
       return %lt;
   }
   
 #-------------------------------------------------- functions for &phase_two  #-------------------------------------------------- functions for &phase_two
 sub user_search_result {  sub user_search_result {
     my ($context,$srch) = @_;      my ($context,$srch) = @_;
Line 3104  sub user_search_result { Line 4340  sub user_search_result {
     if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') ||      if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') ||
         ($srch->{'srchin'} eq 'alc')) {          ($srch->{'srchin'} eq 'alc')) {
         if ($srch->{'srchby'} eq 'uname') {          if ($srch->{'srchby'} eq 'uname') {
             if ($srch->{'srchterm'} !~ /^$match_username$/) {              my $unamecheck = $srch->{'srchterm'};
               if ($srch->{'srchtype'} eq 'contains') {
                   if ($unamecheck !~ /^\w/) {
                       $unamecheck = 'a'.$unamecheck; 
                   }
               }
               if ($unamecheck !~ /^$match_username$/) {
                 $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');                  $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
             }              }
         }          }
Line 3313  sub directorysrch_check { Line 4555  sub directorysrch_check {
                 my ($insttypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($srch->{'srchdomain'});                  my ($insttypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($srch->{'srchdomain'});
                 my @longtypes;                   my @longtypes; 
                 foreach my $item (@usertypes) {                  foreach my $item (@usertypes) {
                     push (@longtypes,$insttypes->{$item});                      if (defined($insttypes->{$item})) { 
                           push (@longtypes,$insttypes->{$item});
                       } elsif ($item eq 'default') {
                           push (@longtypes,&mt('other')); 
                       }
                 }                  }
                 my $insttype_str = join(', ',@longtypes);                   my $insttype_str = join(', ',@longtypes); 
                 return &mt('Institutional directory search in domain: [_1] is not available to your user type: ',$showdom).$insttype_str;                  return &mt('Institutional directory search in domain: [_1] is not available to your user type: ',$showdom).$insttype_str;
             }               }
         } else {          } else {
             $can_search = 1;              $can_search = 1;
         }          }
Line 3438  sub build_search_response { Line 4684  sub build_search_response {
                     &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);                      &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);
                 if ($cancreate) {                  if ($cancreate) {
                     my $showdom = &display_domain_info($env{'request.role.domain'});                       my $showdom = &display_domain_info($env{'request.role.domain'}); 
                 $response .= '<br /><br />'.&mt("<b>To add a new user</b> (you can only create new users in your current role's domain - <span class=\"LC_cusr_emph\">[_1]</span>):",$env{'request.role.domain'}).'<ul><li>'.&mt("Set 'Domain/institution to search' to: <span class=\"LC_cusr_emph\">[_1]</span>",$showdom).'<li>'.&mt("Set 'Search criteria' to: <span class=\"LC_cusr_emph\">'username is ...... in selected LON-CAPA domain'").'</span></li><li>'.&mt('Provide the proposed username').'</li><li>'.&mt('Search').'</li></ul><br />';                      $response .= '<br /><br />'
                                   .'<b>'.&mt('To add a new user:').'</b>'
                                   .'<br />'
                                   .&mt("(You can only create new users in your current role's domain - [_1])"
                                       ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')
                                   .'<ul><li>'
                                   .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>')
                                   .'</li><li>'
                                   .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>')
                                   .'</li><li>'
                                   .&mt('Provide the proposed username')
                                   .'</li><li>'
                                   .&mt("Click 'Search'")
                                   .'</li></ul><br />';
                 } else {                  } else {
                     my $helplink = ' href="javascript:helpMenu('."'display'".')"';                      my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                     $response .= '<br /><br />'.&mt("You are not authorized to create new users in your current role's domain - <span class=\"LC_cusr_emph\">[_1]</span>.",$env{'request.role.domain'}).'<br />'.&mt('Contact the <a[_1]>helpdesk</a> if you need to create a new user.',$helplink).'<br /><br />';                      $response .= '<br /><br />'
                                   .&mt("You are not authorized to create new users in your current role's domain - [_1]."
                                       ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')
                                   .'<br />'
                                   .&mt('Contact the [_1]helpdesk[_2] if you need to create a new user.'
                                       ,' <a'.$helplink.'>'
                                       ,'</a>')
                                   .'<br /><br />';
                 }                  }
             }              }
         }          }
Line 3674  sub course_level_dc { Line 4940  sub course_level_dc {
                      '<td>&nbsp;&nbsp;</td>'.                       '<td>&nbsp;&nbsp;</td>'.
                      '<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="sections" value="" />'.                       '<input type="hidden" name="section" value="" />'.
                      '<input type="hidden" name="groups" value="" /></td>'.                       '<input type="hidden" name="groups" value="" /></td>'.
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;
Line 3690  ENDTIMEENTRY Line 4956  ENDTIMEENTRY
     return $cb_jscript.$header.$hiddenitems.$otheritems;      return $cb_jscript.$header.$hiddenitems.$otheritems;
 }  }
   
   sub update_selfenroll_config {
       my ($r,$context,$permission) = @_;
       my ($row,$lt) = &get_selfenroll_titles();
       my %curr_groups = &Apache::longroup::coursegroups();
       my (%changes,%warning);
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $curr_types;
       if (ref($row) eq 'ARRAY') {
           foreach my $item (@{$row}) {
               if ($item eq 'enroll_dates') {
                   my (%currenrolldate,%newenrolldate);
                   foreach my $type ('start','end') {
                       $currenrolldate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_date'};
                       $newenrolldate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_date');
                       if ($newenrolldate{$type} ne $currenrolldate{$type}) {
                           $changes{'internal.selfenroll_'.$type.'_date'} = $newenrolldate{$type};
                       }
                   }
               } elsif ($item eq 'access_dates') {
                   my (%currdate,%newdate);
                   foreach my $type ('start','end') {
                       $currdate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_access'};
                       $newdate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_access');
                       if ($newdate{$type} ne $currdate{$type}) {
                           $changes{'internal.selfenroll_'.$type.'_access'} = $newdate{$type};
                       }
                   }
               } elsif ($item eq 'types') {
                   $curr_types =
                       $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item};
                   if ($env{'form.selfenroll_all'}) {
                       if ($curr_types ne '*') {
                           $changes{'internal.selfenroll_types'} = '*';
                       } else {
                           next;
                       }
                   } else {
                       my %currdoms;
                       my @entries = split(/;/,$curr_types);
                       my @deletedoms = &Apache::loncommon::get_env_multiple('form.selfenroll_delete');
                       my @activations = &Apache::loncommon::get_env_multiple('form.selfenroll_activate');
                       my $newnum = 0;
                       my @latesttypes;
                       foreach my $num (@activations) {
                           my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$num);
                           if (@types > 0) {
                               @types = sort(@types);
                               my $typestr = join(',',@types);
                               my $typedom = $env{'form.selfenroll_dom_'.$num};
                               $latesttypes[$newnum] = $typedom.':'.$typestr;
                               $currdoms{$typedom} = 1;
                               $newnum ++;
                           }
                       }
                       for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {                        if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {
                               my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);
                               if (@types > 0) {
                                   @types = sort(@types);
                                   my $typestr = join(',',@types);
                                   my $typedom = $env{'form.selfenroll_dom_'.$j};
                                   $latesttypes[$newnum] = $typedom.':'.$typestr;
                                   $currdoms{$typedom} = 1;
                                   $newnum ++;
                               }
                           }
                       }
                       if ($env{'form.selfenroll_newdom'} ne '') {
                           my $typedom = $env{'form.selfenroll_newdom'};
                           if ((!defined($currdoms{$typedom})) && 
                               (&Apache::lonnet::domain($typedom) ne '')) {
                               my $typestr;
                               my ($othertitle,$usertypes,$types) = 
                                   &Apache::loncommon::sorted_inst_types($typedom);
                               my $othervalue = 'any';
                               if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
                                   if (@{$types} > 0) {
                                       my @esc_types = map { &escape($_); } @{$types};
                                       $othervalue = 'other';
                                       $typestr = join(',',(@esc_types,$othervalue));
                                   }
                                   $typestr = $othervalue;
                               } else {
                                   $typestr = $othervalue;
                               } 
                               $latesttypes[$newnum] = $typedom.':'.$typestr;
                               $newnum ++ ;
                           }
                       }
                       my $selfenroll_types = join(';',@latesttypes);
                       if ($selfenroll_types ne $curr_types) {
                           $changes{'internal.selfenroll_types'} = $selfenroll_types;
                       }
                   }
               } else {
                   my $curr_val = 
                       $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item};
                   my $newval = $env{'form.selfenroll_'.$item};
                   if ($item eq 'section') {
                       $newval = $env{'form.sections'};
                       if (defined($curr_groups{$newval})) {
                           $newval = $curr_val;
                           $warning{$item} = &mt('Section for self-enrolled users unchanged as the proposed section is a group').'<br />'.&mt('Group names and section names must be distinct');
                       } elsif ($newval eq 'all') {
                           $newval = $curr_val;
                           $warning{$item} = &mt("Section for self-enrolled users unchanged, as 'all' is a reserved section name.");
                       }
                       if ($newval eq '') {
                           $newval = 'none';
                       }
                   }
                   if ($newval ne $curr_val) {
                       $changes{'internal.selfenroll_'.$item} = $newval;
                   }
               }
           }
           if (keys(%warning) > 0) {
               foreach my $item (@{$row}) {
                   if (exists($warning{$item})) {
                       $r->print($warning{$item}.'<br />');
                   }
               } 
           }
           if (keys(%changes) > 0) {
               my $putresult = &Apache::lonnet::put('environment',\%changes,$cdom,$cnum);
               if ($putresult eq 'ok') {
                   if ((exists($changes{'internal.selfenroll_types'})) ||
                       (exists($changes{'internal.selfenroll_start_date'}))  ||
                       (exists($changes{'internal.selfenroll_end_date'}))) {
                       my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',
                                                                   $cnum,undef,undef,'Course');
                       my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
                       if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
                           foreach my $item ('selfenroll_types','selfenroll_start_date','selfenroll_end_date') {
                               if (exists($changes{'internal.'.$item})) {
                                   $crsinfo{$env{'request.course.id'}}{$item} = 
                                       $changes{'internal.'.$item};
                               }
                           }
                           my $crsputresult =
                               &Apache::lonnet::courseidput($cdom,\%crsinfo,
                                                            $chome,'notime');
                       }
                   }
                   $r->print(&mt('The following changes were made to self-enrollment settings:').'<ul>');
                   foreach my $item (@{$row}) {
                       my $title = $item;
                       if (ref($lt) eq 'HASH') {
                           $title = $lt->{$item};
                       }
                       if ($item eq 'enroll_dates') {
                           foreach my $type ('start','end') {
                               if (exists($changes{'internal.selfenroll_'.$type.'_date'})) {
                                   my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_date'});
                                   $r->print('<li>'.&mt('[_1]: "[_2]" set to "[_3]".',
                                             $title,$type,$newdate).'</li>');
                               }
                           }
                       } elsif ($item eq 'access_dates') {
                           foreach my $type ('start','end') {
                               if (exists($changes{'internal.selfenroll_'.$type.'_access'})) {
                                   my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_access'});
                                   $r->print('<li>'.&mt('[_1]: "[_2]" set to "[_3]".',
                                             $title,$type,$newdate).'</li>');
                               }
                           }
                       } else {
                           if (exists($changes{'internal.selfenroll_'.$item})) {
                               my $newval = $changes{'internal.selfenroll_'.$item};
                               if ($item eq 'types') {
                                   if ($newval eq '') {
                                       $newval = &mt('None');
                                   } elsif ($newval eq '*') {
                                       $newval = &mt('Any user in any domain');
                                   }
                               } elsif ($item eq 'registered') {
                                   if ($newval eq '1') {
                                       $newval = &mt('Yes');
                                   } elsif ($newval eq '0') {
                                       $newval = &mt('No');
                                   }
                               }
                               $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval).'</li>'."\n");
                           }
                       }
                   }
                   $r->print('</ul>');
                   my %newenvhash;
                   foreach my $key (keys(%changes)) {
                       $newenvhash{'course.'.$env{'request.course.id'}.'.'.$key} = $changes{$key};
                   }
                   &Apache::lonnet::appenv(\%newenvhash);
               } else {
                   $r->print(&mt('An error occurred when saving changes to self-enrollment settings in this course.').'<br />'.&mt('The error was: [_1].',$putresult));
               }
           } else {
               $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
           }
       } else {
           $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
       }
       my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
       if (ref($visactions) eq 'HASH') {
           if (!$visible) {
               $r->print('<br />'.$visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
                         '<br />');
               if (ref($vismsgs) eq 'ARRAY') {
                   $r->print('<br />'.$visactions->{'take'}.'<ul>');
                   foreach my $item (@{$vismsgs}) {
                       $r->print('<li>'.$visactions->{$item}.'</li>');
                   }
                   $r->print('</ul>');
               }
               $r->print($cansetvis);
           }
       } 
       return;
   }
   
   sub get_selfenroll_titles {
       my @row = ('types','registered','enroll_dates','access_dates','section');
       my %lt = &Apache::lonlocal::texthash (
                   types        => 'Users allowed to self-enroll in this course',
                   registered   => 'Restrict self-enrollment to students officially registered for the course',
                   enroll_dates => 'Dates self-enrollment available',
                   access_dates => 'Course access dates assigned to self-enrolling users',
                   section      => 'Section assigned to self-enrolling users',
                );
       return (\@row,\%lt);
   }
   
 #---------------------------------------------- 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.224  
changed lines
  Added in v.1.270


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