Diff for /loncom/interface/loncreateuser.pm between versions 1.83 and 1.221

version 1.83, 2004/07/02 10:03:44 version 1.221, 2007/12/21 20:34:26
Line 64  use Apache::Constants qw(:common :http); Line 64  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::longroup;
   use Apache::lonuserutils;
   use LONCAPA qw(:DEFAULT :match);
   
 my $loginscript; # piece of javascript used in two separate instances  my $loginscript; # piece of javascript used in two separate instances
 my $generalrule;  
 my $authformnop;  my $authformnop;
 my $authformkrb;  my $authformkrb;
 my $authformint;  my $authformint;
 my $authformfsys;  my $authformfsys;
 my $authformloc;  my $authformloc;
   
 BEGIN {  sub initialize_authen_forms {
     $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;      my ($dom,$curr_authtype,$mode) = @_; 
     my $krbdefdom=$1;      my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/);
     $krbdefdom=~tr/a-z/A-Z/;      $krbdefdom= uc($krbdefdom);
     my %param = ( formname => 'document.cu',      my %param = ( formname => 'document.cu',
                   kerb_def_dom => $krbdefdom                     kerb_def_dom => $krbdefdom,
                   );                    domain => $dom,
                   );
       my %abv_auth = &auth_abbrev();
       if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):$/) {
           my $long_auth = $1;
           my %abv_auth = &auth_abbrev();
           $param{'curr_authtype'} = $abv_auth{$long_auth};
           if ($long_auth =~ /^krb(4|5)$/) {
               $param{'curr_kerb_ver'} = $1;
           }
           if ($mode eq 'modifyuser') {
               $param{'mode'} = $mode;
           }
       }
 # no longer static due to configurable kerberos defaults  # no longer static due to configurable kerberos defaults
 #    $loginscript  = &Apache::loncommon::authform_header(%param);  #    $loginscript  = &Apache::loncommon::authform_header(%param);
     $generalrule  = &Apache::loncommon::authform_authorwarning(%param);  
     $authformnop  = &Apache::loncommon::authform_nochange(%param);      $authformnop  = &Apache::loncommon::authform_nochange(%param);
 # no longer static due to configurable kerberos defaults  # no longer static due to configurable kerberos defaults
 #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
Line 91  BEGIN { Line 105  BEGIN {
     $authformloc  = &Apache::loncommon::authform_local(%param);      $authformloc  = &Apache::loncommon::authform_local(%param);
 }  }
   
   sub auth_abbrev {
       my %abv_auth = (
                        krb4     => 'krb',
                        internal => 'int',
                        localuth => 'loc',
                        unix     => 'fsys',
                      );
       return %abv_auth;
   }
   
 # ======================================================= Existing Custom Roles  # ====================================================
   
 sub my_custom_roles {  sub portfolio_quota {
     my %returnhash=();      my ($ccuname,$ccdomain) = @_;
     my %rolehash=&Apache::lonnet::dump('roles');      my %lt = &Apache::lonlocal::texthash(
     foreach (keys %rolehash) {                     'disk' => "Disk space allocated to user's portfolio files",
  if ($_=~/^rolesdef\_(\w+)$/) {                     'cuqu' => "Current quota",
     $returnhash{$1}=$1;                     'cust' => "Custom quota",
  }                     'defa' => "Default",
                      'chqu' => "Change quota",
       );
       my ($currquota,$quotatype,$inststatus,$defquota) = 
           &Apache::loncommon::get_user_quota($ccuname,$ccdomain);
       my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($ccdomain);
       my ($longinsttype,$showquota,$custom_on,$custom_off,$defaultinfo);
       if ($inststatus ne '') {
           if ($usertypes->{$inststatus} ne '') {
               $longinsttype = $usertypes->{$inststatus};
           }
       }
       $custom_on = ' ';
       $custom_off = ' checked="checked" ';
       my $quota_javascript = <<"END_SCRIPT";
   <script type="text/javascript">
   function quota_changes(caller) {
       if (caller == "custom") {
           if (document.cu.customquota[0].checked) {
               document.cu.portfolioquota.value = "";
           }
       }
       if (caller == "quota") {
           document.cu.customquota[1].checked = true;
     }      }
     return %returnhash;  
 }  }
   </script>
 # ==================================================== Figure out author access  END_SCRIPT
       if ($quotatype eq 'custom') {
 sub authorpriv {          $custom_on = $custom_off;
     my ($auname,$audom)=@_;          $custom_off = ' ';
     if (($auname ne $ENV{'user.name'}) ||          $showquota = $currquota;
         (($audom ne $ENV{'user.domain'}) &&          if ($longinsttype eq '') {
          ($audom ne $ENV{'request.role.domain'}))) { return ''; }              $defaultinfo = &mt('For this user, the default quota would be [_1]
     unless (&Apache::lonnet::allowed('cca',$audom)) { return ''; }                              Mb.',$defquota);
     return 1;          } else {
               $defaultinfo = &mt("For this user, the default quota would be [_1] 
                               Mb, as determined by the user's institutional
                              affiliation ([_2]).",$defquota,$longinsttype);
           }
       } else {
           if ($longinsttype eq '') {
               $defaultinfo = &mt('For this user, the default quota is [_1]
                               Mb.',$defquota);
           } else {
               $defaultinfo = &mt("For this user, the default quota of [_1]
                               Mb, is determined by the user's institutional
                               affiliation ([_2]).",$defquota,$longinsttype);
           }
       }
       my $output = $quota_javascript.
                    '<h3>'.$lt{'disk'}.'</h3>'.
                    &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_row().
                    '<td>'.$lt{'cuqu'}.': '.$currquota.'&nbsp;Mb.&nbsp;&nbsp;'.
                    $defaultinfo.'</td>'.
                    &Apache::loncommon::end_data_table_row().
                    &Apache::loncommon::start_data_table_row().
                    '<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>'.
                    &Apache::loncommon::end_data_table_row().
                    &Apache::loncommon::end_data_table();
       return $output;
 }  }
   
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my $r=shift;      my ($r,$context,$response,$srch,$forcenewuser) = @_;
     my $defdom=$ENV{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my @domains = &Apache::loncommon::get_domains();      my $formtoset = 'crtuser';
     my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');      if (exists($env{'form.startrolename'})) {
     my $bodytag =&Apache::loncommon::bodytag(          $formtoset = 'docustom';
                                   'Create Users, Change User Privileges').          $env{'form.rolename'} = $env{'form.startrolename'};
   &Apache::loncommon::help_open_faq(282).      } elsif ($env{'form.origform'} eq 'crtusername') {
   &Apache::loncommon::help_open_bug('Instructor Interface');          $formtoset =  $env{'form.origform'};
     my $selscript=&Apache::loncommon::studentbrowser_javascript();      }
     my $sellink=&Apache::loncommon::selectstudent_link  
                                         ('crtuser','ccuname','ccdomain');      my ($jsback,$elements) = &crumb_utilities();
     my %existingroles=&my_custom_roles();  
       my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n".
           '<script type="text/javascript">'."\n".
           &Apache::lonhtmlcommon::set_form_elements($elements->{$formtoset}).
           '</script>'."\n";
   
       my %loaditems = (
                   'onload' => "javascript:setFormElements(document.$formtoset)",
                       );
       my $start_page =
    &Apache::loncommon::start_page('User Management',
          $jscript,{'add_entries' => \%loaditems,});
       if ($env{'form.action'} eq 'custom') {
           &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.crtuser)",
               text=>"Pick custom role",});
       } else {
           &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.crtuser)",
               text=>"Single user search",
               faq=>282,bug=>'Instructor Interface',});
       }
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');
       my %existingroles=&Apache::lonuserutils::my_custom_roles();
     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(
     'siur'   => "Set Individual User Roles",                      'srch' => "User Search",
                        or    => "or",
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
                     'usrr' => "User Roles",  
                     '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 $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');      my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
       my $helpsist=&Apache::loncommon::help_open_topic('Course_Add_Student');
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');      my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');
     $r->print(<<"ENDDOCUMENT");      my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');
 <html>      if ($sellink) {
 <head>          $sellink = "$lt{'or'} ".$sellink;
 <title>The LearningOnline Network with CAPA</title>      } 
 $selscript      $r->print($start_page."\n".$crumbs);
 </head>      if ($env{'form.action'} eq 'custom') {
 $bodytag          if (&Apache::lonnet::allowed('mcr','/')) {
 <form action="/adm/createuser" method="post" name="crtuser">              $r->print(<<ENDCUSTOM);
 <input type="hidden" name="phase" value="get_user_info">  
 <h2>$lt{siur}$helpsiur</h2>  
 <table>  
 <tr><td>$lt{usr}:</td><td><input type="text" size="15" name="ccuname">  
 </td><td rowspan="2">$sellink</td></tr><tr><td>  
 $lt{'dom'}:</td><td>$domform</td></tr>  
 </table>  
 <input name="userrole" type="submit" value="$lt{usrr}" />  
 </form>  
 <form action="/adm/createuser" method="post" name="docustom">  <form action="/adm/createuser" method="post" name="docustom">
 <input type="hidden" name="phase" value="selected_custom_edit">  <input type="hidden" name="action" value="$env{'form.action'}" />
 <h2>$lt{'ecrp'}$helpecpr</h2>  <input type="hidden" name="phase" value="selected_custom_edit" />
   <h3>$lt{'ecrp'}$helpecpr</h3>
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />  $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />
 <input name="customeditor" type="submit" value="$lt{'cre'}" />  <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </body>  </form>
 </html>  ENDCUSTOM
 ENDDOCUMENT          }
       } else {
           my $actiontext = $lt{'mod'}.$helpsiur;
           if ($env{'form.action'} eq 'singlestudent') {
               $actiontext = $lt{'enrl'}.$helpsist;
           }
           $r->print("
   <h3>$lt{'srch'} $sellink $actiontext</h3>");
           if ($env{'form.origform'} ne 'crtusername') {
               $r->print("\n".$response);
           }
           $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));
       }
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 # =================================================================== Phase two  sub entry_form {
 sub print_user_modification_page {      my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
     my $r=shift;      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my $ccuname=$ENV{'form.ccuname'};      my $usertype;
     my $ccdomain=$ENV{'form.ccdomain'};      if (ref($srch) eq 'HASH') {
           if (($srch->{'srchin'} eq 'dom') &&
     $ccuname=~s/\W//gs;              ($srch->{'srchby'} eq 'uname') &&
     $ccdomain=~s/\W//gs;              ($srch->{'srchtype'} eq 'exact') &&
               ($srch->{'srchdomain'} ne '') &&
     unless (($ccuname) && ($ccdomain)) {              ($srch->{'srchterm'} ne '')) {
  &print_username_entry_form($r);              my ($rules,$ruleorder) =
         return;                  &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');
               $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules);
           }
     }      }
       my $cancreate =
           &Apache::lonuserutils::can_create_user($dom,$context,$usertype);
       my $userpicker = 
          &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
                                          'document.crtuser',$cancreate,$usertype);
       my $srchbutton = &mt('Search');
       my $output = <<"ENDBLOCK";
   <form action="/adm/createuser" method="post" name="crtuser">
   <input type="hidden" name="action" value="$env{'form.action'}" />
   <input type="hidden" name="phase" value="get_user_info" />
   $userpicker
   <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />
   </form>
   ENDBLOCK
       if ($cancreate && $env{'form.phase'} eq '') {
           my $defdom=$env{'request.role.domain'};
           my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
           my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
           my %lt=&Apache::lonlocal::texthash(
                     'crnu' => 'Create a new user',
                     'usr'  => 'Username',
                     'dom'  => 'in domain',
                     'cra'  => 'Create user',
           );
           $output .= <<"ENDDOCUMENT";
   <form action="/adm/createuser" method="post" name="crtusername">
   <input type="hidden" name="action" value="$env{'form.action'}" />
   <input type="hidden" name="phase" value="createnewuser" />
   <input type="hidden" name="srchtype" value="exact" />
   <input type="hidden" name="srchby" value="username" />
   <input type="hidden" name="srchin" value="dom" />
   <input type="hidden" name="forcenewuser" value="1" />
   <input type="hidden" name="origform" value="crtusername" />
   <h3>$lt{crnu}$helpcrt</h3>
   $responsemsg
   <table>
    <tr>
     <td>$lt{'usr'}:</td>
     <td><input type="text" size="15" name="srchterm" /></td>
     <td>&nbsp;$lt{'dom'}:</td><td>$domform</td>
     <td>&nbsp;<input name="userrole" type="submit" value="$lt{'cra'}" /></td>
    </tr>
   </table>
   </form>
   ENDDOCUMENT
       }
       return $output;
   }
   
     my $defdom=$ENV{'request.role.domain'};  sub user_modification_js {
       my ($pjump_def,$dc_setcourse_code,$nondc_setsection_code,$groupslist)=@_;
     my ($krbdef,$krbdefdom) =      
        &Apache::loncommon::get_kerberos_defaults($defdom);      return <<END;
   
     my %param = ( formname => 'document.cu',  
                   kerb_def_dom => $krbdefdom,  
                   kerb_def_auth => $krbdef  
                   );  
     $loginscript  = &Apache::loncommon::authform_header(%param);  
     $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  
   
     $ccuname=~s/\W//g;  
     $ccdomain=~s/\W//g;  
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();  
     my $dochead =<<"ENDDOCHEAD";  
 <html>  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   
     function pclose() {      function pclose() {
Line 213  sub print_user_modification_page { Line 361  sub print_user_modification_page {
     }      }
   
     $pjump_def      $pjump_def
       $dc_setcourse_code
   
     function dateset() {      function dateset() {
         eval("document.cu."+document.cu.pres_marker.value+          eval("document.cu."+document.cu.pres_marker.value+
Line 220  sub print_user_modification_page { Line 369  sub print_user_modification_page {
         pclose();          pclose();
     }      }
   
       $nondc_setsection_code
   
   </script>
   END
   }
   
   # =================================================================== Phase two
   sub print_user_selection_page {
       my ($r,$response,$srch,$srch_results,$operation,$srcharray,$context) = @_;
       my @fields = ('username','domain','lastname','firstname','permanentemail');
       my $sortby = $env{'form.sortby'};
   
       if (!grep(/^\Q$sortby\E$/,@fields)) {
           $sortby = 'lastname';
       }
   
       my ($jsback,$elements) = &crumb_utilities();
   
       my $jscript = (<<ENDSCRIPT);
   <script type="text/javascript">
   function pickuser(uname,udom) {
       document.usersrchform.seluname.value=uname;
       document.usersrchform.seludom.value=udom;
       document.usersrchform.phase.value="userpicked";
       document.usersrchform.submit();
   }
   
   $jsback
 </script>  </script>
 </head>  ENDSCRIPT
 ENDDOCHEAD  
     $r->print(&Apache::loncommon::bodytag(      my %lt=&Apache::lonlocal::texthash(
                                      'Create Users, Change User Privileges'));                                         'usrch'          => "User Search to add/modify roles",
                                          'stusrch'        => "User Search to enroll student",
                                          'usel'           => "Select a user to add/modify roles",
                                          'stusel'         => "Select a user to enroll as a student", 
                                          'username'       => "username",
                                          'domain'         => "domain",
                                          'lastname'       => "last name",
                                          'firstname'      => "first name",
                                          'permanentemail' => "permanent e-mail",
                                         );
       $r->print(&Apache::loncommon::start_page('User Management',$jscript));
       if ($operation eq 'createuser') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"javascript:backPage(document.usersrchform,'','')",
                 text=>"Create/modify user",
                 faq=>282,bug=>'Instructor Interface',},
                {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
                 text=>"Select User",
                 faq=>282,bug=>'Instructor Interface',});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
           $r->print("<b>$lt{'usrch'}</b><br />");
           $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
           $r->print('<h3>'.$lt{'usel'}.'</h3>');
       } elsif ($operation eq 'enrollstudent') {
           &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($jscript."<b>$lt{'stusrch'}</b><br />");
           $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
           $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
       }
       $r->print('<form name="usersrchform" method="post">'.
                 &Apache::loncommon::start_data_table()."\n".
                 &Apache::loncommon::start_data_table_header_row()."\n".
                 ' <th> </th>'."\n");
       foreach my $field (@fields) {
           $r->print(' <th><a href="javascript:document.usersrchform.sortby.value='.
                     "'".$field."'".';document.usersrchform.submit();">'.
                     $lt{$field}.'</a></th>'."\n");
       }
       $r->print(&Apache::loncommon::end_data_table_header_row());
   
       my @sorted_users = sort {
           lc($srch_results->{$a}->{$sortby})   cmp lc($srch_results->{$b}->{$sortby})
               ||
           lc($srch_results->{$a}->{lastname})  cmp lc($srch_results->{$b}->{lastname})
               ||
           lc($srch_results->{$a}->{firstname}) cmp lc($srch_results->{$b}->{firstname})
       ||
    lc($a) cmp lc($b)
           } (keys(%$srch_results));
   
       foreach my $user (@sorted_users) {
           my ($uname,$udom) = split(/:/,$user);
           $r->print(&Apache::loncommon::start_data_table_row().
                     '<td><input type="button" name="seluser" value="'.&mt('Select').'" onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".')" /></td>'.
                     '<td><tt>'.$uname.'</tt></td>'.
                     '<td><tt>'.$udom.'</tt></td>');
           foreach my $field ('lastname','firstname','permanentemail') {
               $r->print('<td>'.$srch_results->{$user}->{$field}.'</td>');
           }
           $r->print(&Apache::loncommon::end_data_table_row());
       }
       $r->print(&Apache::loncommon::end_data_table().'<br /><br />');
       if (ref($srcharray) eq 'ARRAY') {
           foreach my $item (@{$srcharray}) {
               $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n");
           }
       }
       $r->print(' <input type="hidden" name="sortby" value="'.$sortby.'" />'."\n".
                 ' <input type="hidden" name="seluname" value="" />'."\n".
                 ' <input type="hidden" name="seludom" value="" />'."\n".
                 ' <input type="hidden" name="currstate" value="select" />'."\n".
                 ' <input type="hidden" name="phase" value="get_user_info" />'."\n".
                 ' <input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n");
       $r->print($response.'</form>'.&Apache::loncommon::end_page());
   }
   
   sub print_user_query_page {
       my ($r,$caller) = @_;
   # FIXME - this is for a network-wide name search (similar to catalog search)
   # To use frames with similar behavior to catalog/portfolio search.
   # To be implemented. 
       return;
   }
   
   sub print_user_modification_page {
       my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;
       if (($ccuname eq '') || ($ccdomain eq '')) {
           my $usermsg = &mt('No username and/or domain provided.');
           $env{'form.phase'} = '';
    &print_username_entry_form($r,$context,$usermsg);
           return;
       }
       my ($form,$formname);
       if ($env{'form.action'} eq 'singlestudent') {
           $form = 'document.enrollstudent';
           $formname = 'enrollstudent';
       } else {
           $form = 'document.cu';
           $formname = 'cu';
       }
       my %abv_auth = &auth_abbrev();
       my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser,
           %alerts,%curr_rules,%got_rules);
       my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
       if ($uhome eq 'no_host') {
           my $usertype;
           my ($rules,$ruleorder) =
               &Apache::lonnet::inst_userrules($ccdomain,'username');
               $usertype =
                   &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules);
           my $cancreate =
               &Apache::lonuserutils::can_create_user($ccdomain,$context,
                                                      $usertype);
           if (!$cancreate) {
               my $helplink = ' href="javascript:helpMenu('."'display'".')"';
               my %usertypetext = (
                   official   => 'institutional',
                   unofficial => 'non-institutional',
               );
               my $response;
               if ($env{'form.origform'} eq 'crtusername') {
                   $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).
                               '</span><br />';
               }
               $response .= '<span class="LC_warning">'.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the <a[_1]>helpdesk</a> for assistance.',$helplink).'</span><br /><br />';
               $env{'form.phase'} = '';
               &print_username_entry_form($r,$context,$response);
               return;
           }
           $newuser = 1;
           my $checkhash;
           my $checks = { 'username' => 1 };
           $checkhash->{$ccuname.':'.$ccdomain} = { 'newuser' => $newuser };
           &Apache::loncommon::user_rule_check($checkhash,$checks,
               \%alerts,\%rulematch,\%inst_results,\%curr_rules,\%got_rules);
           if (ref($alerts{'username'}) eq 'HASH') {
               if (ref($alerts{'username'}{$ccdomain}) eq 'HASH') {
                   my $domdesc =
                       &Apache::lonnet::domain($ccdomain,'description');
                   if ($alerts{'username'}{$ccdomain}{$ccuname}) {
                       my $userchkmsg;
                       if (ref($curr_rules{$ccdomain}) eq 'HASH') {  
                           $userchkmsg = 
                               &Apache::loncommon::instrule_disallow_msg('username',
                                                                    $domdesc,1).
                           &Apache::loncommon::user_rule_formats($ccdomain,
                               $domdesc,$curr_rules{$ccdomain}{'username'},
                               'username');
                       }
                       $env{'form.phase'} = '';
                       &print_username_entry_form($r,$context,$userchkmsg);
                       return;
                   }
               }
           }
       } else {
           $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) {
           $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 $dc_setcourse_code = '';
       my $nondc_setsection_code = '';                                        
       my %loaditem;
   
       my $groupslist = &Apache::lonuserutils::get_groupslist();
   
       my $js = &validation_javascript($context,$ccdomain,$pjump_def,
                                  $groupslist,$newuser,$formname,\%loaditem);
       my $start_page = 
    &Apache::loncommon::start_page('User Management',
          $js,{'add_entries' => \%loaditem,});
       my %breadcrumb_text = &singleuser_breadcrumb();
       &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage($form)",
          text=>$breadcrumb_text{'search'},
          faq=>282,bug=>'Instructor Interface',});
   
       if ($env{'form.phase'} eq 'userpicked') {
           &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage($form,'get_user_info','select')",
          text=>$breadcrumb_text{'userpicked'},
          faq=>282,bug=>'Instructor Interface',});
       }
       &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')",
           text=>$breadcrumb_text{'modify'},
           faq=>282,bug=>'Instructor Interface',});
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');
   
     my $forminfo =<<"ENDFORMINFO";      my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="cu">  <form action="/adm/createuser" method="post" name="$formname">
 <input type="hidden" name="phase"       value="update_user_data">  <input type="hidden" name="phase" value="update_user_data" />
 <input type="hidden" name="ccuname"     value="$ccuname">  <input type="hidden" name="ccuname" value="$ccuname" />
 <input type="hidden" name="ccdomain"    value="$ccdomain">  <input type="hidden" name="ccdomain" value="$ccdomain" />
 <input type="hidden" name="pres_value"  value="" >  <input type="hidden" name="pres_value"  value="" />
 <input type="hidden" name="pres_type"   value="" >  <input type="hidden" name="pres_type"   value="" />
 <input type="hidden" name="pres_marker" value="" >  <input type="hidden" name="pres_marker" value="" />
 ENDFORMINFO  ENDFORMINFO
     my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);  
     my %incdomains;   
     my %inccourses;      my %inccourses;
     foreach (values(%Apache::lonnet::hostdom)) {      foreach my $key (keys(%env)) {
        $incdomains{$_}=1;   if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {
     }  
     foreach (keys(%ENV)) {  
  if ($_=~/^user\.priv\.cm\.\/(\w+)\/(\w+)/) {  
     $inccourses{$1.'_'.$2}=1;      $inccourses{$1.'_'.$2}=1;
         }          }
     }      }
     if ($uhome eq 'no_host') {      if ($newuser) {
         my $home_server_list=          my $portfolioform;
             '<option value="default" selected>default</option>'."\n".          if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
                 &Apache::loncommon::home_server_option_list($ccdomain);              # Current user has quota modification privileges
                       $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);
  my %lt=&Apache::lonlocal::texthash(          }
                     'cnu'  => "Create New User",          &initialize_authen_forms($ccdomain);
                     'nu'   => "New User",          my %lt=&Apache::lonlocal::texthash(
                     'id'   => "in domain",                  'cnu'            => 'Create New User',
                     'pd'   => "Personal Data",                  'ast'            => 'as a student',
                     'fn'   => "First Name",                  'ind'            => 'in domain',
                     'mn'   => "Middle Name",                  'lg'             => 'Login Data',
                     'ln'   => "Last Name",                  'hs'             => "Home Server",
                     'gen'  => "Generation",          );
                     'idsn' => "ID/Student Number",   $r->print(<<ENDTITLE);
                     'hs'   => "Home Server",  $start_page
                     'lg'   => "Login Data"  $crumbs
        );  $response
  my $genhelp=&Apache::loncommon::help_open_topic('Generation');  
  $r->print(<<ENDNEWUSER);  
 $dochead  
 <h1>$lt{'cnu'}</h1>  
 $forminfo  $forminfo
 <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>  
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 $loginscript  $loginscript
 </script>  </script>
 <input type='hidden' name='makeuser' value='1' />  <input type='hidden' name='makeuser' value='1' />
 <h3>$lt{'pd'}</h3>  <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain
 <p>  ENDTITLE
 <table>          if ($env{'form.action'} eq 'singlestudent') {
 <tr><td>$lt{'fn'}  </td>              $r->print(' ('.$lt{'ast'}.')');
     <td><input type='text' name='cfirst'  size='15' /></td></tr>          }
 <tr><td>$lt{'mn'} </td>           $r->print('</h2>'."\n".'<div class="LC_left_float">');
     <td><input type='text' name='cmiddle' size='15' /></td></tr>          my $personal_table = 
 <tr><td>$lt{'ln'}   </td>              &personal_data_display($ccuname,$ccdomain,$newuser,$context,
     <td><input type='text' name='clast'   size='15' /></td></tr>                                     $inst_results{$ccuname.':'.$ccdomain});
 <tr><td>$lt{'gen'}$genhelp</td>          $r->print($personal_table);
     <td><input type='text' name='cgen'    size='5'  /></td></tr>          my ($home_server_pick,$numlib) = 
 </table>              &Apache::loncommon::home_server_form_item($ccdomain,'hserver',
 $lt{'idsn'} <input type='text' name='cstid'   size='15' /></p>                                                        'default','hide');
 $lt{'hs'}: <select name="hserver" size="1"> $home_server_list </select>          if ($numlib > 1) {
 <hr />              $r->print("
 <h3>$lt{'lg'}</h3>  <br />
 <p>$generalrule </p>  $lt{'hs'}: $home_server_pick
 <p>$authformkrb </p>  <br />");
 <p>$authformint </p>          } else {
 <p>$authformfsys</p>              $r->print($home_server_pick);
 <p>$authformloc </p>          }
 ENDNEWUSER          $r->print('</div>'."\n".'<div class="LC_left_float"><h3>'.
                     $lt{'lg'}.'</h3>');
           my ($fixedauth,$varauth,$authmsg); 
           if (ref($rulematch{$ccuname.':'.$ccdomain}) eq 'HASH') {
               my $matchedrule = $rulematch{$ccuname.':'.$ccdomain}{'username'};
               my ($rules,$ruleorder) = 
                   &Apache::lonnet::inst_userrules($ccdomain,'username');
               if (ref($rules) eq 'HASH') {
                   if (ref($rules->{$matchedrule}) eq 'HASH') {
                       my $authtype = $rules->{$matchedrule}{'authtype'};
                       if ($authtype !~ /^(krb4|krb5|int|fsys|loc)$/) {
                           $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
                       } else { 
                           my $authparm = $rules->{$matchedrule}{'authparm'};
                           if ($authtype =~ /^krb(4|5)$/) {
                               my $ver = $1;
                               if ($authparm ne '') {
                                   $fixedauth = <<"KERB"; 
   <input type="hidden" name="login" value="krb" />
   <input type="hidden" name="krbver" value="$ver" />
   <input type="hidden" name="krbarg" value="$authparm" />
   KERB
                                   $authmsg = $rules->{$matchedrule}{'authmsg'};    
                               }
                           } else {
                               $fixedauth = 
   '<input type="hidden" name="login" value="'.$authtype.'" />'."\n";
                               if ($rules->{$matchedrule}{'authparmfixed'}) {
                                   $fixedauth .=    
   '<input type="hidden" name="'.$authtype.'arg" value="'.$authparm.'" />'."\n";
                               } else {
                                   $varauth =  
   '<input type="text" name="'.$authtype.'arg" value="" />'."\n";
                               }
                           }
                       }
                   } else {
                       $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
                   }
               }
               if ($authmsg) {
                   $r->print(<<ENDAUTH);
   $fixedauth
   $authmsg
   $varauth
   ENDAUTH
               }
           } else {
               $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); 
           }
           $r->print($portfolioform);
           if ($env{'form.action'} eq 'singlestudent') {
               $r->print(&date_sections_select($context,$newuser,$formname,
                                               $permission));
           }
           $r->print('</div><div class="LC_clear_float_footer"></div>');
     } else { # user already exists      } else { # user already exists
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Change User Privileges",                      'cup'  => "Modify existing user: ",
                     'usr'  => "User",                                          'ens'  => "Enroll one student: ",
                     'id'   => "in domain",                      'id'   => "in domain",
                     'fn'   => "first name",  
                     'mn'   => "middle name",  
                     'ln'   => "last name",  
                     'gen'  => "generation"  
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
 $dochead  $start_page
 <h1>$lt{'cup'}</h1>  $crumbs
 $forminfo  $forminfo
 <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>  <h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         # Get the users information          if ($env{'form.action'} eq 'singlestudent') {
         my %userenv = &Apache::lonnet::get('environment',              $r->print($lt{'ens'});
                           ['firstname','middlename','lastname','generation'],          } else {
                           $ccdomain,$ccuname);              $r->print($lt{'cup'});
         my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);  
         $r->print(<<END);  
 <hr />  
 <table border="2">  
 <tr>  
 <th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th>  
 </tr>  
 <tr>  
 END  
         foreach ('firstname','middlename','lastname','generation') {  
            if (&Apache::lonnet::allowed('mau',$ccdomain)) {  
               $r->print(<<"END");              
 <td><input type="text" name="c$_" value="$userenv{$_}" size="15" /></td>  
 END  
            } else {  
                $r->print('<td>'.$userenv{$_}.'</td>');  
            }  
         }          }
       $r->print(<<END);          $r->print(' "'.$ccuname.'" '.$lt{'id'}.' "'.$ccdomain.'"</h2>'.
 </tr>                    "\n".'<div class="LC_left_float">');
 </table>          my ($personal_table,$showforceid) = 
 END              &personal_data_display($ccuname,$ccdomain,$newuser,$context,
         # Build up table of user roles to allow revocation of a role.                                     $inst_results{$ccuname.':'.$ccdomain});
         my ($tmp) = keys(%rolesdump);          $r->print($personal_table);
         unless ($tmp =~ /^(con_lost|error)/i) {          if ($showforceid) {
            my $now=time;              $r->print(&Apache::lonuserutils::forceid_change($context));
    my %lt=&Apache::lonlocal::texthash(          }
     'rer'  => "Revoke Existing Roles",          $r->print('</div>');
                     'rev'  => "Revoke",                              my $user_auth_text = 
               &user_authentication($ccuname,$ccdomain,$krbdefdom,\%abv_auth);
           my $user_quota_text;
           if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
               # Current user has quota modification privileges
               $user_quota_text = &portfolio_quota($ccuname,$ccdomain);
           } elsif (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
               # Get the user's portfolio information
               my %portq = &Apache::lonnet::get('environment',['portfolioquota'],
                                                $ccdomain,$ccuname);
   
               my %lt=&Apache::lonlocal::texthash(
                   'dska'  => "Disk space allocated to user's portfolio files",
                   '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;
   <h3>$lt{'dska'}</h3>
   $lt{'youd'} $lt{'ichr'}: $ccdomain
   ENDNOPORTPRIV
           }
           if ($user_auth_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_auth_text);
               if ($user_quota_text ne '') {
                   $r->print($user_quota_text);
               }
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print(&date_sections_select($context,$newuser,$formname));
               }
           } elsif ($user_quota_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_quota_text);
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print(&date_sections_select($context,$newuser,$formname));
               }
           } else {
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print('<div class="LC_left_float">'.
                             &date_sections_select($context,$newuser,$formname));
               }
           }
           $r->print('</div><div class="LC_clear_float_footer"></div>');
           if ($env{'form.action'} ne 'singlestudent') {
               &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);
           }
       } ## End of new user/old user logic
   
       if ($env{'form.action'} eq 'singlestudent') {
           $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onClick="setSections(this.form)" />'."\n");
       } else {
           $r->print('<h3>'.&mt('Add Roles').'</h3>');
           my $addrolesdisplay = 0;
           if ($context eq 'domain' || $context eq 'author') {
               $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain);
           }
           if ($context eq 'domain') {
               my $add_domainroles = &new_domain_roles($r);
               if (!$addrolesdisplay) {
                   $addrolesdisplay = $add_domainroles;
               }
               $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
               $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");
           } elsif ($context eq 'author') {
               if ($addrolesdisplay) {
                   $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');
                   if ($newuser) {
                       $r->print(' onClick="verify_message(this.form)" \>'."\n");
                   } else {
                       $r->print('onClick="this.form.submit()" \>'."\n");
                   }
               } else {
                   $r->print('<br /><a href="javascript:backPage(document.cu)">'.
                             &mt('Back to previous page').'</a>');
               }
           } else {
               $r->print(&course_level_table(%inccourses));
               $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections(this.form)" />'."\n");
           }
       }
       $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
       $r->print('<input type="hidden" name="currstate" value="" />');
       $r->print('<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />');
       $r->print("</form>".&Apache::loncommon::end_page());
       return;
   }
   
   sub singleuser_breadcrumb {
       my %breadcrumb_text;
       if ($env{'form.action'} eq 'singlestudent') {
           $breadcrumb_text{'search'} = 'Enroll a student';
           $breadcrumb_text{'userpicked'} = 'Select a user',
           $breadcrumb_text{'modify'} = 'Set section/dates',
       } else {
           $breadcrumb_text{'search'} = 'Create/modify user';
           $breadcrumb_text{'userpicked'} = 'Select a user',
           $breadcrumb_text{'modify'} = 'Set user role',
       }
       return %breadcrumb_text;
   }
   
   sub date_sections_select {
       my ($context,$newuser,$formname,$permission) = @_;
       my $cid = $env{'request.course.id'};
       my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid);
       my $date_table = '<h3>'.&mt('Starting and Ending Dates').'</h3>'."\n".
           &Apache::lonuserutils::date_setting_table(undef,undef,$context,
                                                     undef,$formname,$permission);
       my $rowtitle = 'Section';
       my $secbox = '<h3>'.&mt('Section').'</h3>'."\n".
           &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle,
                                                 $permission);
       my $output = $date_table.$secbox;
       return $output;
   }
   
   sub validation_javascript {
       my ($context,$ccdomain,$pjump_def,$groupslist,$newuser,$formname,
           $loaditem) = @_;
       my $dc_setcourse_code = '';
       my $nondc_setsection_code = '';
       if ($context eq 'domain') {
           my $dcdom = $env{'request.role.domain'};
           $loaditem->{'onload'} = "document.cu.coursedesc.value='';";
           $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser');
       } else {
           $nondc_setsection_code =
               &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
       }
       my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
                                      $nondc_setsection_code,$groupslist);
   
       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".
              '<script type="text/javascript">'."\n".$jsback."\n".
              $javascript_validations.'</script>';
       return $js;
   }
   
   sub display_existing_roles {
       my ($r,$ccuname,$ccdomain,$inccourses) = @_;
       my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
       # Build up table of user roles to allow revocation and re-enabling of roles.
       my ($tmp) = keys(%rolesdump);
       if ($tmp !~ /^(con_lost|error)/i) {
           my $now=time;
           my %lt=&Apache::lonlocal::texthash(
                       'rer'  => "Existing Roles",
                       'rev'  => "Revoke",
                     'del'  => "Delete",                      'del'  => "Delete",
     'ren'  => "Re-Enable",                      'ren'  => "Re-Enable",
                     'rol'  => "Role",                      'rol'  => "Role",
                     'ext'  => "Extent",                      'ext'  => "Extent",
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End"                      'end'  => "End",
        );                                         );
            $r->print(<<END);          my (%roletext,%sortrole,%roleclass,%rolepriv);
 <hr />          foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
 <h3>$lt{'rer'}</h3>                                      my $b1=join('_',(split('_',$b))[1,0]);
 <table>                                      return $a1 cmp $b1;
 <tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>                                  } keys(%rolesdump)) {
 END              next if ($area =~ /^rolesdef/);
            my (%roletext,%sortrole,%roleclass);              my $envkey=$area;
    foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);              my $role = $rolesdump{$area};
     my $b1=join('_',(split('_',$b))[1,0]);              my $thisrole=$area;
     return $a1 cmp $b1;              $area =~ s/\_\w\w$//;
  } keys(%rolesdump)) {              my ($role_code,$role_end_time,$role_start_time) =
                next if ($area =~ /^rolesdef/);                  split(/_/,$role);
        my $envkey=$area;  
                my $role = $rolesdump{$area};  
                my $thisrole=$area;  
                $area =~ s/\_\w\w$//;  
                my ($role_code,$role_end_time,$role_start_time) =   
                    split(/_/,$role);  
 # Is this a custom role? Get role owner and title.  # Is this a custom role? Get role owner and title.
        my ($croleudom,$croleuname,$croletitle)=              my ($croleudom,$croleuname,$croletitle)=
            ($role_code=~/^cr\/(\w+)\/(\w+)\/(\w+)$/);                  ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
                my $bgcol='ffffff';              my $allowed=0;
                my $allowed=0;              my $delallowed=0;
                my $delallowed=0;              my $sortkey=$role_code;
        my $sortkey=$role_code;              my $class='Unknown';
        my $class='Unknown';              if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
                if ($area =~ /^\/(\w+)\/(\d\w+)/ ) {                  $class='Course';
    $class='Course';                  my ($coursedom,$coursedir) = ($1,$2);
                    my ($coursedom,$coursedir) = ($1,$2);                  $sortkey.="\0$coursedom";
    $sortkey.="\0$1";                  # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                    # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).                  my %coursedata=
                    my %coursedata=                      &Apache::lonnet::coursedescription($1.'_'.$2);
                        &Apache::lonnet::coursedescription($1.'_'.$2);                  my $carea;
    my $carea;                  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('Syllabus',$coursedir,$coursedom);
        $sortkey.="\0".$coursedata{'description'};                      $sortkey.="\0".$coursedata{'description'};
    } else {                      $class=$coursedata{'type'};
        $carea=&mt('Unavailable course').': '.$area;                  } else {
        $sortkey.="\0".&mt('Unavailable course');                      $carea=&mt('Unavailable course').': '.$area;
    }                      $sortkey.="\0".&mt('Unavailable course').': '.$area;
                    $inccourses{$1.'_'.$2}=1;                  }
                    if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||                  $sortkey.="\0$coursedir";
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                  $inccourses->{$1.'_'.$2}=1;
                        $allowed=1;                  if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
                    }                      (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                    if ((&Apache::lonnet::allowed('dro',$1)) ||                      $allowed=1;
                        (&Apache::lonnet::allowed('dro',$ccdomain))) {                  }
                        $delallowed=1;                  if ((&Apache::lonnet::allowed('dro',$1)) ||
                    }                      (&Apache::lonnet::allowed('dro',$ccdomain))) {
                       $delallowed=1;
                   }
 # - custom role. Needs more info, too  # - custom role. Needs more info, too
    if ($croletitle) {                  if ($croletitle) {
        if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {                      if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
    $allowed=1;                          $allowed=1;
    $thisrole.='.'.$role_code;                          $thisrole.='.'.$role_code;
        }                      }
    }                  }
                    # Compute the background color based on $area                  # Compute the background color based on $area
                    $bgcol=$1.'_'.$2;                  if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
                    $bgcol=~s/[^7-9a-e]//g;                      $carea.='<br />Section: '.$3;
                    $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);                      $sortkey.="\0$3";
                    if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {                      if (!$allowed) {
                        $carea.='<br>Section/Group: '.$3;                          if ($env{'request.course.sec'} eq $3) {
                    }                              if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
                    $area=$carea;                                  $allowed = 1;
                } else {                              }
    $sortkey.="\0".$area;                          }
                    # Determine if current user is able to revoke privileges                      }
                    if ($area=~ /^\/(\w+)\//) {                  }
                        if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||                  $area=$carea;
               } else {
                   $sortkey.="\0".$area;
                   # Determine if current user is able to revoke privileges
                   if ($area=~m{^/($match_domain)/}) {
                       if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                         (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                            $allowed=1;                          $allowed=1;
                        }                      }
                        if (((&Apache::lonnet::allowed('dro',$1))  ||                      if (((&Apache::lonnet::allowed('dro',$1))  ||
                             (&Apache::lonnet::allowed('dro',$ccdomain))) &&                           (&Apache::lonnet::allowed('dro',$ccdomain))) &&
                            ($role_code ne 'dc')) {                          ($role_code ne 'dc')) {
                            $delallowed=1;                          $delallowed=1;
                        }                      }
                    } else {                  } else {
                        if (&Apache::lonnet::allowed('c'.$role_code,'/')) {                      if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
                            $allowed=1;                          $allowed=1;
                        }                      }
                    }                  }
    if ($role_code eq 'ca' || $role_code eq 'au') {                  if ($role_code eq 'ca' || $role_code eq 'au') {
        $class='Construction Space';                      $class='Construction Space';
    } elsif ($role_code eq 'su') {                  } elsif ($role_code eq 'su') {
        $class='System';                      $class='System';
    } else {                  } else {
        $class='Domain';                      $class='Domain';
    }                  }
                }              }
                if ($role_code eq 'ca') {              if (($role_code eq 'ca') || ($role_code eq 'aa')) {
                    $area=~/\/(\w+)\/(\w+)/;                  $area=~m{/($match_domain)/($match_username)};
    if (&authorpriv($2,$1)) {                  if (&Apache::lonuserutils::authorpriv($2,$1)) {
        $allowed=1;                      $allowed=1;
                    } else {                  } else {
                        $allowed=0;                      $allowed=0;
                    }                  }
                }              }
        $bgcol='77FF77';              my $row = '';
                my $row = '';              $row.= '<td>';
                $row.='<tr bgcolor="#'.$bgcol.'"><td>';              my $active=1;
                my $active=1;              $active=0 if (($role_end_time) && ($now>$role_end_time));
                $active=0 if (($role_end_time) && ($now>$role_end_time));              if (($active) && ($allowed)) {
                if (($active) && ($allowed)) {                  $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
                    $row.= '<input type="checkbox" name="rev:'.$thisrole.'">';              } else {
                } else {                  if ($active) {
                    if ($active) {  
                       $row.='&nbsp;';  
    } else {  
                       $row.=&mt('expired or revoked');  
    }  
                }  
        $row.='</td><td>';  
                if ($allowed && !$active) {  
                    $row.= '<input type="checkbox" name="ren:'.$thisrole.'">';  
                } else {  
                    $row.='&nbsp;';  
                }  
        $row.='</td><td>';  
                if ($delallowed) {  
                    $row.= '<input type="checkbox" name="del:'.$thisrole.'">';  
                } else {  
                    $row.='&nbsp;';                     $row.='&nbsp;';
                }                  } else {
        my $plaintext='';                     $row.=&mt('expired or revoked');
        unless ($croletitle) {                  }
    $plaintext=&Apache::lonnet::plaintext($role_code);  
        } else {  
            $plaintext=  
  "Customrole '$croletitle' defined by $croleuname\@$croleudom";  
        }  
                $row.= '</td><td>'.$plaintext.  
                       '</td><td>'.$area.  
                       '</td><td>'.($role_start_time?localtime($role_start_time)  
                                                    : '&nbsp;' ).  
                       '</td><td>'.($role_end_time  ?localtime($role_end_time)  
                                                    : '&nbsp;' )  
                       ."</td></tr>\n";  
        $sortrole{$sortkey}=$envkey;  
        $roletext{$envkey}=$row;  
        $roleclass{$envkey}=$class;  
                #$r->print($row);  
            } # end of foreach        (table building loop)  
    foreach my $type ('Construction Space','Course','Domain','System','Unknown') {  
        my $output;  
        foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {  
    if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {   
        $output.=$roletext{$sortrole{$which}};  
    }  
        }  
        if (defined($output)) {  
    $r->print("<tr bgcolor='#BBffBB'>".  
      "<td align='center' colspan='7'>".&mt($type)."</td>");  
        }  
        $r->print($output);  
    }  
    $r->print('</table>');  
         }  # End of unless  
  my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);  
  if ($currentauth=~/^krb(4|5):/) {  
     $currentauth=~/^krb(4|5):(.*)/;  
     my $krbdefdom=$1;  
             my %param = ( formname => 'document.cu',  
                           kerb_def_dom => $krbdefdom   
                           );  
             $loginscript  = &Apache::loncommon::authform_header(%param);  
  }  
  # Check for a bad authentication type  
         unless ($currentauth=~/^krb(4|5):/ or  
  $currentauth=~/^unix:/ or  
  $currentauth=~/^internal:/ or  
  $currentauth=~/^localauth:/  
  ) { # bad authentication scheme  
     if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {  
  my %lt=&Apache::lonlocal::texthash(  
                                'err'   => "ERROR",  
        'uuas'  => "This user has an unrecognized authentication scheme",  
                                'sldb'  => "Please specify login data below",  
                                'ld'    => "Login Data"  
    );  
  $r->print(<<ENDBADAUTH);  
 <hr />  
 <script type="text/javascript" language="Javascript">  
 $loginscript  
 </script>  
 <font color='#ff0000'>$lt{'err'}:</font>  
 $lt{'uuas'} ($currentauth). $lt{'sldb'}.  
 <h3>$lt{'ld'}</h3>  
 <p>$generalrule</p>  
 <p>$authformkrb</p>  
 <p>$authformint</p>  
 <p>$authformfsys</p>  
 <p>$authformloc</p>  
 ENDBADAUTH  
             } else {   
                 # This user is not allowed to modify the users   
                 # authentication scheme, so just notify them of the problem  
  my %lt=&Apache::lonlocal::texthash(  
                                'err'   => "ERROR",  
        'uuas'  => "This user has an unrecognized authentication scheme",  
                                'adcs'  => "Please alert a domain coordinator of this situation"  
    );  
  $r->print(<<ENDBADAUTH);  
 <hr />  
 <script type="text/javascript" language="Javascript">  
 $loginscript  
 </script>  
 <font color="#ff0000"> $lt{'err'}: </font>  
 $lt{'uuas'} ($currentauth). $lt{'adcs'}.  
 <hr />  
 ENDBADAUTH  
             }              }
         } else { # Authentication type is valid              $row.='</td><td>';
     my $authformcurrent='';              if ($allowed && !$active) {
     my $authform_other='';                  $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
     if ($currentauth=~/^krb(4|5):/) {              } else {
  $authformcurrent=$authformkrb;                  $row.='&nbsp;';
  $authform_other="<p>$authformint</p>\n".  
                     "<p>$authformfsys</p><p>$authformloc</p>";  
     }  
     elsif ($currentauth=~/^internal:/) {  
  $authformcurrent=$authformint;  
  $authform_other="<p>$authformkrb</p>".  
                     "<p>$authformfsys</p><p>$authformloc</p>";  
     }  
     elsif ($currentauth=~/^unix:/) {  
  $authformcurrent=$authformfsys;  
  $authform_other="<p>$authformkrb</p>".  
                     "<p>$authformint</p><p>$authformloc;</p>";  
     }  
     elsif ($currentauth=~/^localauth:/) {  
  $authformcurrent=$authformloc;  
  $authform_other="<p>$authformkrb</p>".  
                     "<p>$authformint</p><p>$authformfsys</p>";  
     }  
             $authformcurrent.=' <i>(will override current values)</i><br />';  
             if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {  
  # Current user has login modification privileges  
  my %lt=&Apache::lonlocal::texthash(  
                                'ccld'  => "Change Current Login Data",  
        'enld'  => "Enter New Login Data"  
    );  
  $r->print(<<ENDOTHERAUTHS);  
 <hr />  
 <script type="text/javascript" language="Javascript">  
 $loginscript  
 </script>  
 <h3>$lt{'ccld'}</h3>  
 <p>$generalrule</p>  
 <p>$authformnop</p>  
 <p>$authformcurrent</p>  
 <h3>$lt{'enld'}</h3>  
 $authform_other  
 ENDOTHERAUTHS  
             }              }
         }  ## End of "check for bad authentication type" logic              $row.='</td><td>';
     } ## End of new user/old user logic              if ($delallowed) {
     $r->print('<hr /><h3>'.&mt('Add Roles').'</h3>');                  $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
 #              } else {
 # Co-Author                  $row.='&nbsp;';
 #               }
     if (&authorpriv($ENV{'user.name'},$ENV{'request.role.domain'}) &&              my $plaintext='';
         ($ENV{'user.name'} ne $ccuname || $ENV{'user.domain'} ne $ccdomain)) {              if (!$croletitle) {
                   $plaintext=&Apache::lonnet::plaintext($role_code,$class)
               } else {
                   $plaintext=
           "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
               }
               $row.= '</td><td>'.$plaintext.
                      '</td><td>'.$area.
                      '</td><td>'.($role_start_time?localtime($role_start_time)
                                                   : '&nbsp;' ).
                      '</td><td>'.($role_end_time  ?localtime($role_end_time)
                                                   : '&nbsp;' )
                      ."</td>";
               $sortrole{$sortkey}=$envkey;
               $roletext{$envkey}=$row;
               $roleclass{$envkey}=$class;
               $rolepriv{$envkey}=$allowed;
               #$r->print($row);
           } # end of foreach        (table building loop)
           my $rolesdisplay = 0;
           my %output = ();
           foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
               $output{$type} = '';
               foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
                   if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
                       $output{$type}.=
                             &Apache::loncommon::start_data_table_row().
                             $roletext{$sortrole{$which}}.
                             &Apache::loncommon::end_data_table_row();
                   }
               }
               unless($output{$type} eq '') {
                   $output{$type} = '<tr class="LC_info_row">'.
                             "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
                              $output{$type};
                   $rolesdisplay = 1;
               }
           }
           if ($rolesdisplay == 1) {
               $r->print('
   <h3>'.$lt{'rer'}.'</h3>'.
   &Apache::loncommon::start_data_table("LC_createuser").
   &Apache::loncommon::start_data_table_header_row().
   '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.
   '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
   '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
   &Apache::loncommon::end_data_table_header_row());
              foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
                   if ($output{$type}) {
                       $r->print($output{$type}."\n");
                   }
               }
               $r->print(&Apache::loncommon::end_data_table());
           }
       }  # End of check for keys in rolesdump
       return;
   }
   
   sub new_coauthor_roles {
       my ($r,$ccuname,$ccdomain) = @_;
       my $addrolesdisplay = 0;
       #
       # Co-Author
       #
       if (&Apache::lonuserutils::authorpriv($env{'user.name'},
                                             $env{'request.role.domain'}) &&
           ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {
         # No sense in assigning co-author role to yourself          # No sense in assigning co-author role to yourself
  my $cuname=$ENV{'user.name'};          $addrolesdisplay = 1;
         my $cudom=$ENV{'request.role.domain'};          my $cuname=$env{'user.name'};
    my %lt=&Apache::lonlocal::texthash(          my $cudom=$env{'request.role.domain'};
     'cs'   => "Construction Space",          my %lt=&Apache::lonlocal::texthash(
                     'act'  => "Activate",                                          'cs'   => "Construction Space",
                       'act'  => "Activate",
                     'rol'  => "Role",                      'rol'  => "Role",
                     'ext'  => "Extent",                      'ext'  => "Extent",
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End",                      'end'  => "End",
                     'cau'  => "Co-Author",                      'cau'  => "Co-Author",
                       'caa'  => "Assistant Co-Author",
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );                                         );
        $r->print(<<ENDCOAUTH);          $r->print('<h4>'.$lt{'cs'}.'</h4>'."\n".
 <h4>$lt{'cs'}</h4>                    &Apache::loncommon::start_data_table()."\n".
 <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th>                    &Apache::loncommon::start_data_table_header_row()."\n".
 <th>$lt{'sta'}</th><th>$lt{'end'}</th></tr>                    '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th>'.
 <tr>                    '<th>'.$lt{'ext'}.'</th><th>'.$lt{'sta'}.'</th>'.
 <td><input type=checkbox name="act_$cudom\_$cuname\_ca" /></td>                    '<th>'.$lt{'end'}.'</th>'."\n".
 <td>$lt{'cau'}</td>                    &Apache::loncommon::end_data_table_header_row()."\n".
 <td>$cudom\_$cuname</td>                    &Apache::loncommon::start_data_table_row().'
 <td><input type=hidden name="start_$cudom\_$cuname\_ca" value='' />             <td>
               <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />
              </td>
              <td>'.$lt{'cau'}.'</td>
              <td>'.$cudom.'_'.$cuname.'</td>
              <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_ca" value="" />
                <a href=
   "javascript:pjump('."'date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'ssd'}.'</a></td>
   <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_ca" value="" />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('."'date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
 <td><input type=hidden name="end_$cudom\_$cuname\_ca" value='' />                &Apache::loncommon::end_data_table_row()."\n".
                 &Apache::loncommon::start_data_table_row()."\n".
   '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
   <td>'.$lt{'caa'}.'</td>
   <td>'.$cudom.'_'.$cuname.'</td>
   <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_aa" value="" />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('."'date_start','Start Date Assistant Co-Author',document.cu.start_$cudom\_$cuname\_aa.value,'start_$cudom\_$cuname\_aa','cu.pres','dateset'".')">'.$lt{'ssd'}.'</a></td>
 </tr>  <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_aa" value="" />
 </table>  <a href=
 ENDCOAUTH  "javascript:pjump('."'date_end','End Date Assistant Co-Author',document.cu.end_$cudom\_$cuname\_aa.value,'end_$cudom\_$cuname\_aa','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
                &Apache::loncommon::end_data_table_row()."\n".
                &Apache::loncommon::end_data_table());
       } elsif ($env{'request.role'} =~ /^au\./) {
           if (!(&Apache::lonuserutils::authorpriv($env{'user.name'},
                                                   $env{'request.role.domain'}))) {
               $r->print('<span class="LC_error">'.
                         &mt('You do not have privileges to assign co-author roles.').
                         '</span>');
           } elsif (($env{'user.name'} eq $ccuname) &&
                ($env{'user.domain'} eq $ccdomain)) {
               $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted'));
           }
     }      }
 #      return $addrolesdisplay;;
 # Domain level  }
 #  
     $r->print('<h4>'.&mt('Domain Level').'</h4>'.  sub new_domain_roles {
     '<table border=2><tr><th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.&mt('Extent').'</th>'.      my ($r) = @_;
     '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th></tr>');      my $addrolesdisplay = 0;
     foreach ( sort( keys(%incdomains))) {      #
  my $thisdomain=$_;      # Domain level
         foreach ('dc','li','dg','au','sc') {      #
             if (&Apache::lonnet::allowed('c'.$_,$thisdomain)) {      my $num_domain_level = 0;
                my $plrole=&Apache::lonnet::plaintext($_);      my $domaintext =
        my %lt=&Apache::lonlocal::texthash(      '<h4>'.&mt('Domain Level').'</h4>'.
       &Apache::loncommon::start_data_table().
       &Apache::loncommon::start_data_table_header_row().
       '<th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.
       &mt('Extent').'</th>'.
       '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.
       &Apache::loncommon::end_data_table_header_row();
       foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {
           foreach my $role ('dc','li','dg','au','sc') {
               if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
                  my $plrole=&Apache::lonnet::plaintext($role);
                  my %lt=&Apache::lonlocal::texthash(
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );                                         );
                $r->print(<<ENDDROW);                 $num_domain_level ++;
 <tr>                 $domaintext .=
 <td><input type=checkbox name="act_$thisdomain\_$_"></td>  &Apache::loncommon::start_data_table_row().
 <td>$plrole</td>  '<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>
 <td>$thisdomain</td>  <td>'.$plrole.'</td>
 <td><input type=hidden name="start_$thisdomain\_$_" value=''>  <td>'.$thisdomain.'</td>
   <td><input type="hidden" name="start_'.$thisdomain.'_'.$role.'" value="" />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$thisdomain\_$_.value,'start_$thisdomain\_$_','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('."'date_start','Start Date $plrole',document.cu.start_$thisdomain\_$role.value,'start_$thisdomain\_$role','cu.pres','dateset'".')">'.$lt{'ssd'}.'</a></td>
 <td><input type=hidden name="end_$thisdomain\_$_" value=''>  <td><input type="hidden" name="end_'.$thisdomain.'_'.$role.'" value="" />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$thisdomain\_$_.value,'end_$thisdomain\_$_','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('."'date_end','End Date $plrole',document.cu.end_$thisdomain\_$role.value,'end_$thisdomain\_$role','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'.
 </tr>  &Apache::loncommon::end_data_table_row();
 ENDDROW              }
             }          }
         }       }
     }      $domaintext.= &Apache::loncommon::end_data_table();
     $r->print('</table>');      if ($num_domain_level > 0) {
 #          $r->print($domaintext);
 # Course level          $addrolesdisplay = 1;
 #      }
     $r->print(&course_level_table(%inccourses));      return $addrolesdisplay;
     $r->print("<hr /><input type=submit value=\"".&mt('Modify User')."\">\n");  }
     $r->print("</form></body></html>");  
   sub user_authentication {
       my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_;
       my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
       my ($loginscript,$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
       if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) {
           # bad authentication scheme
           my %lt=&Apache::lonlocal::texthash(
                          'err'   => "ERROR",
                          'uuas'  => "This user has an unrecognized authentication scheme",
                          'adcs'  => "Please alert a domain coordinator of this situation",
                          'sldb'  => "Please specify login data below",
                          'ld'    => "Login Data"
           );
           if (&Apache::lonnet::allowed('mau',$ccdomain)) {
               &initialize_authen_forms($ccdomain);
               my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
               $outcome = <<ENDBADAUTH;
   <script type="text/javascript" language="Javascript">
   $loginscript
   </script>
   <span class="LC_error">$lt{'err'}:
   $lt{'uuas'} ($currentauth). $lt{'sldb'}.</span>
   <h3>$lt{'ld'}</h3>
   $choices
   ENDBADAUTH
           } else {
               # This user is not allowed to modify the user's
               # authentication scheme, so just notify them of the problem
               $outcome = <<ENDBADAUTH;
   <span class="LC_error"> $lt{'err'}: 
   $lt{'uuas'} ($currentauth). $lt{'adcs'}.
   </span>
   ENDBADAUTH
           }
       } else { # Authentication type is valid
           &initialize_authen_forms($ccdomain,$currentauth,'modifyuser');
           my ($authformcurrent,$can_modify,@authform_others) =
               &modify_login_block($ccdomain,$currentauth);
           if (&Apache::lonnet::allowed('mau',$ccdomain)) {
               # Current user has login modification privileges
               my %lt=&Apache::lonlocal::texthash (
                              'ld'    => "Login Data",
                              'ccld'  => "Change Current Login Data",
                              'enld'  => "Enter New Login Data"
                                                  );
               $outcome =
                          '<script type="text/javascript" language="Javascript">'."\n".
                          $loginscript."\n".
                          '</script>'."\n".
                          '<h3>'.$lt{'ld'}.'</h3>'.
                          &Apache::loncommon::start_data_table().
                          &Apache::loncommon::start_data_table_row().
                          '<td>'.$authformnop;
               if ($can_modify) {
                   $outcome .= '</td>'."\n".
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::start_data_table_row().
                               '<td>'.$authformcurrent.'</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               } else {
                   $outcome .= '&nbsp;('.$authformcurrent.')</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               }
               foreach my $item (@authform_others) { 
                   $outcome .= &Apache::loncommon::start_data_table_row().
                               '<td>'.$item.'</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               }
               $outcome .= &Apache::loncommon::end_data_table();
           } else {
               if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
                   my %lt=&Apache::lonlocal::texthash(
                              'ccld'  => "Change Current Login Data",
                              'yodo'  => "You do not have privileges to modify the authentication configuration for this user.",
                              'ifch'  => "If a change is required, contact a domain coordinator for the domain",
                   );
                   $outcome .= <<ENDNOPRIV;
   <h3>$lt{'ccld'}</h3>
   $lt{'yodo'} $lt{'ifch'}: $ccdomain
   ENDNOPRIV
               }
           }
       }  ## End of "check for bad authentication type" logic
       return $outcome;
   }
   
   sub modify_login_block {
       my ($dom,$currentauth) = @_;
       my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
       my ($authnum,%can_assign) =
           &Apache::loncommon::get_assignable_auth($dom);
       my ($authformcurrent,@authform_others,$show_override_msg);
       if ($currentauth=~/^krb(4|5):/) {
           $authformcurrent=$authformkrb;
           if ($can_assign{'int'}) {
               push(@authform_others,$authformint);
           }
           if ($can_assign{'loc'}) {
               push(@authform_others,$authformloc);
           }
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^internal:/) {
           $authformcurrent=$authformint;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               push(@authform_others,$authformkrb);
           }
           if ($can_assign{'loc'}) {
               push(@authform_others,$authformloc);
           }
           if ($can_assign{'int'}) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^unix:/) {
           $authformcurrent=$authformfsys;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               push(@authform_others,$authformkrb);
           }
           if ($can_assign{'int'}) {
               push(@authform_others,$authformint);
           }
           if ($can_assign{'loc'}) {
               push(@authform_others,$authformloc);
           }
           if ($can_assign{'fsys'}) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^localauth:/) {
           $authformcurrent=$authformloc;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               push(@authform_others,$authformkrb);
           }
           if ($can_assign{'int'}) {
               push(@authform_others,$authformint);
           }
           if ($can_assign{'loc'}) {
               $show_override_msg = 1;
           }
       }
       if ($show_override_msg) {
           $authformcurrent = '<table><tr><td colspan="3">'.$authformcurrent.
                              '</td></tr>'."\n".
                              '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                              '<td><b>'.&mt('Currently in use').'</b></td>'.
                              '<td align="right"><span class="LC_cusr_emph">'.
                               &mt('will override current values').
                               '</span></td></tr></table>';
       }
       return ($authformcurrent,$show_override_msg,@authform_others); 
   }
   
   sub personal_data_display {
       my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_;
       my ($output,$showforceid,%userenv,%canmodify);
       my @userinfo = ('firstname','middlename','lastname','generation',
                       'permanentemail','id');
       if (!$newuser) {
           # Get the users information
           %userenv = &Apache::lonnet::get('environment',
                      ['firstname','middlename','lastname','generation',
                       'permanentemail','id'],$ccdomain,$ccuname);
           %canmodify =
               &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
                                                          \@userinfo);
       }
       my %lt=&Apache::lonlocal::texthash(
                   'pd'             => "Personal Data",
                   'firstname'      => "First Name",
                   'middlename'     => "Middle Name",
                   'lastname'       => "Last Name",
                   'generation'     => "Generation",
                   'permanentemail' => "Permanent e-mail address",
                   'id'             => "ID/Student Number",
                   'lg'             => "Login Data"
       );
       my %textboxsize = (
                          firstname      => '15',
                          middlename     => '15',
                          lastname       => '15',
                          generation     => '5',
                          permanentemail => '25',
                          id             => '15',
                         );
       my $genhelp=&Apache::loncommon::help_open_topic('Generation');
       $output = '<h3>'.$lt{'pd'}.'</h3>'.
                 &Apache::lonhtmlcommon::start_pick_box();
       foreach my $item (@userinfo) {
           my $rowtitle = $lt{$item};
           if ($item eq 'generation') {
               $rowtitle = $genhelp.$rowtitle;
           }
           $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
           if ($newuser) {
               if (ref($inst_results) eq 'HASH') {
                   if ($inst_results->{$item} ne '') {
                       $output .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};
                   } else {
                       $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                   }
               } else {
                   $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
               }
           } else {
               if ($canmodify{$item}) {
                   $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';
               } else {
                   $output .= $userenv{$item};
               }
               if ($item eq 'id') {
                   $showforceid = $canmodify{$item};
               }
           }
           $output .= &Apache::lonhtmlcommon::row_closure(1);
       }
       $output .= &Apache::lonhtmlcommon::end_pick_box();
       if (wantarray) {
           return ($output,$showforceid);
       } else {
           return $output;
       }
 }  }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my $r=shift;      my ($r,$context) = @_; 
     my $uhome=&Apache::lonnet::homeserver($ENV{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $ENV{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
     my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';      my $error     = '<span class="LC_error">'.&mt('Error').': ';
     my $end       = '</body></html>';      my $end       = '</span><br /><br />';
     # Print header      my $rtnlink   = '<a href="javascript:backPage(document.userupdate,'.
     $r->print(<<ENDTHREEHEAD);                      "'$env{'form.prevphase'}','modify')".'" />'.
 <html>                      &mt('Return to previous page').'</a>'.
 <head>                      &Apache::loncommon::end_page();
 <title>The LearningOnline Network with CAPA</title>      my $now = time;
 </head>  
 ENDTHREEHEAD  
     my $title;      my $title;
     if (exists($ENV{'form.makeuser'})) {      if (exists($env{'form.makeuser'})) {
  $title='Set Privileges for New User';   $title='Set Privileges for New User';
     } else {      } else {
         $title='Modify User Privileges';          $title='Modify User Privileges';
     }      }
     $r->print(&Apache::loncommon::bodytag($title));      my $newuser = 0;
       my ($jsback,$elements) = &crumb_utilities();
       my $jscript = '<script type="text/javascript">'."\n".
                     $jsback."\n".'</script>'."\n";
       my %breadcrumb_text = &singleuser_breadcrumb();
       $r->print(&Apache::loncommon::start_page($title,$jscript));
       &Apache::lonhtmlcommon::add_breadcrumb
          ({href=>"javascript:backPage(document.userupdate)",
            text=>$breadcrumb_text{'search'},
            faq=>282,bug=>'Instructor Interface',});
       if ($env{'form.prevphase'} eq 'userpicked') {
           &Apache::lonhtmlcommon::add_breadcrumb
              ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')",
                text=>$breadcrumb_text{'userpicked'},
                faq=>282,bug=>'Instructor Interface',});
       }
       &Apache::lonhtmlcommon::add_breadcrumb
          ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",
            text=>$breadcrumb_text{'modify'},
            faq=>282,bug=>'Instructor Interface',},
           {href=>"/adm/createuser",
            text=>"Result",
            faq=>282,bug=>'Instructor Interface',});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
       $r->print(&update_result_form($uhome));
     # Check Inputs      # Check Inputs
     if (! $ENV{'form.ccuname'} ) {      if (! $env{'form.ccuname'} ) {
  $r->print($error.&mt('No login name specified').'.'.$end);   $r->print($error.&mt('No login name specified').'.'.$end.$rtnlink);
  return;   return;
     }      }
     if (  $ENV{'form.ccuname'}  =~/\W/) {      if (  $env{'form.ccuname'} ne 
     &LONCAPA::clean_username($env{'form.ccuname'}) ) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, @, and underscores are valid').'.'.
   $end);    $end.$rtnlink);
  return;   return;
     }      }
     if (! $ENV{'form.ccdomain'}       ) {      if (! $env{'form.ccdomain'}       ) {
  $r->print($error.&mt('No domain specified').'.'.$end);   $r->print($error.&mt('No domain specified').'.'.$end.$rtnlink);
  return;   return;
     }      }
     if (  $ENV{'form.ccdomain'} =~/\W/) {      if (  $env{'form.ccdomain'} ne
     &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt ('Invalid domain name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.
   $end);    $end.$rtnlink);
  return;   return;
     }      }
     if (! exists($ENV{'form.makeuser'})) {      if ($uhome eq 'no_host') {
           $newuser = 1;
       }
       if (! exists($env{'form.makeuser'})) {
         # Modifying an existing user, so check the validity of the name          # Modifying an existing user, so check the validity of the name
         if ($uhome eq 'no_host') {          if ($uhome eq 'no_host') {
             $r->print($error.&mt('Unable to determine home server for ').              $r->print($error.&mt('Unable to determine home server for ').
                       $ENV{'form.ccuname'}.&mt(' in domain ').                        $env{'form.ccuname'}.&mt(' in domain ').
                       $ENV{'form.ccdomain'}.'.');                        $env{'form.ccdomain'}.'.');
             return;              return;
         }          }
     }      }
     # Determine authentication method and password for the user being modified      # Determine authentication method and password for the user being modified
     my $amode='';      my $amode='';
     my $genpwd='';      my $genpwd='';
     if ($ENV{'form.login'} eq 'krb') {      if ($env{'form.login'} eq 'krb') {
  $amode='krb';   $amode='krb';
  $amode.=$ENV{'form.krbver'};   $amode.=$env{'form.krbver'};
  $genpwd=$ENV{'form.krbarg'};   $genpwd=$env{'form.krbarg'};
     } elsif ($ENV{'form.login'} eq 'int') {      } elsif ($env{'form.login'} eq 'int') {
  $amode='internal';   $amode='internal';
  $genpwd=$ENV{'form.intarg'};   $genpwd=$env{'form.intarg'};
     } elsif ($ENV{'form.login'} eq 'fsys') {      } elsif ($env{'form.login'} eq 'fsys') {
  $amode='unix';   $amode='unix';
  $genpwd=$ENV{'form.fsysarg'};   $genpwd=$env{'form.fsysarg'};
     } elsif ($ENV{'form.login'} eq 'loc') {      } elsif ($env{'form.login'} eq 'loc') {
  $amode='localauth';   $amode='localauth';
  $genpwd=$ENV{'form.locarg'};   $genpwd=$env{'form.locarg'};
  $genpwd=" " if (!$genpwd);   $genpwd=" " if (!$genpwd);
     } elsif (($ENV{'form.login'} eq 'nochange') ||      } elsif (($env{'form.login'} eq 'nochange') ||
              ($ENV{'form.login'} eq ''        )) {                ($env{'form.login'} eq ''        )) { 
         # There is no need to tell the user we did not change what they          # There is no need to tell the user we did not change what they
         # did not ask us to change.          # did not ask us to change.
         # If they are creating a new user but have not specified login          # If they are creating a new user but have not specified login
         # information this will be caught below.          # information this will be caught below.
     } else {      } else {
     $r->print($error.&mt('Invalid login mode or password').$end);          $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);    
     return;      return;
     }      }
     if ($ENV{'form.makeuser'}) {  
         # Create a new user      $r->print('<h3>'.&mt('User [_1] in domain [_2]',
  my %lt=&Apache::lonlocal::texthash(   $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
                     'cru'  => "Creating user",                          my (%alerts,%rulematch,%inst_results,%curr_rules);
                     'id'   => "in domain"      if ($env{'form.makeuser'}) {
    );   $r->print('<h3>'.&mt('Creating new account.').'</h3>');
  $r->print(<<ENDNEWUSERHEAD);  
 <h3>$lt{'cru'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h3>  
 ENDNEWUSERHEAD  
         # Check for the authentication mode and password          # Check for the authentication mode and password
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
     $r->print($error.&mt('Invalid login mode or password').$end);          $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);    
     return;      return;
  }   }
         # Determine desired host          # Determine desired host
         my $desiredhost = $ENV{'form.hserver'};          my $desiredhost = $env{'form.hserver'};
         if (lc($desiredhost) eq 'default') {          if (lc($desiredhost) eq 'default') {
             $desiredhost = undef;              $desiredhost = undef;
         } else {          } else {
             my %home_servers = &Apache::loncommon::get_library_servers              my %home_servers = 
                 ($ENV{'form.ccdomain'});     &Apache::lonnet::get_servers($env{'form.ccdomain'},'library');
             if (! exists($home_servers{$desiredhost})) {              if (! exists($home_servers{$desiredhost})) {
                 $r->print($error.&mt('Invalid home server specified'));                  $r->print($error.&mt('Invalid home server specified').$end.$rtnlink);
                 return;                  return;
             }              }
         }          }
           # Check ID format
           my %checkhash;
           my %checks = ('id' => 1);
           %{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = (
               'newuser' => $newuser, 
               'id' => $env{'form.cid'},
           );
           if ($env{'form.cid'} ne '') {
               &Apache::loncommon::user_rule_check(\%checkhash,\%checks,\%alerts,
                                             \%rulematch,\%inst_results,\%curr_rules);
               if (ref($alerts{'id'}) eq 'HASH') {
                   if (ref($alerts{'id'}{$env{'form.ccdomain'}}) eq 'HASH') {
                       my $domdesc =
                           &Apache::lonnet::domain($env{'form.ccdomain'},'description');
                       if ($alerts{'id'}{$env{'form.ccdomain'}}{$env{'form.cid'}}) {
                           my $userchkmsg;
                           if (ref($curr_rules{$env{'form.ccdomain'}}) eq 'HASH') {
                               $userchkmsg  = 
                                   &Apache::loncommon::instrule_disallow_msg('id',
                                                                       $domdesc,1).
                                   &Apache::loncommon::user_rule_formats($env{'form.ccdomain'},
                                       $domdesc,$curr_rules{$env{'form.ccdomain'}}{'id'},'id');
                           }
                           $r->print($error.&mt('Invalid ID format').$end.
                                     $userchkmsg.$rtnlink);
                           return;
                       }
                   }
               }
           }
  # Call modifyuser   # Call modifyuser
  my $result = &Apache::lonnet::modifyuser   my $result = &Apache::lonnet::modifyuser
     ($ENV{'form.ccdomain'},$ENV{'form.ccuname'},$ENV{'form.cstid'},      ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cid'},
              $amode,$genpwd,$ENV{'form.cfirst'},               $amode,$genpwd,$env{'form.cfirstname'},
              $ENV{'form.cmiddle'},$ENV{'form.clast'},$ENV{'form.cgen'},               $env{'form.cmiddlename'},$env{'form.clastname'},
              undef,$desiredhost               $env{'form.cgeneration'},undef,$desiredhost,
      );               $env{'form.cpermanentemail'});
  $r->print(&mt('Generating user').': '.$result);   $r->print(&mt('Generating user').': '.$result);
         my $home = &Apache::lonnet::homeserver($ENV{'form.ccuname'},          $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},
                                                $ENV{'form.ccdomain'});                                                 $env{'form.ccdomain'});
         $r->print('<br />'.&mt('Home server').': '.$home.' '.          $r->print('<br />'.&mt('Home server').': '.$uhome.' '.
                   $Apache::lonnet::libserv{$home});                    &Apache::lonnet::hostname($uhome));
     } elsif (($ENV{'form.login'} ne 'nochange') &&      } elsif (($env{'form.login'} ne 'nochange') &&
              ($ENV{'form.login'} ne ''        )) {               ($env{'form.login'} ne ''        )) {
  # Modify user privileges   # Modify user privileges
     my %lt=&Apache::lonlocal::texthash(  
                     'usr'  => "User",                      
                     'id'   => "in domain"  
        );  
  $r->print(<<ENDMODIFYUSERHEAD);  
 <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2>  
 ENDMODIFYUSERHEAD  
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
     $r->print($error.'Invalid login mode or password'.$end);          $r->print($error.'Invalid login mode or password'.$end.$rtnlink);    
     return;      return;
  }   }
  # Only allow authentification modification if the person has authority   # Only allow authentification modification if the person has authority
  if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'})) {   if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
     $r->print('Modifying authentication: '.      $r->print('Modifying authentication: '.
                       &Apache::lonnet::modifyuserauth(                        &Apache::lonnet::modifyuserauth(
        $ENV{'form.ccdomain'},$ENV{'form.ccuname'},         $env{'form.ccdomain'},$env{'form.ccuname'},
                        $amode,$genpwd));                         $amode,$genpwd));
             $r->print('<br>'.&mt('Home server').': '.&Apache::lonnet::homeserver              $r->print('<br />'.&mt('Home server').': '.&Apache::lonnet::homeserver
   ($ENV{'form.ccuname'},$ENV{'form.ccdomain'}));    ($env{'form.ccuname'},$env{'form.ccdomain'}));
  } else {   } else {
     # Okay, this is a non-fatal error.      # Okay, this is a non-fatal error.
     $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');          $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end);    
  }   }
     }      }
     ##      ##
     if (! $ENV{'form.makeuser'} ) {      my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
       if ($context eq 'course') {
           ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
       }
       if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation'],              ('environment',['firstname','middlename','lastname','generation',
              $ENV{'form.ccdomain'},$ENV{'form.ccuname'});               'id','permanentemail','portfolioquota','inststatus'],
                 $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) { 
             %userenv = ();              %userenv = ();
         }          }
         # Check to see if we need to change user information          my $no_forceid_alert;
         foreach ('firstname','middlename','lastname','generation') {          # Check to see if user information can be changed
           my %domconfig =
               &Apache::lonnet::get_dom('configuration',['usermodification'],
                                        $env{'form.ccdomain'});
           my @statuses = ('active','future');
           my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'});
           my ($auname,$audom);
           if ($context eq 'author') {
               $auname = $env{'user.name'};
               $audom = $env{'user.domain'};     
           }
           foreach my $item (keys(%roles)) {
               my ($rolenum,$roledom,$role) = split(/:/,$item,-1);
               if ($context eq 'course') {
                   if ($cnum ne '' && $cdom ne '') {
                       if ($rolenum eq $cnum && $roledom eq $cdom) {
                           if (!grep(/^\Q$role\E$/,@userroles)) {
                               push(@userroles,$role);
                           }
                       }
                   }
               } elsif ($context eq 'author') {
                   if ($rolenum eq $auname && $roledom eq $audom) {
                       if (!grep(/^\Q$role\E$/,@userroles)) { 
                           push(@userroles,$role);
                       }
                   }
               }
           }
           if ($env{'form.action'} eq 'singlestudent') {
               if (!grep(/^st$/,@userroles)) {
                   push(@userroles,'st');
               }
           } else {
               # Check for course or co-author roles being activated or re-enabled
               if ($context eq 'author' || $context eq 'course') {
                   foreach my $key (keys(%env)) {
                       if ($context eq 'author') {
                           if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           }
                       } elsif ($context eq 'course') {
                           if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           }
                       }
                   }
               }
           }
           #Check to see if we can change personal data for the user 
           my (@mod_disallowed,@longroles);
           foreach my $role (@userroles) {
               if ($role eq 'cr') {
                   push(@longroles,'Custom');
               } else {
                   push(@longroles,&Apache::lonnet::plaintext($role)); 
               }
           }
           my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
           my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);
           foreach my $item (@userinfo) {
             # Strip leading and trailing whitespace              # Strip leading and trailing whitespace
             $ENV{'form.c'.$_} =~ s/(\s+$|^\s+)//g;               $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g;
               if (!$canmodify{$item}) {
                   if (defined($env{'form.c'.$item})) {
                       if ($env{'form.c'.$item} ne $userenv{$item}) {
                           push(@mod_disallowed,$item);
                       }
                   }
                   $env{'form.c'.$item} = $userenv{$item};
               }
           }
           # Check to see if we can change the ID/student number
           my $forceid = $env{'form.forceid'};
           my $recurseid = $env{'form.recurseid'};
           my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
           my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'},
                                               $env{'form.ccuname'});
           if (($uidhash{$env{'form.ccuname'}}) && 
               ($uidhash{$env{'form.ccuname'}}!~/error\:/) && 
               (!$forceid)) {
               if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                   $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";        
               }
           }
           if ($env{'form.cid'} ne $userenv{'id'}) {
               my $checkhash;
               my $checks = { 'id' => 1 };
               $checkhash->{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}} = 
                      { 'newuser' => $newuser,
                        'id'  => $env{'form.cid'}, 
                      };
               &Apache::loncommon::user_rule_check($checkhash,$checks,
                   \%alerts,\%rulematch,\%idinst_results,\%curr_rules,\%got_rules);
               if (ref($alerts{'id'}) eq 'HASH') {
                   if (ref($alerts{'id'}{$env{'form.ccdomain'}}) eq 'HASH') {
                      $env{'form.cid'} = $userenv{'id'};
                   }
               }
           }
           my ($quotachanged,$oldportfolioquota,$newportfolioquota,
               $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,
               $newdefquotatext);
           my ($defquota,$settingstatus) = 
               &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
           my $showquota;
           if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
               $showquota = 1;
           }
           my %changeHash;
           $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
           if ($userenv{'portfolioquota'} ne '') {
               $oldportfolioquota = $userenv{'portfolioquota'};
               if ($env{'form.customquota'} == 1) {
                   if ($env{'form.portfolioquota'} eq '') {
                       $newportfolioquota = 0;
                   } else {
                       $newportfolioquota = $env{'form.portfolioquota'};
                       $newportfolioquota =~ s/[^\d\.]//g;
                   }
                   if ($newportfolioquota != $oldportfolioquota) {
                       $quotachanged = &quota_admin($newportfolioquota,\%changeHash);
                   }
               } else {
                   $quotachanged = &quota_admin('',\%changeHash);
                   $newportfolioquota = $defquota;
                   $newisdefault = 1; 
               }
           } else {
               $oldisdefault = 1;
               $oldportfolioquota = $defquota;
               if ($env{'form.customquota'} == 1) {
                   if ($env{'form.portfolioquota'} eq '') {
                       $newportfolioquota = 0;
                   } else {
                       $newportfolioquota = $env{'form.portfolioquota'};
                       $newportfolioquota =~ s/[^\d\.]//g;
                   }
                   $quotachanged = &quota_admin($newportfolioquota,\%changeHash);
               } else {
                   $newportfolioquota = $defquota;
                   $newisdefault = 1;
               }
         }          }
         if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'}) &&           if ($oldisdefault) {
             ($ENV{'form.cfirstname'}  ne $userenv{'firstname'}  ||              $olddefquotatext = &get_defaultquota_text($settingstatus);
              $ENV{'form.cmiddlename'} ne $userenv{'middlename'} ||          }
              $ENV{'form.clastname'}   ne $userenv{'lastname'}   ||          if ($newisdefault) {
              $ENV{'form.cgeneration'} ne $userenv{'generation'} )) {              $newdefquotatext = &get_defaultquota_text($settingstatus);
           }
           if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
               $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
               $env{'form.clastname'}   ne $userenv{'lastname'}   ||
               $env{'form.cgeneration'} ne $userenv{'generation'} ||
               $env{'form.cid'} ne $userenv{'id'}                 ||
               $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {
               $namechanged = 1;
           }
           if ($namechanged || $quotachanged) {
               $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 ($quotachgresult,$namechgresult);
               if ($quotachanged) {
                   $quotachgresult = 
                       &Apache::lonnet::put('environment',\%changeHash,
                                     $env{'form.ccdomain'},$env{'form.ccuname'});
               }
               if ($namechanged) {
             # Make the change              # Make the change
             my %changeHash;                  $namechgresult =
             $changeHash{'firstname'}  = $ENV{'form.cfirstname'};                      &Apache::lonnet::modifyuser($env{'form.ccdomain'},
             $changeHash{'middlename'} = $ENV{'form.cmiddlename'};                          $env{'form.ccuname'},$changeHash{'id'},undef,undef,
             $changeHash{'lastname'}   = $ENV{'form.clastname'};                          $changeHash{'firstname'},$changeHash{'middlename'},
             $changeHash{'generation'} = $ENV{'form.cgeneration'};                          $changeHash{'lastname'},$changeHash{'generation'},
             my $putresult = &Apache::lonnet::put                          $changeHash{'id'},undef,$changeHash{'permanentemail'});
                 ('environment',\%changeHash,                  %userupdate = (
                  $ENV{'form.ccdomain'},$ENV{'form.ccuname'});                                 lastname   => $env{'form.clastname'},
             if ($putresult eq 'ok') {                                 middlename => $env{'form.cmiddlename'},
                                  firstname  => $env{'form.cfirstname'},
                                  generation => $env{'form.cgeneration'},
                                  id         => $env{'form.cid'},
                                );
               }
               if (($namechanged && $namechgresult eq 'ok') || 
                   ($quotachanged && $quotachgresult 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",             
Line 870  ENDMODIFYUSERHEAD Line 1882  ENDMODIFYUSERHEAD
                              'mddl' => "middle",                               'mddl' => "middle",
                              'lst'  => "last",                               'lst'  => "last",
      'gen'  => "generation",       'gen'  => "generation",
                                'id'   => "ID/Student number",
                                'mail' => "permanent e-mail",
                                'disk' => "disk space allocated to portfolio files",
                              'prvs' => "Previous",                               'prvs' => "Previous",
                              'chto' => "Changed To"                               'chto' => "Changed To"
    );     );
                   $r->print('<h4>'.$lt{'uic'}.'</h4>'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row());
                 $r->print(<<"END");                  $r->print(<<"END");
 <table border="2">      <th>&nbsp;</th>
 <caption>$lt{'uic'}</caption>  
 <tr><th>&nbsp;</th>  
     <th>$lt{'frst'}</th>      <th>$lt{'frst'}</th>
     <th>$lt{'mddl'}</th>      <th>$lt{'mddl'}</th>
     <th>$lt{'lst'}</th>      <th>$lt{'lst'}</th>
     <th>$lt{'gen'}</th></tr>      <th>$lt{'gen'}</th>
 <tr><td>$lt{'prvs'}</td>      <th>$lt{'id'}</th>
       <th>$lt{'mail'}</th>
   END
                   if ($showquota) {
                       $r->print("
       <th>$lt{'disk'}</th>\n");
                   }
                   $r->print(&Apache::loncommon::end_data_table_header_row().
                             &Apache::loncommon::start_data_table_row());
                   $r->print(<<"END");
       <td><b>$lt{'prvs'}</b></td>
     <td>$userenv{'firstname'}  </td>      <td>$userenv{'firstname'}  </td>
     <td>$userenv{'middlename'} </td>      <td>$userenv{'middlename'} </td>
     <td>$userenv{'lastname'}   </td>      <td>$userenv{'lastname'}   </td>
     <td>$userenv{'generation'} </td></tr>      <td>$userenv{'generation'} </td>
 <tr><td>$lt{'chto'}</td>      <td>$userenv{'id'}</td>
     <td>$ENV{'form.cfirstname'}  </td>      <td>$userenv{'permanentemail'} </td>
     <td>$ENV{'form.cmiddlename'} </td>  
     <td>$ENV{'form.clastname'}   </td>  
     <td>$ENV{'form.cgeneration'} </td></tr>  
 </table>  
 END  END
                   if ($showquota) {
                       $r->print("
       <td>$oldportfolioquota Mb $olddefquotatext </td>\n");
                   }
                   $r->print(&Apache::loncommon::end_data_table_row().
                             &Apache::loncommon::start_data_table_row());
                   $r->print(<<"END");
       <td><b>$lt{'chto'}</b></td>
       <td>$env{'form.cfirstname'}  </td>
       <td>$env{'form.cmiddlename'} </td>
       <td>$env{'form.clastname'}   </td>
       <td>$env{'form.cgeneration'} </td>
       <td>$env{'form.cid'} </td>
       <td>$env{'form.cpermanentemail'} </td>
   END
                   if ($showquota) {
                       $r->print("
       <td>$newportfolioquota Mb $newdefquotatext </td>\n");
                   }
                   $r->print(&Apache::loncommon::end_data_table_row().
                             &Apache::loncommon::end_data_table().'<br />');
                   if ($env{'form.cid'} ne $userenv{'id'}) {
                       &Apache::lonnet::idput($env{'form.ccdomain'},
                            ($env{'form.ccuname'} => $env{'form.cid'}));
                       if (($recurseid) &&
                           (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
                           my $idresult = 
                               &Apache::lonuserutils::propagate_id_change(
                                   $env{'form.ccuname'},$env{'form.ccdomain'},
                                   \%userupdate);
                           $r->print('<br />'.$idresult.'<br />');
                       }
                   }
                   if (($env{'form.ccdomain'} eq $env{'user.domain'}) && 
                       ($env{'form.ccuname'} eq $env{'user.name'})) {
                       my %newenvhash;
                       foreach my $key (keys(%changeHash)) {
                           $newenvhash{'environment.'.$key} = $changeHash{$key};
                       }
                       &Apache::lonnet::appenv(%newenvhash);
                   }
             } else { # error occurred              } else { # error occurred
                 $r->print("<h2>".&mt('Unable to successfully change environment for')." ".                  $r->print('<span class="LC_error">'.&mt('Unable to successfully change environment for').' '.
                       $ENV{'form.ccuname'}." ".&mt('in domain')." ".                        $env{'form.ccuname'}.' '.&mt('in domain').' '.
                       $ENV{'form.ccdomain'}."</h2>");                        $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 but we can              # They did not want to change the users name or quota but we can
             # still tell them what the name is              # still tell them what the name and quota are 
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                            'usr'  => "User",                                                 'id'   => "ID/Student number",
                            'id'   => "in domain",                             'mail' => "Permanent e-mail",
                            'gen'  => "Generation"                             'disk' => "Disk space allocated to user's portfolio files",
        );         );
                 $r->print(<<"END");              $r->print(<<"END");
 <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2>  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} </h4>  
 <h4>$lt{'gen'}: $userenv{'generation'}</h4>  
 END  END
               if ($userenv{'permanentemail'} ne '') {
                   $r->print('<br />['.$lt{'mail'}.': '.
                             $userenv{'permanentemail'}.']');
               }
               if ($showquota) {
                   $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. 
                             $olddefquotatext.']');
               }
               $r->print('</h4>');
         }          }
           if (@mod_disallowed) {
               my ($rolestr,$contextname);
               if (@longroles > 0) {
                   $rolestr = join(', ',@longroles);
               } else {
                   $rolestr = &mt('No roles');
               }
               if ($context eq 'course') {
                   $contextname = &mt('course');
               } elsif ($context eq 'author') {
                   $contextname = &mt('co-author');
               }
               $r->print(&mt('The following fields were not updated: ').'<ul>');
               my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
               foreach my $field (@mod_disallowed) {
                   $r->print('<li>'.$fieldtitles{$field}.'</li>'."\n"); 
               }
               $r->print('</ul>');
               if (@mod_disallowed == 1) {
                   $r->print(&mt("You do not have the authority to change this field given the user's current set of active/future [_1] roles:",$contextname));
               } else {
                   $r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname));
               }
               $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.
                         &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');
           }
           $r->print($no_forceid_alert.
                     &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules));
     }      }
     ##      if ($env{'form.action'} eq 'singlestudent') {
           &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser);
       } else {
           my $rolechanges = &update_roles($r);
           if (!$rolechanges && $namechanged) {
               if ($context eq 'course') {
                   if (@userroles > 0) {
                       if (grep(/^st$/,@userroles)) {
                           my $classlistupdated =
                               &Apache::lonuserutils::update_classlist($cdom,
                                                 $cnum,$env{'form.ccdomain'},
                                          $env{'form.ccuname'},\%userupdate);
                       }
                   }
               }
           }
       }
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub update_roles {
       my ($r) = @_;
     my $now=time;      my $now=time;
       my $rolechanges = 0;
       my %disallowed;
     $r->print('<h3>'.&mt('Modifying Roles').'</h3>');      $r->print('<h3>'.&mt('Modifying Roles').'</h3>');
     foreach (keys (%ENV)) {      foreach my $key (keys (%env)) {
  next if (! $ENV{$_});   next if (! $env{$key});
           next if ($key eq 'form.action');
  # Revoke roles   # Revoke roles
  if ($_=~/^form\.rev/) {   if ($key=~/^form\.rev/) {
     if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {      if ($key=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {
 # Revoke standard role  # Revoke standard role
         $r->print(&mt('Revoking').' '.$2.' in '.$1.': <b>'.   my ($scope,$role) = ($1,$2);
                      &Apache::lonnet::revokerole($ENV{'form.ccdomain'},   my $result =
                      $ENV{'form.ccuname'},$1,$2).'</b><br>');      &Apache::lonnet::revokerole($env{'form.ccdomain'},
  if ($2 eq 'st') {   $env{'form.ccuname'},
     $1=~/^\/(\w+)\/(\w+)/;   $scope,$role);
     my $cid=$1.'_'.$2;          $r->print(&mt('Revoking [_1] in [_2]: [_3]',
     $r->print(&mt('Drop from classlist').': <b>'.        $role,$scope,'<b>'.$result.'</b>').'<br />');
  &Apache::lonnet::critical('put:'.   if ($role eq 'st') {
                              $ENV{'course.'.$cid.'.domain'}.':'.      my $result = 
                      $ENV{'course.'.$cid.'.num'}.':classlist:'.                          &Apache::lonuserutils::classlist_drop($scope,
                          &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.                              $env{'form.ccuname'},$env{'form.ccdomain'},
                              $ENV{'form.ccdomain'}).'='.      $now);
                          &Apache::lonnet::escape($now.':'),      $r->print($result);
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');  
  }   }
     }       }
     if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {      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).
  '</b><br>');   '</b><br />');
     }      }
  } elsif ($_=~/^form\.del/) {              $rolechanges ++;
     if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {   } elsif ($key=~/^form\.del/) {
         $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.      if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
                      &Apache::lonnet::assignrole($ENV{'form.ccdomain'},  # Delete standard role
                      $ENV{'form.ccuname'},$1,$2,$now,0,1).'<br>');   my ($scope,$role) = ($1,$2);
  if ($2 eq 'st') {   my $result =
     $1=~/^\/(\w+)\/(\w+)/;      &Apache::lonnet::assignrole($env{'form.ccdomain'},
     my $cid=$1.'_'.$2;   $env{'form.ccuname'},
     $r->print(&mt('Drop from classlist').': <b>'.   $scope,$role,$now,0,1);
  &Apache::lonnet::critical('put:'.          $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
                              $ENV{'course.'.$cid.'.domain'}.':'.        '<b>'.$result.'</b>').'<br />');
                      $ENV{'course.'.$cid.'.num'}.':classlist:'.   if ($role eq 'st') {
                          &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.      my $result = 
                              $ENV{'form.ccdomain'}).'='.                          &Apache::lonuserutils::classlist_drop($scope,
                          &Apache::lonnet::escape($now.':'),                              $env{'form.ccuname'},$env{'form.ccdomain'},
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');      $now);
       $r->print($result);
  }   }
     }               }
  } elsif ($_=~/^form\.ren/) {      if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
     if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {                  my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
  my $result=&Apache::lonnet::assignrole($ENV{'form.ccdomain'},  # Delete custom role
  $ENV{'form.ccuname'},$1,$2,0,$now);                  $r->print(&mt('Deleting custom role [_1] by [_2]:[_3] in [_4]',
  $r->print(&mt('Re-Enabling [_1] in [_2]: [_3]',                        $rolename,$rnam,$rdom,$url).': <b>'.
       $2,$1,$result).'<br />');                        &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
  if ($2 eq 'st') {                           $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
     $1=~/^\/(\w+)\/(\w+)/;                           0,1).'</b><br />');
     my $cid=$1.'_'.$2;              }
     $r->print(&mt('Add to classlist').': <b>'.              $rolechanges ++;
       &Apache::lonnet::critical(   } elsif ($key=~/^form\.ren/) {
   'put:'.$ENV{'course.'.$cid.'.domain'}.':'.              my $udom = $env{'form.ccdomain'};
                            $ENV{'course.'.$cid.'.num'}.':classlist:'.              my $uname = $env{'form.ccuname'};
                                    &Apache::lonnet::escape(  # Re-enable standard role
                                        $ENV{'form.ccuname'}.':'.      if ($key=~/^form\.ren\:([^\_]+)\_([^\_\.]+)$/) {
                                        $ENV{'form.ccdomain'} ).'='.                  my $url = $1;
                                    &Apache::lonnet::escape(':'.$now),                  my $role = $2;
        $ENV{'course.'.$cid.'.home'})                  my $logmsg;
       .'</b><br>');                  my $output;
                   if ($role eq 'st') {
                       if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) {
                           my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3);
                           if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) {
                               $output = "Error: $result\n";
                           } else {
                               $output = &mt('Assigning').' '.$role.' in '.$url.
                                         &mt('starting').' '.localtime($now).
                                         ': <br />'.$logmsg.'<br />'.
                                         &mt('Add to classlist').': <b>ok</b><br />';
                           }
                       }
                   } else {
       my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                  $env{'form.ccuname'},$url,$role,0,$now);
       $output = &mt('Re-enabling [_1] in [_2]: <b>[_3]</b>',
         $role,$url,$result).'<br />';
  }   }
     }                   $r->print($output);
  } elsif ($_=~/^form\.act/) {      }
     if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {  # Re-enable custom role
       if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                   my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
                   my $result = &Apache::lonnet::assigncustomrole(
                                  $env{'form.ccdomain'}, $env{'form.ccuname'},
                                  $url,$rdom,$rnam,$rolename,0,$now);
                   $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',
                             $rolename,$rnam,$rdom,$url,$result).'<br />');
               }
               $rolechanges ++;
    } elsif ($key=~/^form\.act/) {
               my $udom = $env{'form.ccdomain'};
               my $uname = $env{'form.ccuname'};
       if ($key=~/^form\.act\_($match_domain)\_($match_courseid)\_cr_cr_($match_domain)_($match_username)_([^\_]+)$/) {
                 # Activate a custom role                  # Activate a custom role
  my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);   my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);
  my $url='/'.$one.'/'.$two;   my $url='/'.$one.'/'.$two;
  my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;   my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;
  $ENV{'form.sec_'.$full}=~s/\W//g;  
  if ($ENV{'form.sec_'.$full}) {  
     $url.='/'.$ENV{'form.sec_'.$full};  
  }  
   
  my $start = ( $ENV{'form.start_'.$full} ?                   my $start = ( $env{'form.start_'.$full} ?
       $ENV{'form.start_'.$full} :                                 $env{'form.start_'.$full} :
       $now );                                $now );
  my $end   = ( $ENV{'form.end_'.$full} ?                   my $end   = ( $env{'form.end_'.$full} ?
       $ENV{'form.end_'.$full} :                                $env{'form.end_'.$full} :
       0 );                                0 );
                                                                                        
     $r->print(&mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url.                  # split multiple sections
                          ($start?', '.&mt('starting').' '.localtime($start):'').                  my %sections = ();
                          ($end?', ending '.localtime($end):'').': <b>'.                  my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);
       &Apache::lonnet::assigncustomrole(                  if ($num_sections == 0) {
  $ENV{'form.ccdomain'},$ENV{'form.ccuname'},$url,$three,$four,$five,$end,$start).                      $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));
       '</b><br>');                  } else {
     } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {      my %curr_groups =
    &Apache::longroup::coursegroups($one,$two);
                       foreach my $sec (sort {$a cmp $b} keys %sections) {
                           if (($sec eq 'none') || ($sec eq 'all') || 
                               exists($curr_groups{$sec})) {
                               $disallowed{$sec} = $url;
                               next;
                           }
                           my $securl = $url.'/'.$sec;
           $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
                       }
                   }
       } 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
  my ($one,$two,$three)=($1,$2,$3);   my ($one,$two,$three)=($1,$2,$3);
  my $start = ( $ENV{'form.start_'.$one.'_'.$two.'_'.$three} ?    my $start = ( $env{'form.start_'.$one.'_'.$two.'_'.$three} ? 
       $ENV{'form.start_'.$one.'_'.$two.'_'.$three} :         $env{'form.start_'.$one.'_'.$two.'_'.$three} : 
       $now );        $now );
  my $end   = ( $ENV{'form.end_'.$one.'_'.$two.'_'.$three} ?    my $end   = ( $env{'form.end_'.$one.'_'.$two.'_'.$three} ? 
       $ENV{'form.end_'.$one.'_'.$two.'_'.$three} :        $env{'form.end_'.$one.'_'.$two.'_'.$three} :
       0 );        0 );
  my $url='/'.$one.'/'.$two;   my $url='/'.$one.'/'.$two;
  $ENV{'form.sec_'.$one.'_'.$two.'_'.$three}=~s/\W//g;                  my $type = 'three';
  if ($ENV{'form.sec_'.$one.'_'.$two.'_'.$three}) {                  # split multiple sections
     $url.='/'.$ENV{'form.sec_'.$one.'_'.$two.'_'.$three};                  my %sections = ();
  }                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);
  # Assign the role and report it                  if ($num_sections == 0) {
  $r->print(&mt('Assigning').' '.$three.' in '.$url.                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
                          ($start?', '.&mt('starting').' '.localtime($start):'').                  } else {
                          ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.                      my %curr_groups = 
                           &Apache::lonnet::assignrole(   &Apache::longroup::coursegroups($one,$two);
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                      my $emptysec = 0;
                               $url,$three,$end,$start).                      foreach my $sec (sort {$a cmp $b} keys %sections) {
   '</b><br>');                          $sec =~ s/\W//g;
  # Handle students differently                          if ($sec ne '') {
  if ($three eq 'st') {                              if (($sec eq 'none') || ($sec eq 'all') || 
     $url=~/^\/(\w+)\/(\w+)/;                                  exists($curr_groups{$sec})) {
     my $cid=$one.'_'.$two;                                  $disallowed{$sec} = $url;
     $r->print(&mt('Add to classlist').': <b>'.                                  next;
       &Apache::lonnet::critical(                              }
   'put:'.$ENV{'course.'.$cid.'.domain'}.':'.                              my $securl = $url.'/'.$sec;
                            $ENV{'course.'.$cid.'.num'}.':classlist:'.                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));
                                    &Apache::lonnet::escape(                          } else {
                                        $ENV{'form.ccuname'}.':'.                              $emptysec = 1;
                                        $ENV{'form.ccdomain'} ).'='.                          }
                                    &Apache::lonnet::escape($end.':'.$start),                      }
        $ENV{'course.'.$cid.'.home'})                      if ($emptysec) {
       .'</b><br>');                          $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
  }                      }
     } elsif ($_=~/^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
  my $start = ( $ENV{'form.start_'.$1.'_'.$2} ?    my $start = ( $env{'form.start_'.$1.'_'.$2} ? 
       $ENV{'form.start_'.$1.'_'.$2} :         $env{'form.start_'.$1.'_'.$2} : 
       $now );        $now );
  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 $url='/'.$1.'/';
  # Assign the role and report it.                  # split multiple sections
  $r->print(&mt('Assigning').' '.$2.' in '.$url.': '.                  my %sections = ();
                          ($start?', '.&mt('starting').' '.localtime($start):'').                  my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);
                          ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.                  if ($num_sections == 0) {
                           &Apache::lonnet::assignrole(                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                  } else {
                               $url,$2,$end,$start)                      my $emptysec = 0;
   .'</b><br>');                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                           if ($sec ne '') {
                               my $securl = $url.'/'.$sec;
                               $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));
                           } else {
                               $emptysec = 1;
                           }
                       }
                       if ($emptysec) {
                           $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
                       }
                   }
     } else {      } else {
  $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br>');   $r->print('<p><span class="LC_error">'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$key.'</tt></span></p><br />');
               }
               foreach my $key (sort(keys(%disallowed))) {
                   if (($key eq 'none') || ($key eq 'all')) {  
                       $r->print('<p>'.&mt('[_1] may not be used as the name for a section, as it is a reserved word.',$key));
                   } else {
                       $r->print('<p>'.&mt('[_1] may not be used as the name for a section, as it is the name of a course group.',$key));
                   }
                   $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();
     $r->print('</body></html>');      if (!$rolechanges) {
           $r->print(&mt('No roles to modify'));
       }
       return $rolechanges;
   }
   
   sub enroll_single_student {
       my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_;
       $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
   
       # Remove non alphanumeric values from section
       $env{'form.sections'}=~s/\W//g;
   
       # Clean out any old student roles the user has in this class.
       &Apache::lonuserutils::modifystudent($env{'form.ccdomain'},
            $env{'form.ccuname'},$env{'request.course.id'},undef,$uhome);
       my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form();
       my $enroll_result =
           &Apache::lonnet::modify_student_enrollment($env{'form.ccdomain'},
               $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'},
               $env{'form.cmiddlename'},$env{'form.clastname'},
               $env{'form.generation'},$env{'form.sections'},$enddate,
               $startdate,'manual',undef,$env{'request.course.id'});
       if ($enroll_result =~ /^ok/) {
           $r->print(&mt('<b>[_1]</b> enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'}));
           if ($env{'form.sections'} ne '') {
               $r->print(' '.&mt('in section [_1]',$env{'form.sections'}));
           }
           my ($showstart,$showend);
           if ($startdate <= $now) {
               $showstart = &mt('Access starts immediately');
           } else {
               $showstart = &mt('Access starts: ').&Apache::lonlocal::locallocaltime($startdate);
           }
           if ($enddate == 0) {
               $showend = &mt('ends: no ending date');
           } else {
               $showend = &mt('ends: ').&Apache::lonlocal::locallocaltime($enddate);
           }
           $r->print('.<br />'.$showstart.'; '.$showend);
           if ($startdate <= $now && !$newuser) {
               $r->print("<p> ".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."</p>");
           }
       } else {
           $r->print(&mt('unable to enroll').": ".$enroll_result);
       }
       return;
   }
   
   sub get_defaultquota_text {
       my ($settingstatus) = @_;
       my $defquotatext; 
       if ($settingstatus eq '') {
           $defquotatext = &mt('(default)');
       } else {
           my ($usertypes,$order) =
               &Apache::lonnet::retrieve_inst_usertypes($env{'form.ccdomain'});
           if ($usertypes->{$settingstatus} eq '') {
               $defquotatext = &mt('(default)');
           } else {
               $defquotatext = &mt('(default for [_1])',$usertypes->{$settingstatus});
           }
       }
       return $defquotatext;
   }
   
   sub update_result_form {
       my ($uhome) = @_;
       my $outcome = 
       '<form name="userupdate" method="post" />'."\n";
       foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') {
           $outcome .= '<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n";
       }
       if ($env{'form.origname'} ne '') {
           $outcome .= '<input type="hidden" name="origname" value="'.$env{'form.origname'}.'" />'."\n";
       }
       foreach my $item ('sortby','seluname','seludom') {
           if (exists($env{'form.'.$item})) {
               $outcome .= '<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n";
           }
       }
       if ($uhome eq 'no_host') {
           $outcome .= '<input type="hidden" name="forcenewuser" value="1" />'."\n";
       }
       $outcome .= '<input type="hidden" name="phase" value="" />'."\n".
                   '<input type ="hidden" name="currstate" value="" />'."\n".
                   '<input type ="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
                   '</form>';
       return $outcome;
   }
   
   sub quota_admin {
       my ($setquota,$changeHash) = @_;
       my $quotachanged;
       if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
           # Current user has quota modification privileges
           $quotachanged = 1;
           $changeHash->{'portfolioquota'} = $setquota;
       }
       return $quotachanged;
   }
   
   sub build_roles {
       my ($sectionstr,$sections,$role) = @_;
       my $num_sections = 0;
       if ($sectionstr=~ /,/) {
           my @secnums = split/,/,$sectionstr;
           if ($role eq 'st') {
               $secnums[0] =~ s/\W//g;
               $$sections{$secnums[0]} = 1;
               $num_sections = 1;
           } else {
               foreach my $sec (@secnums) {
                   $sec =~ ~s/\W//g;
                   if (!($sec eq "")) {
                       if (exists($$sections{$sec})) {
                           $$sections{$sec} ++;
                       } else {
                           $$sections{$sec} = 1;
                           $num_sections ++;
                       }
                   }
               }
           }
       } else {
           $sectionstr=~s/\W//g;
           unless ($sectionstr eq '') {
               $$sections{$sectionstr} = 1;
               $num_sections ++;
           }
       }
   
       return $num_sections;
 }  }
   
 # ========================================================== Custom Role Editor  # ========================================================== Custom Role Editor
   
 sub custom_role_editor {  sub custom_role_editor {
     my $r=shift;      my ($r) = @_;
     my $rolename=$ENV{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     if ($rolename eq 'make new role') {      if ($rolename eq 'make new role') {
  $rolename=$ENV{'form.newrolename'};   $rolename=$env{'form.newrolename'};
     }      }
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     unless ($rolename) {      if (!$rolename || $env{'form.phase'} eq 'pickrole') {
  &print_username_entry_form($r);   &print_username_entry_form($r);
         return;          return;
     }      }
   # ------------------------------------------------------- What can be assigned?
     $r->print(&Apache::loncommon::bodytag(      my %full=();
                      'Create Users, Change User Privileges').'<h2>');      my %courselevel=();
       my %courselevelcurrent=();
     my $syspriv='';      my $syspriv='';
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
       my $body_top;
       my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]);
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
       $body_top .= '<h2>';
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $body_top .= &mt('Existing Role').' "';
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
  ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);   ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);
     } else {      } else {
  $r->print(&mt('New Role').' "');   $body_top .= &mt('New Role').' "';
  $roledef='';   $roledef='';
     }      }
     $r->print($rolename.'"</h2>');      $body_top .= $rolename.'"</h2>';
 # ------------------------------------------------------- What can be assigned?      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
     my %full=();   my ($priv,$restrict)=split(/\&/,$item);
     my %courselevel=();          if (!$restrict) { $restrict='F'; }
     my %courselevelcurrent=();  
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {  
  my ($priv,$restrict)=split(/\&/,$_);  
         unless ($restrict) { $restrict='F'; }  
         $courselevel{$priv}=$restrict;          $courselevel{$priv}=$restrict;
         if ($coursepriv=~/\:$priv/) {          if ($coursepriv=~/\:$priv/) {
     $courselevelcurrent{$priv}=1;      $courselevelcurrent{$priv}=1;
Line 1124  sub custom_role_editor { Line 2437  sub custom_role_editor {
     }      }
     my %domainlevel=();      my %domainlevel=();
     my %domainlevelcurrent=();      my %domainlevelcurrent=();
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict='F'; }          if (!$restrict) { $restrict='F'; }
         $domainlevel{$priv}=$restrict;          $domainlevel{$priv}=$restrict;
         if ($dompriv=~/\:$priv/) {          if ($dompriv=~/\:$priv/) {
     $domainlevelcurrent{$priv}=1;      $domainlevelcurrent{$priv}=1;
Line 1135  sub custom_role_editor { Line 2448  sub custom_role_editor {
     }      }
     my %systemlevel=();      my %systemlevel=();
     my %systemlevelcurrent=();      my %systemlevelcurrent=();
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict='F'; }          if (!$restrict) { $restrict='F'; }
         $systemlevel{$priv}=$restrict;          $systemlevel{$priv}=$restrict;
         if ($syspriv=~/\:$priv/) {          if ($syspriv=~/\:$priv/) {
     $systemlevelcurrent{$priv}=1;      $systemlevelcurrent{$priv}=1;
  }   }
  $full{$priv}=1;   $full{$priv}=1;
     }      }
       my ($jsback,$elements) = &crumb_utilities();
       my $button_code = "\n";
       my $head_script = "\n";
       $head_script .= '<script type="text/javascript">'."\n";
       my @template_roles = ("cc","in","ta","ep","st");
       foreach my $role (@template_roles) {
           $head_script .= &make_script_template($role);
           $button_code .= &make_button_code($role);
       }
       $head_script .= "\n".$jsback."\n".'</script>'."\n";
       $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.form1,'pickrole','')",
          text=>"Pick custom role",
          faq=>282,bug=>'Instructor Interface',},
         {href=>"javascript:backPage(document.form1,'','')",
            text=>"Edit custom role",
            faq=>282,bug=>'Instructor Interface',});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
   
       $r->print($body_top);
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
     'prv'  => "Privilege",      'prv'  => "Privilege",
     '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($button_code);
       $r->print('</form>');
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form 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" />
 <input type="hidden" name="rolename" value="$rolename" />  <input type="hidden" name="rolename" value="$rolename" />
 <table border="2">  
 <tr><th>$lt{'prv'}</th><th>$lt{'crl'}</th><th>$lt{'dml'}</th>  
 <th>$lt{'ssl'}</th></tr>  
 ENDCCF  ENDCCF
     foreach (sort keys %full) {      $r->print(&Apache::loncommon::start_data_table().
  $r->print('<tr><td>'.&Apache::lonnet::plaintext($_).'</td><td>'.                &Apache::loncommon::start_data_table_header_row(). 
     ($courselevel{$_}?'<input type="checkbox" name="'.$_.':c" '.  '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.
     ($courselevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').  '</th><th>'.$lt{'ssl'}.'</th>'.
                 &Apache::loncommon::end_data_table_header_row());
       foreach my $priv (sort keys %full) {
           my $privtext = &Apache::lonnet::plaintext($priv);
           $r->print(&Apache::loncommon::start_data_table_row().
             '<td>'.$privtext.'</td><td>'.
       ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c" '.
       ($courselevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>'.
     ($domainlevel{$_}?'<input type="checkbox" name="'.$_.':d" '.      ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d" '.
     ($domainlevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').      ($domainlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>'.
     ($systemlevel{$_}?'<input type="checkbox" name="'.$_.':s" '.      ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s" '.
     ($systemlevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').      ($systemlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td></tr>');      '</td>'.
                &Apache::loncommon::end_data_table_row());
       }
       $r->print(&Apache::loncommon::end_data_table().
      '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
      '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.
      '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".   
      '<input type="reset" value="'.&mt("Reset").'" />'."\n".
      '<input type="submit" value="'.&mt('Define Role').'" /></form>'.
         &Apache::loncommon::end_page());
   }
   # --------------------------------------------------------
   sub make_script_template {
       my ($role) = @_;
       my %full_c=();
       my %full_d=();
       my %full_s=();
       my $return_script;
       foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
           my ($priv,$restrict)=split(/\&/,$item);
           $full_c{$priv}=1;
       }
       foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
           my ($priv,$restrict)=split(/\&/,$item);
           $full_d{$priv}=1;
       }
       foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
           my ($priv,$restrict)=split(/\&/,$item);
           $full_s{$priv}=1;
       }
       $return_script .= 'function set_'.$role.'() {'."\n";
       my @temp = split(/:/,$Apache::lonnet::pr{$role.':c'});
       my %role_c;
       foreach my $priv (@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_c{$priv_item} = 1;
       }
       foreach my $priv_item (keys(%full_c)) {
           my ($priv, $dummy) = split(/\&/,$priv_item);
           if (exists($role_c{$priv})) {
               $return_script .= "document.form1.$priv"."_c.checked = true;\n";
           } else {
               $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)) {
           my ($priv, $dummy) = split(/\&/,$priv_item);
           if (exists($role_d{$priv})) {
               $return_script .= "document.form1.$priv"."_d.checked = true;\n";
           } else {
               $return_script .= "document.form1.$priv"."_d.checked = false;\n";
           }
     }      }
     $r->print(      my %role_s;
    '<table><input type="submit" value="'.&mt('Define Role').'" /></form></body></html>');      @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)) {
           my ($priv, $dummy) = split(/\&/,$priv_item);
           if (exists($role_s{$priv})) {
               $return_script .= "document.form1.$priv"."_s.checked = true;\n";
           } else {
               $return_script .= "document.form1.$priv"."_s.checked = false;\n";
           }
       }
       $return_script .= '}'."\n";
       return ($return_script);
   }
   # ----------------------------------------------------------
   sub make_button_code {
       my ($role) = @_;
       my $label = &Apache::lonnet::plaintext($role);
       my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';    
       return ($button_code);
 }  }
   
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my $r=shift;      my ($r) = @_;
       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) {
     unless ($rolename) {   &custom_role_editor($r);
  &print_username_entry_form($r);  
         return;          return;
     }      }
       my ($jsback,$elements) = &crumb_utilities();
       my $jscript = '<script type="text/javascript">'.$jsback."\n".'</script>';
   
       $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
       &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"javascript:backPage(document.customresult,'pickrole','')",
             text=>"Pick custom role",
             faq=>282,bug=>'Instructor Interface',},
            {href=>"javascript:backPage(document.customresult,'selected_custom_edit','')",
             text=>"Edit custom role",
             faq=>282,bug=>'Instructor Interface',},
            {href=>"javascript:backPage(document.customresult,'set_custom_roles','')",
             text=>"Result",
             faq=>282,bug=>'Instructor Interface',});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
   
     $r->print(&Apache::loncommon::bodytag(  
                      'Create Users, Change User Privileges').'<h2>');  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
       $r->print('<h3>');
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $r->print(&mt('Existing Role').' "');
     } else {      } else {
  $r->print(&mt('New Role').' "');   $r->print(&mt('New Role').' "');
  $roledef='';   $roledef='';
     }      }
     $r->print($rolename.'"</h2>');      $r->print($rolename.'"</h3>');
 # ------------------------------------------------------- What can be assigned?  # ------------------------------------------------------- What can be assigned?
     my $sysrole='';      my $sysrole='';
     my $domrole='';      my $domrole='';
     my $courole='';      my $courole='';
   
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict=''; }          if (!$restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':c'}) {          if ($env{'form.'.$priv.'_c'}) {
     $courole.=':'.$_;      $courole.=':'.$item;
  }   }
     }      }
   
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict=''; }          if (!$restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':d'}) {          if ($env{'form.'.$priv.'_d'}) {
     $domrole.=':'.$_;      $domrole.=':'.$item;
  }   }
     }      }
   
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict=''; }          if (!$restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':s'}) {          if ($env{'form.'.$priv.'_s'}) {
     $sysrole.=':'.$_;      $sysrole.=':'.$item;
  }   }
     }      }
     $r->print('<br />Defining Role: '.      $r->print('<br />Defining Role: '.
    &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));     &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));
     if ($ENV{'request.course.id'}) {      if ($env{'request.course.id'}) {
         my $url='/'.$ENV{'request.course.id'};          my $url='/'.$env{'request.course.id'};
         $url=~s/\_/\//g;          $url=~s/\_/\//g;
  $r->print('<br />'.&mt('Assigning Role to Self').': '.   $r->print('<br />'.&mt('Assigning Role to Self').': '.
       &Apache::lonnet::assigncustomrole($ENV{'user.domain'},        &Apache::lonnet::assigncustomrole($env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $url,   $url,
  $ENV{'user.domain'},   $env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $rolename));   $rolename));
     }      }
     $r->print('</body></html>');      $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::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
       my $context;
       if ($env{'request.course.id'}) {
           $context = 'course';
       } elsif ($env{'request.role'} =~ /^au\./) {
           $context = 'author';
       } else {
           $context = 'domain';
       }
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
           ['action','state','callingform','roletype','showrole','bulkaction']);
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       if ($env{'form.action'} ne 'dateselect') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"/adm/createuser",
                 text=>"User Management"});
       }
       my ($permission,$allowed) = 
           &Apache::lonuserutils::get_permission($context);
       if (!$allowed) {
           $env{'user.error.msg'}=
               "/adm/createuser:cst:0:0:Cannot create/modify user data ".
                                    "or view user status.";
           return HTTP_NOT_ACCEPTABLE;
       }
   
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
   
       # Main switch on form.action and form.state, as appropriate
       if (! exists($env{'form.action'})) {
           $r->print(&header());
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
           $r->print(&print_main_menu($permission,$context));
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=upload&state=',
                 text=>"Upload Users List"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List',
                                                      'User_Management_Upload'));
           $r->print('<form name="studentform" method="post" '.
                     'enctype="multipart/form-data" '.
                     ' action="/adm/createuser">'."\n");
           if (! exists($env{'form.state'})) {
               &Apache::lonuserutils::print_first_users_upload_form($r,$context);
           } elsif ($env{'form.state'} eq 'got_file') {
               &Apache::lonuserutils::print_upload_manager_form($r,$context,
                                                                $permission);
           } elsif ($env{'form.state'} eq 'enrolling') {
               if ($env{'form.datatoken'}) {
                   &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);
               }
           } else {
               &Apache::lonuserutils::print_first_users_upload_form($r,$context);
           }
           $r->print('</form>'.&Apache::loncommon::end_page());
       } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'}
                eq 'singlestudent')) && ($permission->{'cusr'})) {
           my $phase = $env{'form.phase'};
           my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
    &Apache::loncreateuser::restore_prev_selections();
    my $srch;
    foreach my $item (@search) {
       $srch->{$item} = $env{'form.'.$item};
    }
   
     if ((&Apache::lonnet::allowed('cta',$ENV{'request.course.id'})) ||          if (($phase eq 'get_user_info') || ($phase eq 'userpicked') ||
         (&Apache::lonnet::allowed('cin',$ENV{'request.course.id'})) ||               ($phase eq 'createnewuser')) {
         (&Apache::lonnet::allowed('ccr',$ENV{'request.course.id'})) ||               if ($env{'form.phase'} eq 'createnewuser') {
         (&Apache::lonnet::allowed('cep',$ENV{'request.course.id'})) ||                  my $response;
         (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) ||                  if ($env{'form.srchterm'} !~ /^$match_username$/) {
         (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) {                      my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
        &Apache::loncommon::content_type($r,'text/html');                      $env{'form.phase'} = '';
        $r->send_http_header;                      &print_username_entry_form($r,$context,$response,$srch);
        unless ($ENV{'form.phase'}) {                  } else {
    &print_username_entry_form($r);                      my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
        }                      my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
        if ($ENV{'form.phase'} eq 'get_user_info') {                      &print_user_modification_page($r,$ccuname,$ccdomain,
            &print_user_modification_page($r);                                                    $srch,$response,$context,
        } elsif ($ENV{'form.phase'} eq 'update_user_data') {                                                    $permission);
            &update_user_data($r);                  }
        } elsif ($ENV{'form.phase'} eq 'selected_custom_edit') {              } elsif ($env{'form.phase'} eq 'get_user_info') {
            &custom_role_editor($r);                  my ($currstate,$response,$forcenewuser,$results) = 
        } elsif ($ENV{'form.phase'} eq 'set_custom_roles') {                      &user_search_result($context,$srch);
    &set_custom_role($r);                  if ($env{'form.currstate'} eq 'modify') {
        }                      $currstate = $env{'form.currstate'};
    } else {                  }
       $ENV{'user.error.msg'}=                  if ($currstate eq 'select') {
         "/adm/createuser:mau:0:0:Cannot modify user data";                      my $operation; 
       return HTTP_NOT_ACCEPTABLE;                       if ($env{'form.action'} eq 'singleuser') {
    }                          $operation = 'createuser';
    return OK;                      } elsif ($env{'form.action'} eq 'singlestudent') {
 }                           $operation = 'enrollstudent';
                       }
                       &print_user_selection_page($r,$response,$srch,$results,
                                                  $operation,\@search,$context);
                   } elsif ($currstate eq 'modify') {
                       my ($ccuname,$ccdomain);
                       if (($srch->{'srchby'} eq 'uname') && 
                           ($srch->{'srchtype'} eq 'exact')) {
                           $ccuname = $srch->{'srchterm'};
                           $ccdomain= $srch->{'srchdomain'};
                       } else {
                           my @matchedunames = keys(%{$results});
                           ($ccuname,$ccdomain) = split(/:/,$matchedunames[0]);
                       }
                       $ccuname =&LONCAPA::clean_username($ccuname);
                       $ccdomain=&LONCAPA::clean_domain($ccdomain);
                       if ($env{'form.forcenewuser'}) {
                           $response = '';
                       }
                       &print_user_modification_page($r,$ccuname,$ccdomain,
                                                     $srch,$response,$context,
                                                     $permission);
                   } elsif ($currstate eq 'query') {
                       &print_user_query_page($r,'createuser');
                   } else {
                       &print_username_entry_form($r,$context,$response,$srch,
                                                  $forcenewuser);
                   }
               } elsif ($env{'form.phase'} eq 'userpicked') {
                   my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
                   my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
                   &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
                                                 $context,$permission);
               }
           } elsif ($env{'form.phase'} eq 'update_user_data') {
               &update_user_data($r,$context);
           } else {
               &print_username_entry_form($r,$context,undef,$srch);
           }
       } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
           if ($env{'form.phase'} eq 'set_custom_roles') {
               &set_custom_role($r);
           } else {
               &custom_role_editor($r);
           }
       } elsif (($env{'form.action'} eq 'listusers') && 
                ($permission->{'view'} || $permission->{'cusr'})) {
           if ($env{'form.phase'} eq 'bulkchange') {
               &Apache::lonhtmlcommon::add_breadcrumb
                   ({href=>'/adm/createuser?action=listusers',
                     text=>"List Users"},
                   {href=>"/adm/createuser",
                     text=>"Result"});
               my $setting = $env{'form.roletype'};
               my $choice = $env{'form.bulkaction'};
               $r->print(&header());
               $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users",
                                                             'User_Management_List'));
               if ($permission->{'cusr'}) {
                   &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice);
                   $r->print('<p><a href="/adm/createuser?action=listusers">'.&mt('Display User Lists').'</a>');
                   $r->print(&Apache::loncommon::end_page());
               } else {
                   $r->print(&mt('You are not authorized to make bulk changes to user roles'));
                   $r->print(&Apache::loncommon::end_page());
               }
           } else {
               &Apache::lonhtmlcommon::add_breadcrumb
                   ({href=>'/adm/createuser?action=listusers',
                     text=>"List Users"});
               my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
               my $formname = 'studentform';
               if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
                   ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = 
                       &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
                                                               $formname);
                   $jscript .= &verify_user_display();
                   my $js = &add_script($jscript).$cb_jscript;
                   my $loadcode = 
                       &Apache::lonuserutils::course_selector_loadcode($formname);
                   if ($loadcode ne '') {
                       $r->print(&header($js,{'onload' => $loadcode,}));
                   } else {
                       $r->print(&header($js));
                   }
               } else {
                   $r->print(&header(&add_script(&verify_user_display())));
               }
               $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
                                                             'User_Management_List'));
               &Apache::lonuserutils::print_userlist($r,undef,$permission,$context,
                            $formname,$totcodes,$codetitles,$idlist,$idlist_titles);
               $r->print(&Apache::loncommon::end_page());
           }
       } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=drop',
                 text=>"Drop Students"});
           if (!exists($env{'form.state'})) {
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                             'Course_Drop_Student'));
   
               &Apache::lonuserutils::print_drop_menu($r,$context,$permission);
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=drop',
                 text=>"Result"});
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                             'Course_Drop_Student'));
               &Apache::lonuserutils::update_user_list($r,$context,undef,
                                                       $env{'form.action'});
           }
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'dateselect') {
           if ($permission->{'cusr'}) {
               $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
                         &Apache::lonuserutils::date_section_selector($context,
                                                                      $permission).
                         &Apache::loncommon::end_page());
           } else {
               $r->print(&header().
                        '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'. 
                        &Apache::loncommon::end_page());
           }
       } else {
           $r->print(&header());
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
           $r->print(&print_main_menu($permission,$context));
           $r->print(&Apache::loncommon::end_page());
       }
       return OK;
   }
   
   sub header {
       my ($jscript,$loaditems,$args) = @_;
       my $start_page;
       if (ref($loaditems) eq 'HASH') {
           $start_page=&Apache::loncommon::start_page('User Management',$jscript,{'add_entries' => $loaditems});
       } else {
           $start_page=&Apache::loncommon::start_page('User Management',$jscript,$args);
       }
       return $start_page;
   }
   
   sub add_script {
       my ($js) = @_;
       return '<script type="text/javascript">'."\n".$js."\n".'</script>';
   }
   
   sub verify_user_display {
       my $output = <<"END";
   
   function display_update() {
       document.studentform.action.value = 'listusers';
       document.studentform.phase.value = 'display';
       document.studentform.submit();
   }
   
   END
       return $output;
   
   }
   
   ###############################################################
   ###############################################################
   #  Menu Phase One
   sub print_main_menu {
       my ($permission,$context) = @_;
       my %links = (
                          domain => {
                                      upload => 'Upload a File of Users',
                                      singleuser => 'Add/Modify a Single User',
                                      listusers => 'Manage Multiple Users',
                                    },
                          author => {
                                      upload => 'Upload a File of Co-authors',
                                      singleuser => 'Add/Modify a Single Co-author',
                                      listusers => 'Display Co-authors and Manage Multiple Users',
                                    },
                          course => {
                                      upload => 'Upload a File of Course Users',
                                      singleuser => 'Add/Modify a Single Course User',
                                      listusers => 'Display Class Lists and Manage Multiple Users',
                                    },
                        );
       my @menu =
           (
             { text => $links{$context}{'upload'},
               help => 'User_Management_Upload',
               action => 'upload',
               permission => $permission->{'cusr'},
               },
             { text => $links{$context}{'singleuser'}, 
               help => 'User_Management_Single_User',
               action => 'singleuser',
               permission => $permission->{'cusr'},
               },
             { text => $links{$context}{'listusers'},
               help => 'User_Management_List',
               action => 'listusers',
               permission => ($permission->{'view'} || $permission->{'cusr'}),
             },
           );
       if ($context eq 'domain' || $context eq 'course') {
           my $customlink =  { text => 'Edit Custom Roles',
                               help => 'Custom_Role_Edit',
                               action => 'custom',
                               permission => $permission->{'custom'},
                             };
           push(@menu,$customlink);
       }
       if ($context eq 'course') {
           my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
           my @courselinks =
               (
                 { text => 'Enroll a Single Student',
                    help => 'Course_Single_Student',
                    action => 'singlestudent',
                    permission => $permission->{'cusr'},
                    },
                 { text => 'Drop Students',
                   help => 'Course_Drop_Student',
                   action => 'drop',
                   permission => $permission->{'cusr'},
                 });
           if (!exists($permission->{'cusr_section'})) {
               push(@courselinks,
                  { text => 'Automated Student Enrollment Manager',
                    permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                   && $permission->{'cusr'}),
                    url  => '/adm/populate',
                    });
           }
           push(@courselinks,
                  { text => 'Manage Course Groups',
                    help => 'Course_Manage_Group',
                    permission => $permission->{'grp_manage'},
                    url => '/adm/coursegroups?refpage=cusr',
                  });
           push(@menu,@courselinks);
       }
       my $menu_html = '';
       foreach my $menu_item (@menu) {
           next if (! $menu_item->{'permission'});
           $menu_html.='<p>';
           $menu_html.='<font size="+1">';
           if (exists($menu_item->{'url'})) {
               $menu_html.=qq{<a href="$menu_item->{'url'}">};
           } else {
               $menu_html.=
                   qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};
           }
           $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
           if (exists($menu_item->{'help'})) {
               $menu_html.=
                   &Apache::loncommon::help_open_topic($menu_item->{'help'});
           }
           $menu_html.='</p>';
       }
       return $menu_html;
   }
   
   sub restore_prev_selections {
       my %saveable_parameters = ('srchby'   => 'scalar',
          'srchin'   => 'scalar',
          'srchtype' => 'scalar',
          );
       &Apache::loncommon::store_settings('user','user_picker',
          \%saveable_parameters);
       &Apache::loncommon::restore_settings('user','user_picker',
    \%saveable_parameters);
   }
   
 #-------------------------------------------------- functions for &phase_two  #-------------------------------------------------- functions for &phase_two
   sub user_search_result {
       my ($context,$srch) = @_;
       my %allhomes;
       my %inst_matches;
       my %srch_results;
       my ($response,$currstate,$forcenewuser,$dirsrchres);
       $srch->{'srchterm'} =~ s/\s+/ /g;
       if ($srch->{'srchby'} !~ /^(uname|lastname|lastfirst)$/) {
           $response = &mt('Invalid search.');
       }
       if ($srch->{'srchin'} !~ /^(crs|dom|alc|instd)$/) {
           $response = &mt('Invalid search.');
       }
       if ($srch->{'srchtype'} !~ /^(exact|contains|begins)$/) {
           $response = &mt('Invalid search.');
       }
       if ($srch->{'srchterm'} eq '') {
           $response = &mt('You must enter a search term.');
       }
       if ($srch->{'srchterm'} =~ /^\s+$/) {
           $response = &mt('Your search term must contain more than just spaces.');
       }
       if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'instd')) {
           if (($srch->{'srchdomain'} eq '') || 
       ! (&Apache::lonnet::domain($srch->{'srchdomain'}))) {
               $response = &mt('You must specify a valid domain when searching in a domain or institutional directory.')
           }
       }
       if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') ||
           ($srch->{'srchin'} eq 'alc')) {
           if ($srch->{'srchby'} eq 'uname') {
               if ($srch->{'srchterm'} !~ /^$match_username$/) {
                   $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
               }
           }
       }
       if ($response ne '') {
           $response = '<span class="LC_warning">'.$response.'</span>';
       }
       if ($srch->{'srchin'} eq 'instd') {
           my $instd_chk = &directorysrch_check($srch);
           if ($instd_chk ne 'ok') {
               $response = '<span class="LC_warning">'.$instd_chk.'</span>'.
                           '<br />'.&mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').'<br /><br />';
           }
       }
       if ($response ne '') {
           return ($currstate,$response);
       }
       if ($srch->{'srchby'} eq 'uname') {
           if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs')) {
               if ($env{'form.forcenew'}) {
                   if ($srch->{'srchdomain'} ne $env{'request.role.domain'}) {
                       my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});
                       if ($uhome eq 'no_host') {
                           my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description');
                           my $showdom = &display_domain_info($env{'request.role.domain'});
                           $response = &mt('New users can only be created in the domain to which your current role belongs - [_1].',$showdom);
                       } else {
                           $currstate = 'modify';
                       }
                   } else {
                       $currstate = 'modify';
                   }
               } else {
                   if ($srch->{'srchin'} eq 'dom') {
                       if ($srch->{'srchtype'} eq 'exact') {
                           my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});
                           if ($uhome eq 'no_host') {
                               ($currstate,$response,$forcenewuser) =
                                   &build_search_response($context,$srch,%srch_results);
                           } else {
                               $currstate = 'modify';
                           }
                       } else {
                           %srch_results = &Apache::lonnet::usersearch($srch);
                           ($currstate,$response,$forcenewuser) =
                               &build_search_response($context,$srch,%srch_results);
                       }
                   } else {
                       my $courseusers = &get_courseusers();
                       if ($srch->{'srchtype'} eq 'exact') {
                           if (exists($courseusers->{$srch->{'srchterm'}.':'.$srch->{'srchdomain'}})) {
                               $currstate = 'modify';
                           } else {
                               ($currstate,$response,$forcenewuser) =
                                   &build_search_response($context,$srch,%srch_results);
                           }
                       } else {
                           foreach my $user (keys(%$courseusers)) {
                               my ($cuname,$cudomain) = split(/:/,$user);
                               if ($cudomain eq $srch->{'srchdomain'}) {
                                   my $matched = 0;
                                   if ($srch->{'srchtype'} eq 'begins') {
                                       if ($cuname =~ /^\Q$srch->{'srchterm'}\E/i) {
                                           $matched = 1;
                                       }
                                   } else {
                                       if ($cuname =~ /\Q$srch->{'srchterm'}\E/i) {
                                           $matched = 1;
                                       }
                                   }
                                   if ($matched) {
                                       $srch_results{$user} = 
    {&Apache::lonnet::get('environment',
        ['firstname',
         'lastname',
         'permanentemail'],
         $cudomain,$cuname)};
                                   }
                               }
                           }
                           ($currstate,$response,$forcenewuser) =
                               &build_search_response($context,$srch,%srch_results);
                       }
                   }
               }
           } elsif ($srch->{'srchin'} eq 'alc') {
               $currstate = 'query';
           } elsif ($srch->{'srchin'} eq 'instd') {
               ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch);
               if ($dirsrchres eq 'ok') {
                   ($currstate,$response,$forcenewuser) = 
                       &build_search_response($context,$srch,%srch_results);
               } else {
                   my $showdom = &display_domain_info($srch->{'srchdomain'});
                   $response = '<span class="LC_warning">'.
                       &mt('Institutional directory search is not available in domain: [_1]',$showdom).
                       '</span><br />'.
                       &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').
                       '<br /><br />'; 
               }
           }
       } else {
           if ($srch->{'srchin'} eq 'dom') {
               %srch_results = &Apache::lonnet::usersearch($srch);
               ($currstate,$response,$forcenewuser) = 
                   &build_search_response($context,$srch,%srch_results); 
           } elsif ($srch->{'srchin'} eq 'crs') {
               my $courseusers = &get_courseusers(); 
               foreach my $user (keys(%$courseusers)) {
                   my ($uname,$udom) = split(/:/,$user);
                   my %names = &Apache::loncommon::getnames($uname,$udom);
                   my %emails = &Apache::loncommon::getemails($uname,$udom);
                   if ($srch->{'srchby'} eq 'lastname') {
                       if ((($srch->{'srchtype'} eq 'exact') && 
                            ($names{'lastname'} eq $srch->{'srchterm'})) || 
                           (($srch->{'srchtype'} eq 'begins') &&
                            ($names{'lastname'} =~ /^\Q$srch->{'srchterm'}\E/i)) ||
                           (($srch->{'srchtype'} eq 'contains') &&
                            ($names{'lastname'} =~ /\Q$srch->{'srchterm'}\E/i))) {
                           $srch_results{$user} = {firstname => $names{'firstname'},
                                               lastname => $names{'lastname'},
                                               permanentemail => $emails{'permanentemail'},
                                              };
                       }
                   } elsif ($srch->{'srchby'} eq 'lastfirst') {
                       my ($srchlast,$srchfirst) = split(/,/,$srch->{'srchterm'});
                       $srchlast =~ s/\s+$//;
                       $srchfirst =~ s/^\s+//;
                       if ($srch->{'srchtype'} eq 'exact') {
                           if (($names{'lastname'} eq $srchlast) &&
                               ($names{'firstname'} eq $srchfirst)) {
                               $srch_results{$user} = {firstname => $names{'firstname'},
                                                   lastname => $names{'lastname'},
                                                   permanentemail => $emails{'permanentemail'},
   
                                              };
                           }
                       } elsif ($srch->{'srchtype'} eq 'begins') {
                           if (($names{'lastname'} =~ /^\Q$srchlast\E/i) &&
                               ($names{'firstname'} =~ /^\Q$srchfirst\E/i)) {
                               $srch_results{$user} = {firstname => $names{'firstname'},
                                                   lastname => $names{'lastname'},
                                                   permanentemail => $emails{'permanentemail'},
                                                  };
                           }
                       } else {
                           if (($names{'lastname'} =~ /\Q$srchlast\E/i) && 
                               ($names{'firstname'} =~ /\Q$srchfirst\E/i)) {
                               $srch_results{$user} = {firstname => $names{'firstname'},
                                                   lastname => $names{'lastname'},
                                                   permanentemail => $emails{'permanentemail'},
                                                  };
                           }
                       }
                   }
               }
               ($currstate,$response,$forcenewuser) = 
                   &build_search_response($context,$srch,%srch_results); 
           } elsif ($srch->{'srchin'} eq 'alc') {
               $currstate = 'query';
           } elsif ($srch->{'srchin'} eq 'instd') {
               ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch); 
               if ($dirsrchres eq 'ok') {
                   ($currstate,$response,$forcenewuser) = 
                       &build_search_response($context,$srch,%srch_results);
               } else {
                   my $showdom = &display_domain_info($srch->{'srchdomain'});                $response = '<span class="LC_warning">'.
                       &mt('Institutional directory search is not available in domain: [_1]',$showdom).
                       '</span><br />'.
                       &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').
                       '<br /><br />';
               }
           }
       }
       return ($currstate,$response,$forcenewuser,\%srch_results);
   }
   
   sub directorysrch_check {
       my ($srch) = @_;
       my $can_search = 0;
       my $response;
       my %dom_inst_srch = &Apache::lonnet::get_dom('configuration',
                                                ['directorysrch'],$srch->{'srchdomain'});
       my $showdom = &display_domain_info($srch->{'srchdomain'});
       if (ref($dom_inst_srch{'directorysrch'}) eq 'HASH') {
           if (!$dom_inst_srch{'directorysrch'}{'available'}) {
               return &mt('Institutional directory search is not available in domain: [_1]',$showdom); 
           }
           if ($dom_inst_srch{'directorysrch'}{'localonly'}) {
               if ($env{'request.role.domain'} ne $srch->{'srchdomain'}) {
                   return &mt('Institutional directory search in domain: [_1] is only allowed for users with a current role in the domain.',$showdom); 
               }
               my @usertypes = split(/:/,$env{'environment.inststatus'});
               if (!@usertypes) {
                   push(@usertypes,'default');
               }
               if (ref($dom_inst_srch{'directorysrch'}{'cansearch'}) eq 'ARRAY') {
                   foreach my $type (@usertypes) {
                       if (grep(/^\Q$type\E$/,@{$dom_inst_srch{'directorysrch'}{'cansearch'}})) {
                           $can_search = 1;
                           last;
                       }
                   }
               }
               if (!$can_search) {
                   my ($insttypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($srch->{'srchdomain'});
                   my @longtypes; 
                   foreach my $item (@usertypes) {
                       push (@longtypes,$insttypes->{$item});
                   }
                   my $insttype_str = join(', ',@longtypes); 
                   return &mt('Institutional directory search in domain: [_1] is not available to your user type: ',$showdom).$insttype_str;
               } 
           } else {
               $can_search = 1;
           }
       } else {
           return &mt('Institutional directory search has not been configured for domain: [_1]',$showdom);
       }
       my %longtext = &Apache::lonlocal::texthash (
                          uname     => 'username',
                          lastfirst => 'last name, first name',
                          lastname  => 'last name',
                          contains  => 'contains',
                          exact     => 'as exact match to',
                          begins    => 'begins with',
                      );
       if ($can_search) {
           if (ref($dom_inst_srch{'directorysrch'}{'searchby'}) eq 'ARRAY') {
               if (!grep(/^\Q$srch->{'srchby'}\E$/,@{$dom_inst_srch{'directorysrch'}{'searchby'}})) {
                   return &mt('Institutional directory search in domain: [_1] is not available for searching by "[_2]"',$showdom,$longtext{$srch->{'srchby'}});
               }
           } else {
               return &mt('Institutional directory search in domain: [_1] is not available.', $showdom);
           }
       }
       if ($can_search) {
           if (ref($dom_inst_srch{'directorysrch'}{'searchtypes'}) eq 'ARRAY') {
               if (grep(/^\Q$srch->{'srchtype'}\E/,@{$dom_inst_srch{'directorysrch'}{'searchtypes'}})) {
                   return 'ok';
               } else {
                   return &mt('Institutional directory search in domain [_1] is not available for the requested search type: "[_2]"',$showdom,$longtext{$srch->{'srchtype'}});
               }
           } else {
               if ((($dom_inst_srch{'directorysrch'}{'searchtypes'} eq 'specify') &&
                    ($srch->{'srchtype'} eq 'exact' || $srch->{'srchtype'} eq 'contains')) ||
                   ($dom_inst_srch{'directorysrch'}{'searchtypes'} eq $srch->{'srchtype'})) {
                   return 'ok';
               } else {
                   return &mt('Institutional directory search in domain [_1] is not available for the requested search type: "[_2]"',$showdom,$longtext{$srch->{'srchtype'}});
               }
           }
       }
   }
   
   sub get_courseusers {
       my %advhash;
       my $classlist = &Apache::loncoursedata::get_classlist();
       my %coursepersonnel=&Apache::lonnet::get_course_adv_roles();
       foreach my $role (sort(keys(%coursepersonnel))) {
           foreach my $user (split(/\,/,$coursepersonnel{$role})) {
       if (!exists($classlist->{$user})) {
    $classlist->{$user} = [];
       }
           }
       }
       return $classlist;
   }
   
   sub build_search_response {
       my ($context,$srch,%srch_results) = @_;
       my ($currstate,$response,$forcenewuser);
       my %names = (
             'uname' => 'username',
             'lastname' => 'last name',
             'lastfirst' => 'last name, first name',
             'crs' => 'this course',
             'dom' => 'LON-CAPA domain: ',
             'instd' => 'the institutional directory for domain: ',
       );
   
       my %single = (
                      begins   => 'A match',
                      contains => 'A match',
                      exact    => 'An exact match',
                    );
       my %nomatch = (
                      begins   => 'No match',
                      contains => 'No match',
                      exact    => 'No exact match',
                     );
       if (keys(%srch_results) > 1) {
           $currstate = 'select';
       } else {
           if (keys(%srch_results) == 1) {
               $currstate = 'modify';
               $response = &mt("$single{$srch->{'srchtype'}} was found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'});
               if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {
                   $response .= &display_domain_info($srch->{'srchdomain'});
               }
           } else {
               $response = '<span class="LC_warning">'.&mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}",$srch->{'srchterm'});
               if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {
                   $response .= &display_domain_info($srch->{'srchdomain'});
               }
               $response .= '</span>';
               if ($srch->{'srchin'} ne 'alc') {
                   $forcenewuser = 1;
                   my $cansrchinst = 0; 
                   if ($srch->{'srchdomain'}) {
                       my %domconfig = &Apache::lonnet::get_dom('configuration',['directorysrch'],$srch->{'srchdomain'});
                       if (ref($domconfig{'directorysrch'}) eq 'HASH') {
                           if ($domconfig{'directorysrch'}{'available'}) {
                               $cansrchinst = 1;
                           } 
                       }
                   }
                   if ((($srch->{'srchby'} eq 'lastfirst') || 
                        ($srch->{'srchby'} eq 'lastname')) &&
                       ($srch->{'srchin'} eq 'dom')) {
                       if ($cansrchinst) {
                           $response .= '<br />'.&mt('You may want to broaden your search to a search of the institutional directory for the domain.');
                       }
                   }
                   if ($srch->{'srchin'} eq 'crs') {
                       $response .= '<br />'.&mt('You may want to broaden your search to the selected LON-CAPA domain.');
                   }
               }
               if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $env{'request.role.domain'})) {
                   my $cancreate =
                       &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);
                   if ($cancreate) {
                       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 />';
                   } else {
                       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 />';
                   }
               }
           }
       }
       return ($currstate,$response,$forcenewuser);
   }
   
   sub display_domain_info {
       my ($dom) = @_;
       my $output = $dom;
       if ($dom ne '') { 
           my $domdesc = &Apache::lonnet::domain($dom,'description');
           if ($domdesc ne '') {
               $output .= ' <span class="LC_cusr_emph">('.$domdesc.')</span>';
           }
       }
       return $output;
   }
   
   sub crumb_utilities {
       my %elements = (
          crtuser => {
              srchterm => 'text',
              srchin => 'selectbox',
              srchby => 'selectbox',
              srchtype => 'selectbox',
              srchdomain => 'selectbox',
          },
          crtusername => {
              srchterm => 'text',
              srchdomain => 'selectbox',
          },
          docustom => {
              rolename => 'selectbox',
              newrolename => 'textbox',
          },
          studentform => {
              srchterm => 'text',
              srchin => 'selectbox',
              srchby => 'selectbox',
              srchtype => 'selectbox',
              srchdomain => 'selectbox',
          },
       );
   
       my $jsback .= qq|
   function backPage(formname,prevphase,prevstate) {
       if (typeof prevphase == 'undefined') {
           formname.phase.value = '';
       }
       else {  
           formname.phase.value = prevphase;
       }
       if (typeof prevstate == 'undefined') {
           formname.currstate.value = '';
       }
       else {
           formname.currstate.value = prevstate;
       }
       formname.submit();
   }
   |;
       return ($jsback,\%elements);
   }
   
 sub course_level_table {  sub course_level_table {
     my %inccourses = @_;      my (%inccourses) = @_;
     my $table = '';      my $table = '';
 # Custom Roles?  # Custom Roles?
   
     my %customroles=&my_custom_roles();      my %customroles=&Apache::lonuserutils::my_custom_roles();
       my %lt=&Apache::lonlocal::texthash(
               'exs'  => "Existing sections",
               'new'  => "Define new section",
               'ssd'  => "Set Start Date",
               'sed'  => "Set End Date",
               'crl'  => "Course Level",
               'act'  => "Activate",
               'rol'  => "Role",
               'ext'  => "Extent",
               'grs'  => "Section",
               'sta'  => "Start",
               'end'  => "End"
       );
   
     foreach (sort( keys(%inccourses))) {      foreach my $protectedcourse (sort( keys(%inccourses))) {
  my $thiscourse=$_;   my $thiscourse=$protectedcourse;
  my $protectedcourse=$_;  
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$_; }          my $type=$coursedata{'type'};
  my $bgcol=$thiscourse;   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  $bgcol=~s/[^7-9a-e]//g;   my ($domain,$cnum)=split(/\//,$thiscourse);
  $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);          my %sections_count;
  my ($domain)=split(/\//,$thiscourse);          if (defined($env{'request.course.id'})) {
  foreach  ('st','ta','ep','ad','in','cc') {              if ($env{'request.course.id'} eq $domain.'_'.$cnum) {
     if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {                  %sections_count = 
  my $plrole=&Apache::lonnet::plaintext($_);      &Apache::loncommon::get_sections($domain,$cnum);
  $table .= <<ENDEXTENT;              }
 <tr bgcolor="#$bgcol">          }
 <td><input type="checkbox" name="act_$protectedcourse\_$_"></td>          my @roles = &Apache::lonuserutils::roles_by_context('course');
 <td>$plrole</td>   foreach my $role (@roles) {
 <td>$area<br />Domain: $domain</td>              my $plrole=&Apache::lonnet::plaintext($role);
 ENDEXTENT      if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
         if ($_ ne 'cc') {                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
     $table .= <<ENDSECTION;                                              $plrole,\%sections_count,\%lt);    
 <td><input type="text" size="5" name="sec_$protectedcourse\_$_"></td>              } elsif ($env{'request.course.sec'} ne '') {
 ENDSECTION                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
                 } else {                                                $env{'request.course.sec'})) {
     $table .= <<ENDSECTION;                      $table .= &course_level_row($protectedcourse,$role,$area,$domain,
 <td>&nbsp</td>                                                   $plrole,\%sections_count,\%lt);
 ENDSECTION  
                 }                  }
  my %lt=&Apache::lonlocal::texthash(  
                                'ssd'  => "Set Start Date",  
                                'sed'  => "Set End Date"  
    );  
  $table .= <<ENDTIMEENTRY;  
 <td><input type=hidden name="start_$protectedcourse\_$_" value=''>  
 <a href=  
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$_.value,'start_$protectedcourse\_$_','cu.pres','dateset')">$lt{'ssd'}</a></td>  
 <td><input type=hidden name="end_$protectedcourse\_$_" value=''>  
 <a href=  
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$_.value,'end_$protectedcourse\_$_','cu.pres','dateset')">$lt{'sed'}</a></td>  
 ENDTIMEENTRY  
                 $table.= "</tr>\n";  
             }              }
         }          }
         foreach (sort keys %customroles) {          if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
     if (&Apache::lonnet::allowed('ccr',$thiscourse)) {              foreach my $cust (sort keys %customroles) {
  my $plrole=$_;                  my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;
                 my $customrole=$protectedcourse.'_cr_cr_'.$ENV{'user.domain'}.                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
     '_'.$ENV{'user.name'}.'_'.$plrole;                                              $cust,\%sections_count,\%lt);
  my %lt=&Apache::lonlocal::texthash(              }
                                'ssd'  => "Set Start Date",  
                                'sed'  => "Set End Date"  
    );  
  $table .= <<ENDENTRY;  
 <tr bgcolor="#$bgcol">  
 <td><input type="checkbox" name="act_$customrole"></td>  
 <td>$plrole</td>  
 <td>$area</td>  
 <td><input type="text" size="5" name="sec_$customrole"></td>  
 <td><input type=hidden name="start_$customrole" value=''>  
 <a href=  
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">$lt{'ssd'}</a></td>  
 <td><input type=hidden name="end_$customrole" value=''>  
 <a href=  
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$customrole.value,'end_$customrole','cu.pres','dateset')">$lt{'sed'}</a></td></tr>  
 ENDENTRY  
            }  
  }   }
     }      }
     return '' if ($table eq ''); # return nothing if there is nothing       return '' if ($table eq ''); # return nothing if there is nothing 
                                  # in the table                                   # in the table
       my $result;
       if (!$env{'request.course.id'}) {
           $result = '<h4>'.$lt{'crl'}.'</h4>'."\n";
       }
       $result .= 
   &Apache::loncommon::start_data_table().
   &Apache::loncommon::start_data_table_header_row().
   '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.'</th>
   <th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
   &Apache::loncommon::end_data_table_header_row().
   $table.
   &Apache::loncommon::end_data_table();
       return $result;
   }
   
   sub course_level_row {
       my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_;
       my $table = &Apache::loncommon::start_data_table_row().
                   ' <td><input type="checkbox" name="act_'.
                   $protectedcourse.'_'.$role.'" /></td>'."\n".
                   ' <td>'.$plrole.'</td>'."\n".
                   '<td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
       if ($role eq 'cc') {
           $table .= '<td>&nbsp</td>';
       } elsif ($env{'request.course.sec'} ne '') {
           $table .= ' <td><input type="hidden" value="'.
                     $env{'request.course.sec'}.'" '.
                     'name="sec_'.$protectedcourse.'_'.$role.'" />'.
                     $env{'request.course.sec'}.'</td>';
       } else {
           if (ref($sections_count) eq 'HASH') {
               my $currsec = 
                   &Apache::lonuserutils::course_sections($sections_count,
                                                          $protectedcourse.'_'.$role);
               $table .= '<td><table class="LC_createuser">'.
                         '<tr class="LC_section_row">
                           <td valign="top">'.$lt->{'exs'}.'<br />'.
                           $currsec.'</td>
                           <td>&nbsp;&nbsp;</td>
                           <td valign="top">&nbsp;'.$lt->{'new'}.'<br />'.
                        '<input type="text" name="newsec_'.$protectedcourse.'_'.$role.
                        '" value="" />'.
                        '<input type="hidden" '.
                        'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'."\n".
                        '</tr></table></td>';
           } else {
               $table .= '<td><input type="text" size="10" '.
                         'name="sec_'.$protectedcourse.'_'.$role.'" /></td>';
           }
       }
       $table .= <<ENDTIMEENTRY;
   <td><input type="hidden" name="start_$protectedcourse\_$role" value='' />
   <a href=
   "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$role.value,'start_$protectedcourse\_$role','cu.pres','dateset')">$lt->{'ssd'}</a></td>
   <td><input type="hidden" name="end_$protectedcourse\_$role" value='' />
   <a href=
   "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$role.value,'end_$protectedcourse\_$role','cu.pres','dateset')">$lt->{'sed'}</a></td>
   ENDTIMEENTRY
       $table.= &Apache::loncommon::end_data_table_row();
   }
   
   sub course_level_dc {
       my ($dcdom) = @_;
       my %customroles=&Apache::lonuserutils::my_custom_roles();
       my @roles = &Apache::lonuserutils::roles_by_context('course');
       my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
                         '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                         '<input type="hidden" name="dccourse" value="" />';
       my $courseform='<b>'.&Apache::loncommon::selectcourse_link
               ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';
       my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu');
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
     'crl'  => "Course Level",  
                     'act'  => "Activate",  
                     'rol'  => "Role",                      'rol'  => "Role",
                     'ext'  => "Extent",                      'grs'  => "Section",
                     'grs'  => "Group/Section",                      'exs'  => "Existing sections",
                       'new'  => "Define new section", 
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End"                      'end'  => "End",
        );                      'ssd'  => "Set Start Date",
     my $result = <<ENDTABLE;                      'sed'  => "Set End Date"
 <h4>$lt{'crl'}</h4>                    );
 <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th>      my $header = '<h4>'.&mt('Course Level').'</h4>'.
 <th>$lt{'grs'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th></tr>                   &Apache::loncommon::start_data_table().
 $table                   &Apache::loncommon::start_data_table_header_row().
 </table>                   '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
 ENDTABLE                   &Apache::loncommon::end_data_table_header_row();
     return $result;      my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                        '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                        '<td><select name="role">'."\n";
       foreach my $role (@roles) {
           my $plrole=&Apache::lonnet::plaintext($role);
           $otheritems .= '  <option value="'.$role.'">'.$plrole;
       }
       if ( keys %customroles > 0) {
           foreach my $cust (sort keys %customroles) {
               my $custrole='cr_cr_'.$env{'user.domain'}.
                       '_'.$env{'user.name'}.'_'.$cust;
               $otheritems .= '  <option value="'.$custrole.'">'.$cust;
           }
       }
       $otheritems .= '</select></td><td>'.
                        '<table border="0" cellspacing="0" cellpadding="0">'.
                        '<tr><td valign="top"><b>'.$lt{'exs'}.'</b><br /><select name="currsec">'.
                        ' <option value=""><--'.&mt('Pick course first').'</select></td>'.
                        '<td>&nbsp;&nbsp;</td>'.
                        '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                        '<input type="text" name="newsec" value="" />'.
                        '<input type="hidden" name="sections" value="" />'.
                        '<input type="hidden" name="groups" value="" /></td>'.
                        '</tr></table></td>';
       $otheritems .= <<ENDTIMEENTRY;
   <td><input type="hidden" name="start" value='' />
   <a href=
   "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
   <td><input type="hidden" name="end" value='' />
   <a href=
   "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
   ENDTIMEENTRY
       $otheritems .= &Apache::loncommon::end_data_table_row().
                      &Apache::loncommon::end_data_table()."\n";
       return $cb_jscript.$header.$hiddenitems.$otheritems;
 }  }
   
 #---------------------------------------------- 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.83  
changed lines
  Added in v.1.221


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