Diff for /loncom/interface/loncreateuser.pm between versions 1.131 and 1.227

version 1.131, 2006/11/09 22:25:27 version 1.227, 2008/01/01 17:24:59
Line 65  use Apache::lonnet; Line 65  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
 use lib '/home/httpd/lib/perl/';  use Apache::lonuserutils;
 use LONCAPA;  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;
Line 77  my $authformfsys; Line 76  my $authformfsys;
 my $authformloc;  my $authformloc;
   
 sub initialize_authen_forms {  sub initialize_authen_forms {
     my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/);      my ($dom,$formname,$curr_authtype,$mode) = @_;
     $krbdefdom= uc($krbdefdom);      my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($dom);
     my %param = ( formname => 'document.cu',      my %param = ( formname => $formname,
                   kerb_def_dom => $krbdefdom                     kerb_def_dom => $krbdefdom,
                   );                    kerb_def_auth => $krbdef,
 # no longer static due to configurable kerberos defaults                    domain => $dom,
 #    $loginscript  = &Apache::loncommon::authform_header(%param);                  );
     $generalrule  = &Apache::loncommon::authform_authorwarning(%param);      my %abv_auth = &auth_abbrev();
       if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):(.*)$/) {
           my $long_auth = $1;
           my $curr_autharg = $2;
           my %abv_auth = &auth_abbrev();
           $param{'curr_authtype'} = $abv_auth{$long_auth};
           if ($long_auth =~ /^krb(4|5)$/) {
               $param{'curr_kerb_ver'} = $1;
               $param{'curr_autharg'} = $curr_autharg;
           }
           if ($mode eq 'modifyuser') {
               $param{'mode'} = $mode;
           }
       }
       $loginscript  = &Apache::loncommon::authform_header(%param);
       $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
     $authformnop  = &Apache::loncommon::authform_nochange(%param);      $authformnop  = &Apache::loncommon::authform_nochange(%param);
 # no longer static due to configurable kerberos defaults  
 #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  
     $authformint  = &Apache::loncommon::authform_internal(%param);      $authformint  = &Apache::loncommon::authform_internal(%param);
     $authformfsys = &Apache::loncommon::authform_filesystem(%param);      $authformfsys = &Apache::loncommon::authform_filesystem(%param);
     $authformloc  = &Apache::loncommon::authform_local(%param);      $authformloc  = &Apache::loncommon::authform_local(%param);
 }  }
   
   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 = ' ';
     unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname))          $showquota = $currquota;
          || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; }          if ($longinsttype eq '') {
     return 1;              $defaultinfo = &mt('For this user, the default quota would be [_1]
                               Mb.',$defquota);
           } 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) = @_;      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 $selscript=&Apache::loncommon::studentbrowser_javascript();          $formtoset = 'docustom';
           $env{'form.rolename'} = $env{'form.startrolename'};
       } elsif ($env{'form.origform'} eq 'crtusername') {
           $formtoset =  $env{'form.origform'};
       }
   
       my ($jsback,$elements) = &crumb_utilities();
   
       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 =      my $start_page =
  &Apache::loncommon::start_page('Create Users, Change User Privileges',   &Apache::loncommon::start_page('User Management',
        $selscript);         $jscript,{'add_entries' => \%loaditems,});
       if ($env{'form.action'} eq 'custom') {
     my $sellink=&Apache::loncommon::selectstudent_link          &Apache::lonhtmlcommon::add_breadcrumb
                                         ('crtuser','ccuname','ccdomain');            ({href=>"javascript:backPage(document.crtuser)",
     my %existingroles=&my_custom_roles();              text=>"Pick custom role",});
       } else {
           &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.crtuser)",
               text=>"Single user search",
               faq=>282,bug=>'Instructor Interface',});
       }
       my $helpitem = 'Course_Change_Privileges';
       if ($env{'form.action'} eq 'custom') {
           $helpitem = 'Course_Editing_Custom_Roles';
       } elsif ($env{'form.action'} eq 'singlestudent') {
           $helpitem = 'Course_Add_Student';
       }
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                        $helpitem);
       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 $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface');
     my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');      my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');      if ($sellink) {
     $r->print(<<"ENDDOCUMENT");          $sellink = "$lt{'or'} ".$sellink;
 $start_page      } 
 <form action="/adm/createuser" method="post" name="crtuser">      $r->print($start_page."\n".$crumbs);
 <input type="hidden" name="phase" value="get_user_info">      if ($env{'form.action'} eq 'custom') {
 <h2>$lt{siur}$helpsiur</h2>          if (&Apache::lonnet::allowed('mcr','/')) {
 <table>              $r->print(<<ENDCUSTOM);
 <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>  
 ENDDOCUMENT  
    if (&Apache::lonnet::allowed('mcr','/')) {  
        $r->print(<<ENDCUSTOM);  
 <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'}</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'}" />
 </form>  </form>
 ENDCUSTOM  ENDCUSTOM
           }
       } else {
           my $actiontext = $lt{'mod'};
           if ($env{'form.action'} eq 'singlestudent') {
               $actiontext = $lt{'enrl'};
           }
           $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());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub entry_form {
       my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
       my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
       my $usertype;
       if (ref($srch) eq 'HASH') {
           if (($srch->{'srchin'} eq 'dom') &&
               ($srch->{'srchby'} eq 'uname') &&
               ($srch->{'srchtype'} eq 'exact') &&
               ($srch->{'srchdomain'} ne '') &&
               ($srch->{'srchterm'} ne '')) {
               my ($rules,$ruleorder) =
                   &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;
   }
   
 sub user_modification_js {  sub user_modification_js {
     my ($pjump_def,$dc_setcourse_code,$nondc_setsection_code,$groupslist)=@_;      my ($pjump_def,$dc_setcourse_code,$nondc_setsection_code,$groupslist)=@_;
Line 200  END Line 380  END
 }  }
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_modification_page {  sub print_user_selection_page {
     my $r=shift;      my ($r,$response,$srch,$srch_results,$operation,$srcharray,$context) = @_;
     my $ccuname=$env{'form.ccuname'};      my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $ccdomain=$env{'form.ccdomain'};      my $sortby = $env{'form.sortby'};
   
     $ccuname=~s/\W//g;      if (!grep(/^\Q$sortby\E$/,@fields)) {
     $ccdomain=~s/\W//g;          $sortby = 'lastname';
       }
     unless (($ccuname) && ($ccdomain)) {  
  &print_username_entry_form($r);      my ($jsback,$elements) = &crumb_utilities();
         return;  
     }      my $jscript = (<<ENDSCRIPT);
   <script type="text/javascript">
     my $defdom=$env{'request.role.domain'};  function pickuser(uname,udom) {
       document.usersrchform.seluname.value=uname;
     my ($krbdef,$krbdefdom) =      document.usersrchform.seludom.value=udom;
        &Apache::loncommon::get_kerberos_defaults($defdom);      document.usersrchform.phase.value="userpicked";
       document.usersrchform.submit();
     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 $dc_setcourse_code = '';  
     my $nondc_setsection_code = '';                                          
   
     my %loaditem;  $jsback
   </script>
   ENDSCRIPT
   
     my $groupslist;      my %lt=&Apache::lonlocal::texthash(
     my %curr_groups = &Apache::longroup::coursegroups();                                         'usrch'          => "User Search to add/modify roles",
     if (%curr_groups) {                                         'stusrch'        => "User Search to enroll student",
         $groupslist = join('","',sort(keys(%curr_groups)));                                         'usel'           => "Select a user to add/modify roles",
         $groupslist = '"'.$groupslist.'"';                                            'stusel'         => "Select a user to enroll as a student", 
     }                                         'username'       => "username",
                                          'domain'         => "domain",
     if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {                                         'lastname'       => "last name",
         my $dcdom = $1;                                         'firstname'      => "first name",
         $loaditem{'onload'} = "document.cu.coursedesc.value='';";                                         'permanentemail' => "permanent e-mail",
         my @rolevals = ('st','ta','ep','in','cc');                                        );
         my (@crsroles,@grproles);      $r->print(&Apache::loncommon::start_page('User Management',$jscript));
         for (my $i=0; $i<@rolevals; $i++) {      if ($operation eq 'createuser') {
             $crsroles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Course');          &Apache::lonhtmlcommon::add_breadcrumb
             $grproles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Group');              ({href=>"javascript:backPage(document.usersrchform,'','')",
         }                text=>"Create/modify user",
         my $rolevalslist = join('","',@rolevals);                faq=>282,bug=>'Instructor Interface',},
         my $crsrolenameslist = join('","',@crsroles);               {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
         my $grprolenameslist = join('","',@grproles);                text=>"Select User",
         my $pickcrsfirst = '<--'.&mt('Pick course first');                faq=>282,bug=>'Instructor Interface',});
         my $pickgrpfirst = '<--'.&mt('Pick group first');           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
         $dc_setcourse_code = <<"ENDSCRIPT";                                                        'Course_Change_Privileges'));
     function setCourse() {          $r->print("<b>$lt{'usrch'}</b><br />");
         var course = document.cu.dccourse.value;          $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
         if (course != "") {          $r->print('<h3>'.$lt{'usel'}.'</h3>');
             if (document.cu.dcdomain.value != document.cu.origdom.value) {      } elsif ($operation eq 'enrollstudent') {
                 alert("You must select a course in the current domain");          &Apache::lonhtmlcommon::add_breadcrumb
                 return;              ({href=>"javascript:backPage(document.usersrchform,'','')",
             }                 text=>"Create/modify student",
             var userrole = document.cu.role.options[document.cu.role.selectedIndex].value                faq=>282,bug=>'Instructor Interface',},
             var section="";               {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
             var numsections = 0;                text=>"Select Student",
             var newsecs = new Array();                faq=>282,bug=>'Instructor Interface',});
             for (var i=0; i<document.cu.currsec.length; i++) {          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                 if (document.cu.currsec.options[i].selected == true ) {                                                        'Course_Add_Student'));
                     if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) {           $r->print($jscript."<b>$lt{'stusrch'}</b><br />");
                         if (numsections == 0) {          $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
                             section = document.cu.currsec.options[i].value          $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
                             numsections = 1;      }
                         }      $r->print('<form name="usersrchform" method="post">'.
                         else {                &Apache::loncommon::start_data_table()."\n".
                             section = section + "," +  document.cu.currsec.options[i].value                &Apache::loncommon::start_data_table_header_row()."\n".
                             numsections ++;                ' <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");
             if (document.cu.newsec.value != "" && document.cu.newsec.value != null) {      }
                 if (numsections == 0) {      $r->print(&Apache::loncommon::end_data_table_header_row());
                     section = document.cu.newsec.value  
                 }      my @sorted_users = sort {
                 else {          lc($srch_results->{$a}->{$sortby})   cmp lc($srch_results->{$b}->{$sortby})
                     section = section + "," +  document.cu.newsec.value              ||
                 }          lc($srch_results->{$a}->{lastname})  cmp lc($srch_results->{$b}->{lastname})
                 newsecs = document.cu.newsec.value.split(/,/g);              ||
                 numsections = numsections + newsecs.length;          lc($srch_results->{$a}->{firstname}) cmp lc($srch_results->{$b}->{firstname})
             }      ||
             if ((userrole == 'st') && (numsections > 1)) {   lc($a) cmp lc($b)
                 alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.")          } (keys(%$srch_results));
                 return;  
             }      foreach my $user (@sorted_users) {
             for (var j=0; j<newsecs.length; j++) {          my ($uname,$udom) = split(/:/,$user);
                 if ((newsecs[j] == 'all') || (newsecs[j] == 'none')) {          $r->print(&Apache::loncommon::start_data_table_row().
                     alert("'"+newsecs[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");                    '<td><input type="button" name="seluser" value="'.&mt('Select').'" onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".')" /></td>'.
                     return;                    '<td><tt>'.$uname.'</tt></td>'.
                 }                    '<td><tt>'.$udom.'</tt></td>');
                 if (document.cu.groups.value != '') {          foreach my $field ('lastname','firstname','permanentemail') {
                     var groups = document.cu.groups.value.split(/,/g);              $r->print('<td>'.$srch_results->{$user}->{$field}.'</td>');
                     for (var k=0; k<groups.length; k++) {  
                         if (newsecs[j] == groups[k]) {  
                             alert("'"+newsecs[j]+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");  
                             return;   
                         }  
                     }  
                 }  
             }  
             if ((userrole == 'cc') && (numsections > 0)) {  
                 alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");  
                 section = "";  
             }  
             var coursename = "_$dcdom"+"_"+course+"_"+userrole  
             var numcourse = getIndex(document.cu.dccourse);  
             if (numcourse == "-1") {  
                 alert("There was a problem with your course selection");  
                 return  
             }  
             else {  
                 document.cu.elements[numcourse].name = "act"+coursename;  
                 var numnewsec = getIndex(document.cu.newsec);  
                 if (numnewsec != "-1") {  
                     document.cu.elements[numnewsec].name = "sec"+coursename;  
                     document.cu.elements[numnewsec].value = section;  
                 }  
                 var numstart = getIndex(document.cu.start);  
                 if (numstart != "-1") {  
                     document.cu.elements[numstart].name = "start"+coursename;  
                 }  
                 var numend = getIndex(document.cu.end);  
                 if (numend != "-1") {  
                     document.cu.elements[numend].name = "end"+coursename  
                 }  
             }  
         }          }
         document.cu.submit();          $r->print(&Apache::loncommon::end_data_table_row());
     }      }
       $r->print(&Apache::loncommon::end_data_table().'<br /><br />');
     function getIndex(caller) {      if (ref($srcharray) eq 'ARRAY') {
         for (var i=0;i<document.cu.elements.length;i++) {          foreach my $item (@{$srcharray}) {
             if (document.cu.elements[i] == caller) {              $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n");
                 return i;  
             }  
         }          }
         return -1;  
     }      }
       $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());
   }
   
     function setType() {  sub print_user_query_page {
         var crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value;      my ($r,$caller) = @_;
         rolevals = new Array("$rolevalslist");  # FIXME - this is for a network-wide name search (similar to catalog search)
         if (crstype == 'Group') {  # To use frames with similar behavior to catalog/portfolio search.
             if (document.cu.currsec.options[0].text == "$pickcrsfirst") {  # To be implemented. 
                 document.cu.currsec.options[0].text = "$pickgrpfirst";      return;
             }   }
             grprolenames = new Array("$grprolenameslist");  
             for (var i=0; i<rolevals.length; i++) {  sub print_user_modification_page {
                 if (document.cu.role.selectedIndex == i) {      my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;
                     document.cu.role.options[i] = new Option(grprolenames[i],rolevals[i],true,false);      if (($ccuname eq '') || ($ccdomain eq '')) {
                 } else {          my $usermsg = &mt('No username and/or domain provided.');
                     document.cu.role.options[i] = new Option(grprolenames[i],rolevals[i],false,false);          $env{'form.phase'} = '';
                 }   &print_username_entry_form($r,$context,$usermsg);
             }          return;
         } else {  
             if (document.cu.currsec.options[0].text == "$pickgrpfirst") {  
                 document.cu.currsec.options[0].text = "$pickcrsfirst";  
             }  
             crsrolenames = new Array("$crsrolenameslist");  
             for (var i=0; i<rolevals.length; i++) {  
                 if (document.cu.role.selectedIndex == i) {  
                     document.cu.role.options[i] = new Option(crsrolenames[i],rolevals[i],true,false);  
                 } else {  
                     document.cu.role.options[i] = new Option(crsrolenames[i],rolevals[i],false,false);  
                 }  
             }  
         }  
     }      }
 ENDSCRIPT      my ($form,$formname);
       if ($env{'form.action'} eq 'singlestudent') {
           $form = 'document.enrollstudent';
           $formname = 'enrollstudent';
     } else {      } else {
         $nondc_setsection_code = <<"ENDSECCODE";          $form = 'document.cu';
     function setSections() {          $formname = 'cu';
         var re1 = /^currsec_/;      }
         var groups = new Array($groupslist);      my %abv_auth = &auth_abbrev();
         for (var i=0;i<document.cu.elements.length;i++) {      my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules);
             var str = document.cu.elements[i].name;      my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
             var checkcurr = str.match(re1);      if ($uhome eq 'no_host') {
             if (checkcurr != null) {          my $usertype;
                 if (document.cu.elements[i-1].checked == true) {          my ($rules,$ruleorder) =
                     var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;              &Apache::lonnet::inst_userrules($ccdomain,'username');
                     match = re2.exec(str);              $usertype =
                     var role = match[1];                  &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules);
                     if (role == 'cc') {          my $cancreate =
                         alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");              &Apache::lonuserutils::can_create_user($ccdomain,$context,
                     }                                                     $usertype);
                     else {          if (!$cancreate) {
                         var sections = '';              my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                         var numsec = 0;              my %usertypetext = (
                         var sections;                  official   => 'institutional',
                         for (var j=0; j<document.cu.elements[i].length; j++) {                  unofficial => 'non-institutional',
                             if (document.cu.elements[i].options[j].selected == true ) {              );
                                 if (document.cu.elements[i].options[j].value != "") {              my $response;
                                     if (numsec == 0) {              if ($env{'form.origform'} eq 'crtusername') {
                                         if (document.cu.elements[i].options[j].value != "") {                  $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).
                                             sections = document.cu.elements[i].options[j].value;                              '</span><br />';
                                             numsec ++;              }
                                         }              $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'} = '';
                                     else {              &print_username_entry_form($r,$context,$response);
                                         sections = sections + "," +  document.cu.elements[i].options[j].value              return;
                                         numsec ++;          }
                                     }          $newuser = 1;
                                 }          my $checkhash;
                             }          my $checks = { 'username' => 1 };
                         }          $checkhash->{$ccuname.':'.$ccdomain} = { 'newuser' => $newuser };
                         if (numsec > 0) {          &Apache::loncommon::user_rule_check($checkhash,$checks,
                             if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {              \%alerts,\%rulematch,\%inst_results,\%curr_rules,\%got_rules);
                                 sections = sections + "," +  document.cu.elements[i+1].value;          if (ref($alerts{'username'}) eq 'HASH') {
                             }              if (ref($alerts{'username'}{$ccdomain}) eq 'HASH') {
                         }                  my $domdesc =
                         else {                      &Apache::lonnet::domain($ccdomain,'description');
                             sections = document.cu.elements[i+1].value;                  if ($alerts{'username'}{$ccdomain}{$ccuname}) {
                         }                      my $userchkmsg;
                         var newsecs = document.cu.elements[i+1].value;                      if (ref($curr_rules{$ccdomain}) eq 'HASH') {  
  var numsplit;                          $userchkmsg = 
                         if (newsecs != null && newsecs != "") {                              &Apache::loncommon::instrule_disallow_msg('username',
                             numsplit = newsecs.split(/,/g);                                                                   $domdesc,1).
                             numsec = numsec + numsplit.length;                          &Apache::loncommon::user_rule_formats($ccdomain,
                         }                              $domdesc,$curr_rules{$ccdomain}{'username'},
                               'username');
                         if ((role == 'st') && (numsec > 1)) {  
                             alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.")  
                             return;  
                         }  
                         else if (numsplit != null) {  
                             for (var j=0; j<numsplit.length; j++) {  
                                 if ((numsplit[j] == 'all') ||  
                                     (numsplit[j] == 'none')) {  
                                     alert("'"+numsplit[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");  
                                     return;  
                                 }  
                                 for (var k=0; k<groups.length; k++) {  
                                     if (numsplit[j] == groups[k]) {  
                                         alert("'"+numsplit[j]+"' may not be used as a section name, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");  
                                         return;  
                                     }  
                                 }  
                             }  
                         }  
                         document.cu.elements[i+2].value = sections;  
                     }                      }
                       $env{'form.phase'} = '';
                       &print_username_entry_form($r,$context,$userchkmsg);
                       return;
                 }                  }
             }              }
         }          }
         document.cu.submit();      } else {
           $newuser = 0;
     }      }
 ENDSECCODE      if ($response) {
           $response = '<br />'.$response;
     }      }
     my $js = &user_modification_js($pjump_def,$dc_setcourse_code,  
                                    $nondc_setsection_code,$groupslist);      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 =       my $start_page = 
  &Apache::loncommon::start_page('Create Users, Change User Privileges',   &Apache::loncommon::start_page('User Management',
        $js,{'add_entries' => \%loaditem,});         $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 $helpitem = 'Course_Change_Privileges';
       if ($env{'form.action'} eq 'singlestudent') {
           $helpitem = 'Course_Add_Student';
       }
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                        $helpitem);
   
     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,$formname);
                     '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",  
                     'lg'   => "Login Data"  
        );  
  my $genhelp=&Apache::loncommon::help_open_topic('Generation');  
         &initialize_authen_forms();  
  $r->print(<<ENDNEWUSER);  
 $start_page  $start_page
 <h1>$lt{'cnu'}</h1>  $crumbs
   $response
 $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);
 $start_page  $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,$formname);
           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="auth_check()" \>'."\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',$context);
       } else {
           my $checkauth; 
           if (($newuser) || (&Apache::lonnet::allowed('mau',$ccdomain))) {
               $checkauth = 1;
           }
           if ($context eq 'course') {
               $nondc_setsection_code =
                   &Apache::lonuserutils::setsections_javascript($formname,$groupslist,
                                                                 undef,$checkauth);
           }
           if ($checkauth) {
               $nondc_setsection_code .= 
                   &Apache::lonuserutils::verify_authen($formname,$context);
           }
       }
       my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
                                      $nondc_setsection_code,$groupslist);
       my ($jsback,$elements) = &crumb_utilities();
       $js .= "\n".
              '<script type="text/javascript">'."\n".$jsback."\n".'</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",
        );                                         );
            my (%roletext,%sortrole,%roleclass,%rolepriv);          my (%roletext,%sortrole,%roleclass,%rolepriv);
    foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);          foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
     my $b1=join('_',(split('_',$b))[1,0]);                                      my $b1=join('_',(split('_',$b))[1,0]);
     return $a1 cmp $b1;                                      return $a1 cmp $b1;
  } keys(%rolesdump)) {                                  } keys(%rolesdump)) {
                next if ($area =~ /^rolesdef/);              next if ($area =~ /^rolesdef/);
        my $envkey=$area;              my $envkey=$area;
                my $role = $rolesdump{$area};              my $role = $rolesdump{$area};
                my $thisrole=$area;              my $thisrole=$area;
                $area =~ s/\_\w\w$//;              $area =~ s/\_\w\w$//;
                my ($role_code,$role_end_time,$role_start_time) =               my ($role_code,$role_end_time,$role_start_time) =
                    split(/_/,$role);                  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$coursedom";                  # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                    # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).                  my %coursedata=
                    my %coursedata=                      &Apache::lonnet::coursedescription($1.'_'.$2);
                        &Apache::lonnet::coursedescription($1.'_'.$2);                  my $carea;
    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'};
                        $class=$coursedata{'type'};                      $class=$coursedata{'type'};
    } else {                  } else {
        $carea=&mt('Unavailable course').': '.$area;                      $carea=&mt('Unavailable course').': '.$area;
        $sortkey.="\0".&mt('Unavailable course').': '.$area;                      $sortkey.="\0".&mt('Unavailable course').': '.$area;
    }                  }
    $sortkey.="\0$coursedir";                  $sortkey.="\0$coursedir";
                    $inccourses{$1.'_'.$2}=1;                  $inccourses->{$1.'_'.$2}=1;
                    if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||                  if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
                        (&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))) {
                        $delallowed=1;                      $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: '.$3;                          if ($env{'request.course.sec'} eq $3) {
        $sortkey.="\0$3";                              if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
                    }                                  $allowed = 1;
                    $area=$carea;                              }
                } else {                          }
    $sortkey.="\0".$area;                      }
                    # Determine if current user is able to revoke privileges                  }
                    if ($area=~ /^\/(\w+)\//) {                  $area=$carea;
                        if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||              } 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') || ($role_code eq 'aa')) {              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,$class)  
        } 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;  
                $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}.=$roletext{$sortrole{$which}};  
    }  
        }  
        unless($output{$type} eq '') {  
    $output{$type} = "<tr bgcolor='#BBffBB'>".  
      "<td align='center' colspan='7'>".&mt($type)."</td>".  
                               $output{$type};  
                    $rolesdisplay = 1;  
        }  
    }  
            if ($rolesdisplay == 1) {  
                $r->print(<<END);  
 <hr />  
 <h3>$lt{'rer'}</h3>  
 <table>  
 <tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'e  
 xt'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>  
 END  
                foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {  
                    if ($output{$type}) {  
                        $r->print($output{$type}."\n");  
                    }  
                }  
        $r->print('</table>');  
            }  
         }  # End of unless  
  my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);  
  if ($currentauth=~/^krb(4|5):/) {  
     $currentauth=~/^krb(4|5):(.*)/;  
     my $krbdefdom=$2;  
             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'})) {  
                 &initialize_authen_forms();  
  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.'" />';
             &initialize_authen_forms();              } else {
     if ($currentauth=~/^krb(4|5):/) {                  $row.='&nbsp;';
  $authformcurrent=$authformkrb;              }
  $authform_other="<p>$authformint</p>\n".              $row.='</td><td>';
                     "<p>$authformfsys</p><p>$authformloc</p>";              if ($delallowed) {
     }                  $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
     elsif ($currentauth=~/^internal:/) {              } else {
  $authformcurrent=$authformint;                  $row.='&nbsp;';
  $authform_other="<p>$authformkrb</p>".              }
                     "<p>$authformfsys</p><p>$authformloc</p>";              my $plaintext='';
     }              if (!$croletitle) {
     elsif ($currentauth=~/^unix:/) {                  $plaintext=&Apache::lonnet::plaintext($role_code,$class)
  $authformcurrent=$authformfsys;              } else {
  $authform_other="<p>$authformkrb</p>".                  $plaintext=
                     "<p>$authformint</p><p>$authformloc;</p>";          "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
     }              }
     elsif ($currentauth=~/^localauth:/) {              $row.= '</td><td>'.$plaintext.
  $authformcurrent=$authformloc;                     '</td><td>'.$area.
  $authform_other="<p>$authformkrb</p>".                     '</td><td>'.($role_start_time?localtime($role_start_time)
                     "<p>$authformint</p><p>$authformfsys</p>";                                                  : '&nbsp;' ).
     }                     '</td><td>'.($role_end_time  ?localtime($role_end_time)
             $authformcurrent.=' <i>(will override current values)</i><br />';                                                  : '&nbsp;' )
             if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {                     ."</td>";
  # Current user has login modification privileges              $sortrole{$sortkey}=$envkey;
  my %lt=&Apache::lonlocal::texthash(              $roletext{$envkey}=$row;
                                'ccld'  => "Change Current Login Data",              $roleclass{$envkey}=$class;
        'enld'  => "Enter New Login Data"              $rolepriv{$envkey}=$allowed;
    );              #$r->print($row);
  $r->print(<<ENDOTHERAUTHS);          } # end of foreach        (table building loop)
 <hr />          my $rolesdisplay = 0;
 <script type="text/javascript" language="Javascript">          my %output = ();
 $loginscript          foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
 </script>              $output{$type} = '';
 <h3>$lt{'ccld'}</h3>              foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
 <p>$generalrule</p>                  if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
 <p>$authformnop</p>                      $output{$type}.=
 <p>$authformcurrent</p>                            &Apache::loncommon::start_data_table_row().
 <h3>$lt{'enld'}</h3>                            $roletext{$sortrole{$which}}.
 $authform_other                            &Apache::loncommon::end_data_table_row();
 ENDOTHERAUTHS                  }
             }              }
         }  ## End of "check for bad authentication type" logic              unless($output{$type} eq '') {
     } ## End of new user/old user logic                  $output{$type} = '<tr class="LC_info_row">'.
     $r->print('<hr /><h3>'.&mt('Add Roles').'</h3>');                            "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
 #                             $output{$type};
 # Co-Author                  $rolesdisplay = 1;
 #               }
     if (&authorpriv($env{'user.name'},$env{'request.role.domain'}) &&          }
           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)) {          ($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 $cuname=$env{'user.name'};
         my $cudom=$env{'request.role.domain'};          my $cudom=$env{'request.role.domain'};
    my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
     'cs'   => "Construction Space",                      'cs'   => "Construction Space",
                     'act'  => "Activate",                                          'act'  => "Activate",
                     'rol'  => "Role",                      'rol'  => "Role",
                     'ext'  => "Extent",                      'ext'  => "Extent",
                     'sta'  => "Start",                      'sta'  => "Start",
Line 887  ENDOTHERAUTHS Line 1124  ENDOTHERAUTHS
                     'caa'  => "Assistant 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>
 <a href=              <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />
 "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>
 <td><input type=hidden name="end_$cudom\_$cuname\_ca" value='' />             <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_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_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
 </tr>                &Apache::loncommon::end_data_table_row()."\n".
 <tr>                &Apache::loncommon::start_data_table_row()."\n".
 <td><input type=checkbox name="act_$cudom\_$cuname\_aa" /></td>  '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
 <td>$lt{'caa'}</td>  <td>'.$lt{'caa'}.'</td>
 <td>$cudom\_$cuname</td>  <td>'.$cudom.'_'.$cuname.'</td>
 <td><input type=hidden name="start_$cudom\_$cuname\_aa" value='' />  <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_aa" value="" />
 <a href=  <a href=
 "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>  "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>
 <td><input type=hidden name="end_$cudom\_$cuname\_aa" value='' />  <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_aa" value="" />
 <a href=  <a href=
 "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>  "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".
 </tr>               &Apache::loncommon::end_data_table_row()."\n".
 </table>               &Apache::loncommon::end_data_table());
 ENDCOAUTH      } 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  }
 #  
   sub new_domain_roles {
       my ($r) = @_;
       my $addrolesdisplay = 0;
       #
       # Domain level
       #
     my $num_domain_level = 0;      my $num_domain_level = 0;
     my $domaintext =       my $domaintext =
     '<h4>'.&mt('Domain Level').'</h4>'.      '<h4>'.&mt('Domain Level').'</h4>'.
     '<table border=2><tr><th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.&mt('Extent').'</th>'.      &Apache::loncommon::start_data_table().
     '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th></tr>';      &Apache::loncommon::start_data_table_header_row().
     foreach ( sort( keys(%incdomains))) {      '<th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.
  my $thisdomain=$_;      &mt('Extent').'</th>'.
         foreach ('dc','li','dg','au','sc') {      '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.
             if (&Apache::lonnet::allowed('c'.$_,$thisdomain)) {      &Apache::loncommon::end_data_table_header_row();
                my $plrole=&Apache::lonnet::plaintext($_);      foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {
        my %lt=&Apache::lonlocal::texthash(          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"
        );                                         );
                $num_domain_level ++;                 $num_domain_level ++;
                $domaintext .= <<"ENDDROW";                 $domaintext .=
 <tr>  &Apache::loncommon::start_data_table_row().
 <td><input type=checkbox name="act_$thisdomain\_$_"></td>  '<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>
 <td>$plrole</td>  <td>'.$plrole.'</td>
 <td>$thisdomain</td>  <td>'.$thisdomain.'</td>
 <td><input type=hidden name="start_$thisdomain\_$_" value=''>  <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.='</table>';      $domaintext.= &Apache::loncommon::end_data_table();
     if ($num_domain_level > 0) {      if ($num_domain_level > 0) {
         $r->print($domaintext);          $r->print($domaintext);
           $addrolesdisplay = 1;
     }      }
 #      return $addrolesdisplay;
 # Course and group levels  }
 #  
   sub user_authentication {
     if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {      my ($ccuname,$ccdomain,$formname) = @_;
         $r->print(&course_level_dc($1,'Course'));      my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n");      my $outcome;
       # 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,$formname);
   
               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,$formname,$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 {      } else {
         $r->print(&course_level_table(%inccourses));          return $output;
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()">'."\n");  
     }      }
     $r->print("</form>".&Apache::loncommon::end_page());  
 }  }
   
 # ================================================================= 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       = &Apache::loncommon::end_page();      my $end       = '</span><br /><br />';
       my $rtnlink   = '<a href="javascript:backPage(document.userupdate,'.
                       "'$env{'form.prevphase'}','modify')".'" />'.
                       &mt('Return to previous page').'</a>'.
                       &Apache::loncommon::end_page();
       my $now = time;
     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::start_page($title));      my $newuser = 0;
     my %disallowed;      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',});
       my $helpitem = 'Course_Change_Privileges';
       if ($env{'form.action'} eq 'singlestudent') {
           $helpitem = 'Course_Add_Student';
       }
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                    $helpitem));
       $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 ($uhome eq 'no_host') {
           $newuser = 1;
       }
     if (! exists($env{'form.makeuser'})) {      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') {
Line 1040  sub update_user_data { Line 1551  sub update_user_data {
         # 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;
     }      }
   
       $r->print('<h3>'.&mt('User [_1] in domain [_2]',
    $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
       my (%alerts,%rulematch,%inst_results,%curr_rules);
     if ($env{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
         # Create a new user   $r->print('<h3>'.&mt('Creating new account.').'</h3>');
  my %lt=&Apache::lonlocal::texthash(  
                     'cru'  => "Creating user",                      
                     'id'   => "in domain"  
    );  
  $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
Line 1062  ENDNEWUSERHEAD Line 1570  ENDNEWUSERHEAD
         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
Line 1105  ENDMODIFYUSERHEAD Line 1636  ENDMODIFYUSERHEAD
   ($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);    
  }   }
     }      }
     ##      ##
       my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
       if ($context eq 'course') {
           ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
       }
     if (! $env{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation'],              ('environment',['firstname','middlename','lastname','generation',
              $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};
               }
         }          }
         if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}) &&           # Check to see if we can change the ID/student number
             ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||          my $forceid = $env{'form.forceid'};
              $env{'form.cmiddlename'} ne $userenv{'middlename'} ||          my $recurseid = $env{'form.recurseid'};
              $env{'form.clastname'}   ne $userenv{'lastname'}   ||          my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
              $env{'form.cgeneration'} ne $userenv{'generation'} )) {          my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'},
             # Make the change                                              $env{'form.ccuname'});
             my %changeHash;          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 ($oldisdefault) {
               $olddefquotatext = &get_defaultquota_text($settingstatus);
           }
           if ($newisdefault) {
               $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{'firstname'}  = $env{'form.cfirstname'};
             $changeHash{'middlename'} = $env{'form.cmiddlename'};              $changeHash{'middlename'} = $env{'form.cmiddlename'};
             $changeHash{'lastname'}   = $env{'form.clastname'};              $changeHash{'lastname'}   = $env{'form.clastname'};
             $changeHash{'generation'} = $env{'form.cgeneration'};              $changeHash{'generation'} = $env{'form.cgeneration'};
             my $putresult = &Apache::lonnet::put              $changeHash{'id'}         = $env{'form.cid'};
                 ('environment',\%changeHash,              $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
                  $env{'form.ccdomain'},$env{'form.ccuname'});              my ($quotachgresult,$namechgresult);
             if ($putresult eq 'ok') {              if ($quotachanged) {
                   $quotachgresult = 
                       &Apache::lonnet::put('environment',\%changeHash,
                                     $env{'form.ccdomain'},$env{'form.ccuname'});
               }
               if ($namechanged) {
               # Make the change
                   $namechgresult =
                       &Apache::lonnet::modifyuser($env{'form.ccdomain'},
                           $env{'form.ccuname'},$changeHash{'id'},undef,undef,
                           $changeHash{'firstname'},$changeHash{'middlename'},
                           $changeHash{'lastname'},$changeHash{'generation'},
                           $changeHash{'id'},undef,$changeHash{'permanentemail'});
                   %userupdate = (
                                  lastname   => $env{'form.clastname'},
                                  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 1145  ENDMODIFYUSERHEAD Line 1864  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>$userenv{'permanentemail'} </td>
   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.cfirstname'}  </td>
     <td>$env{'form.cmiddlename'} </td>      <td>$env{'form.cmiddlename'} </td>
     <td>$env{'form.clastname'}   </td>      <td>$env{'form.clastname'}   </td>
     <td>$env{'form.cgeneration'} </td></tr>      <td>$env{'form.cgeneration'} </td>
 </table>      <td>$env{'form.cid'} </td>
       <td>$env{'form.cpermanentemail'} </td>
 END  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);
           $r->print('<p><a href="javascript:backPage(document.userupdate)">'.                  &mt('Enroll Another Student').'</a></p>');
       } else {
           my @rolechanges = &update_roles($r);
           if ($namechanged) {
               if ($context eq 'course') {
                   if (@userroles > 0) {
                       if ((@rolechanges == 0) || 
                           (!(grep(/^st$/,@rolechanges)))) {
                           if (grep(/^st$/,@userroles)) {
                               my $classlistupdated =
                                   &Apache::lonuserutils::update_classlist($cdom,
                                                 $cnum,$env{'form.ccdomain'},
                                          $env{'form.ccuname'},\%userupdate);
                           }
                       }
                   }
               }
           }
           my $userinfo = &Apache::loncommon::plainname($env{'form.ccuname'},
                                                        $env{'form.ccdomain'}); 
           $r->print('<p><a href="javascript:backPage(document.userupdate,'."'$env{'form.prevphase'}','modify'".')">'.&mt('Modify this user: <span class="LC_cusr_emph">([_1])</span>',$userinfo).'</a>'.('&nbsp;'x5).'<a href="javascript:backPage(document.userupdate)">'.&mt('Create/Modify Another User').'</a></p>');
       }
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub update_roles {
       my ($r) = @_;
     my $now=time;      my $now=time;
       my @rolechanges;
       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,
                          &escape($env{'form.ccuname'}.':'.                              $env{'form.ccuname'},$env{'form.ccdomain'},
                              $env{'form.ccdomain'}).'='.      $now);
                          &escape($now.':'),      $r->print($result);
                      $env{'course.'.$cid.'.home'}).'</b><br />');  
  }   }
     }                   if (!grep(/^\Q$role\E$/,@rolechanges)) {
     if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {                      push(@rolechanges,$role);
                   }
       }
       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 />');
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
     }      }
  } elsif ($_=~/^form\.del/) {   } elsif ($key=~/^form\.del/) {
     if ($_=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {      if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
 # Delete standard role  # Delete standard role
         $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.   my ($scope,$role) = ($1,$2);
                      &Apache::lonnet::assignrole($env{'form.ccdomain'},   my $result =
                      $env{'form.ccuname'},$1,$2,$now,0,1).'<br />');      &Apache::lonnet::assignrole($env{'form.ccdomain'},
  if ($2 eq 'st') {   $env{'form.ccuname'},
     $1=~/^\/(\w+)\/(\w+)/;   $scope,$role,$now,0,1);
     my $cid=$1.'_'.$2;          $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
     $r->print(&mt('Drop from classlist').': <b>'.        '<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,
                          &escape($env{'form.ccuname'}.':'.                              $env{'form.ccuname'},$env{'form.ccdomain'},
                              $env{'form.ccdomain'}).'='.      $now);
                          &escape($now.':'),      $r->print($result);
                      $env{'course.'.$cid.'.home'}).'</b><br />');  
  }   }
                   if (!grep(/^\Q$role\E$/,@rolechanges)) {
                       push(@rolechanges,$role);
                   }
             }              }
             if ($_=~/^form\.del\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {      if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                 my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);                  my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
 # Delete custom role  # Delete custom role
                 $r->print(&mt('Deleting custom role [_1] by [_2]@[_3] in [_4]',                  $r->print(&mt('Deleting custom role [_1] by [_2]:[_3] in [_4]',
                       $rolename,$rnam,$rdom,$url).': <b>'.                        $rolename,$rnam,$rdom,$url).': <b>'.
                       &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},                        &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
                          $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,                           $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
                          0,1).'</b><br />');                           0,1).'</b><br />');
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
             }              }
  } elsif ($_=~/^form\.ren/) {   } elsif ($key=~/^form\.ren/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
 # Re-enable standard role  # Re-enable standard role
     if ($_=~/^form\.ren\:([^\_]+)\_([^\_\.]+)$/) {      if ($key=~/^form\.ren\:([^\_]+)\_([^\_\.]+)$/) {
                 my $url = $1;                  my $url = $1;
                 my $role = $2;                  my $role = $2;
                 my $logmsg;                  my $logmsg;
                 my $output;                  my $output;
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     if ($url =~ m-^/(\w+)/(\w+)/?(\w*)$-) {                      if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) {
                         my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3);                          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')) {                          if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) {
                             $output = "Error: $result\n";                              if ($result eq 'refused' && $logmsg) {
                                   $output = $logmsg;
                               } else { 
                                   $output = "Error: $result\n";
                               }
                         } else {                          } else {
                             $output = &mt('Assigning').' '.$role.' in '.$url.                              $output = &mt('Assigning').' '.$role.' in '.$url.
                                       &mt('starting').' '.localtime($now).                                        &mt('starting').' '.localtime($now).
Line 1277  END Line 2127  END
       $role,$url,$result).'<br />';        $role,$url,$result).'<br />';
  }   }
                 $r->print($output);                  $r->print($output);
                   if (!grep(/^\Q$role\E$/,@rolechanges)) {
                       push(@rolechanges,$role);
                   }
     }      }
 # Re-enable custom role  # Re-enable custom role
             if ($_=~/^form\.ren\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {      if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                 my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);                  my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
                 my $result = &Apache::lonnet::assigncustomrole(                  my $result = &Apache::lonnet::assigncustomrole(
                                $env{'form.ccdomain'}, $env{'form.ccuname'},                                 $env{'form.ccdomain'}, $env{'form.ccuname'},
                                $url,$rdom,$rnam,$rolename,0,$now);                                 $url,$rdom,$rnam,$rolename,0,$now);
                 $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',                  $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',
                           $rolename,$rnam,$rdom,$url,$result).'<br />');                            $rolename,$rnam,$rdom,$url,$result).'<br />');
                   if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
             }              }
  } elsif ($_=~/^form\.act/) {   } elsif ($key=~/^form\.act/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
     if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {      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;
Line 1321  END Line 2177  END
         $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));          $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
                     }                      }
                 }                  }
     } elsif ($_=~/^form\.act\_([^\_]+)\_(\w+)\_([^\_]+)$/) {                  if (!grep(/^cr$/,@rolechanges)) {
                       push(@rolechanges,'cr');
                   }
       } 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);
Line 1359  END Line 2218  END
                     if ($emptysec) {                      if ($emptysec) {
                         $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));                          $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
                     }                      }
                 }                   }
     } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {                  if (!grep(/^\Q$three\E$/,@rolechanges)) {
                       push(@rolechanges,$three);
                   }
       } 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} ? 
Line 1369  END Line 2231  END
  my $end   = ( $env{'form.end_'.$1.'_'.$2} ?    my $end   = ( $env{'form.end_'.$1.'_'.$2} ? 
       $env{'form.end_'.$1.'_'.$2} :        $env{'form.end_'.$1.'_'.$2} :
       0 );        0 );
  my $url='/'.$1.'/';                  my $one = $1;
                   my $two = $2;
    my $url='/'.$one.'/';
                 # split multiple sections                  # split multiple sections
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two},\%sections,$two);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,''));
                 } else {                  } else {
                     my $emptysec = 0;                      my $emptysec = 0;
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                         if ($sec ne '') {                          if ($sec ne '') {
                             my $securl = $url.'/'.$sec;                              my $securl = $url.'/'.$sec;
                             $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec));
                         } else {                          } else {
                             $emptysec = 1;                              $emptysec = 1;
                         }                          }
                     }                      }
                     if ($emptysec) {                      if ($emptysec) {
                         $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                          $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,''));
                     }                      }
                 }                  }
                   if (!grep(/^\Q$two\E$/,@rolechanges)) {
                       push(@rolechanges,$two);
                   }
     } 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))) {              foreach my $key (sort(keys(%disallowed))) {
                 if (($key eq 'none') || ($key eq 'all')) {                    if (($key eq 'none') || ($key eq 'all')) {  
Line 1404  END Line 2271  END
     } # 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('<p><a href="/adm/createuser">Create/Modify Another User</a></p>');      if (@rolechanges == 0) {
     $r->print(&Apache::loncommon::end_page());          $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 {  sub build_roles {
Line 1420  sub build_roles { Line 2385  sub build_roles {
         } else {          } else {
             foreach my $sec (@secnums) {              foreach my $sec (@secnums) {
                 $sec =~ ~s/\W//g;                  $sec =~ ~s/\W//g;
                 unless ($sec eq "") {                  if (!($sec eq "")) {
                     if (exists($$sections{$sec})) {                      if (exists($$sections{$sec})) {
                         $$sections{$sec} ++;                          $$sections{$sec} ++;
                     } else {                      } else {
Line 1444  sub build_roles { Line 2409  sub build_roles {
 # ========================================================== 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') {
Line 1453  sub custom_role_editor { Line 2418  sub custom_role_editor {
   
     $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::start_page('Custom Role Editor'));      my %full=();
       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?
     $r->print('<h2>');      $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 1490  sub custom_role_editor { Line 2455  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 1501  sub custom_role_editor { Line 2466  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',
                                                     'Course_Editing_Custom_Roles'));
   
       $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
       $r->print(&Apache::loncommon::start_data_table().
                 &Apache::loncommon::start_data_table_header_row(). 
   '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.
   '</th><th>'.$lt{'ssl'}.'</th>'.
                 &Apache::loncommon::end_data_table_header_row());
     foreach my $priv (sort keys %full) {      foreach my $priv (sort keys %full) {
         my $privtext = &Apache::lonnet::plaintext($priv);          my $privtext = &Apache::lonnet::plaintext($priv);
  $r->print('<tr><td>'.$privtext.'</td><td>'.          $r->print(&Apache::loncommon::start_data_table_row().
     ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.':c" '.            '<td>'.$privtext.'</td><td>'.
       ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c" '.
     ($courselevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').      ($courselevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>'.
     ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.':d" '.      ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d" '.
     ($domainlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').      ($domainlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>'.
     ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.':s" '.      ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s" '.
     ($systemlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').      ($systemlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td></tr>');      '</td>'.
                &Apache::loncommon::end_data_table_row());
     }      }
     $r->print(      $r->print(&Apache::loncommon::end_data_table().
    '<table><input type="submit" value="'.&mt('Define Role').'" /></form>'.     '<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());        &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";
           }
       }
       my %role_s;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_s{$priv_item} = 1;
       }
       foreach my $priv_item (keys(%full_s)) {
           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) = @_;      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',
                                                     'Course_Editing_Custom_Roles'));
   
     $r->print(&Apache::loncommon::start_page('Save Custom Role').'<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: '.
Line 1608  sub set_custom_role { Line 2690  sub set_custom_role {
  $env{'user.name'},   $env{'user.name'},
  $rolename));   $rolename));
     }      }
     $r->print('<p><a href="/adm/createuser">Create another role, or Create/Modify a user.</a></p>');      $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());      $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',
                                                      'Course_Create_Class_List'));
           $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;
  (&authorpriv($env{'user.name'},$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",
                                                             'Course_View_Class_List'));
               if ($permission->{'cusr'}) {
                   &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice);
                   $r->print(&Apache::loncommon::end_page());
               } else {
                   $r->print(&mt('You are not authorized to make bulk changes to user roles'));
                   $r->print('<p><a href="/adm/createuser?action=listusers">'.&mt('Display User Lists').'</a>');
                   $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",
                                                             'Course_View_Class_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 => 'Course_Create_Class_List',
               action => 'upload',
               permission => $permission->{'cusr'},
               },
             { text => $links{$context}{'singleuser'}, 
               help => 'Course_Change_Privileges',
               action => 'singleuser',
               permission => $permission->{'cusr'},
               },
             { text => $links{$context}{'listusers'},
               help => 'Course_View_Class_List',
               action => 'listusers',
               permission => ($permission->{'view'} || $permission->{'cusr'}),
             },
           );
       if ($context eq 'domain' || $context eq 'course') {
           my $customlink =  { text => 'Edit Custom Roles',
                               help => 'Course_Editing_Custom_Roles',
                               action => 'custom',
                               permission => $permission->{'custom'},
                             };
           push(@menu,$customlink);
       }
       if ($context eq 'course') {
           my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
           my @courselinks =
               (
                 { text => 'Enroll a Single Student',
                    help => 'Course_Add_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(      my %lt=&Apache::lonlocal::texthash(
             'exs'  => "Existing sections",              'exs'  => "Existing sections",
             'new'  => "Define new section",              'new'  => "Define new section",
Line 1671  sub course_level_table { Line 3525  sub course_level_table {
             'end'  => "End"              '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'};
         my $type=$coursedata{'type'};          my $type=$coursedata{'type'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$_; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  my $bgcol=$thiscourse;  
  $bgcol=~s/[^7-9a-e]//g;  
  $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);  
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count;          my %sections_count;
         if (defined($env{'request.course.id'})) {          if (defined($env{'request.course.id'})) {
Line 1690  sub course_level_table { Line 3540  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
  foreach  ('st','ta','ep','in','cc') {          my @roles = &Apache::lonuserutils::roles_by_context('course');
     if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {   foreach my $role (@roles) {
  my $plrole=&Apache::lonnet::plaintext($_);              my $plrole=&Apache::lonnet::plaintext($role);
  $table .= <<ENDEXTENT;      if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
 <tr bgcolor="#$bgcol">                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
 <td><input type="checkbox" name="act_$protectedcourse\_$_"></td>                                              $plrole,\%sections_count,\%lt);    
 <td>$plrole</td>              } elsif ($env{'request.course.sec'} ne '') {
 <td>$area<br />Domain: $domain</td>                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
 ENDEXTENT                                               $env{'request.course.sec'})) {
         if ($_ ne 'cc') {                      $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                     if (%sections_count) {                                                  $plrole,\%sections_count,\%lt);
                         my $currsec = &course_sections(\%sections_count,$protectedcourse.'_'.$_);  
                         $table .=   
                     '<td><table border="0" cellspacing="0" cellpadding="0">'.  
                      '<tr><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.'_'.$_.'" value="" /></td>'.  
                      '<input type="hidden" '.  
                      'name="sec_'.$protectedcourse.'_'.$_.'"></td>'.  
                      '</tr></table></td>';  
                     } else {  
                         $table .= '<td><input type="text" size="10" '.  
                      'name="sec_'.$protectedcourse.'_'.$_.'"></td>';  
                     }  
                 } else {   
     $table .= '<td>&nbsp</td>';  
                 }                  }
  $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);
  $table .= <<END;              }
 <tr bgcolor="#$bgcol">  
 <td><input type="checkbox" name="act_$customrole"></td>  
 <td>$plrole</td>  
 <td>$area</td>  
 END  
                 if (%sections_count) {  
                     my $currsec = &course_sections(\%sections_count,$customrole);  
                     $table.=  
                    '<td><table border="0" cellspacing="0" cellpadding="0">'.  
                    '<tr><td valign="top">'.$lt{'exs'}.'<br />'.  
                      $currsec.'</td>'.  
                    '<td>&nbsp;&nbsp;</td>'.  
                    '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.  
                    '<input type="text" name="newsec_'.$customrole.'" value="" /></td>'.  
                    '<input type="hidden" '.  
                    'name="sec_'.$customrole.'"></td>'.  
                    '</tr></table></td>';  
                 } else {  
                     $table .= '<td><input type="text" size="10" '.  
                      'name="sec_'.$customrole.'"></td>';  
                 }  
                 $table .= <<ENDENTRY;  
 <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 = <<ENDTABLE;      my $result;
 <h4>$lt{'crl'}</h4>      if (!$env{'request.course.id'}) {
 <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th>          $result = '<h4>'.$lt{'crl'}.'</h4>'."\n";
 <th>$lt{'grs'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th></tr>      }
 $table      $result .= 
 </table>  &Apache::loncommon::start_data_table().
 ENDTABLE  &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;      return $result;
 }  }
   
 sub course_sections {  sub course_level_row {
     my ($sections_count,$role) = @_;      my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_;
     my $output = '';      my $row = &Apache::loncommon::start_data_table_row().
     my @sections = (sort {$a <=> $b} keys %{$sections_count});                ' <td><input type="checkbox" name="act_'.
     if (scalar(@sections) == 1) {                $protectedcourse.'_'.$role.'" /></td>'."\n".
         $output = '<select name="currsec_'.$role.'" >'."\n".                ' <td>'.$plrole.'</td>'."\n".
                   '  <option value="">Select</option>'."\n".                ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
                   '  <option value="">No section</option>'."\n".      if ($role eq 'cc') {
                   '  <option value="'.$sections[0].'" >'.$sections[0].'</option>'."\n";          $row .= '<td>&nbsp;</td>';
     } else {      } elsif ($env{'request.course.sec'} ne '') {
         $output = '<select name="currsec_'.$role.'" ';          $row .= ' <td><input type="hidden" value="'.
         my $multiple = 4;                  $env{'request.course.sec'}.'" '.
         if (scalar(@sections) < 4) { $multiple = scalar(@sections); }                  'name="sec_'.$protectedcourse.'_'.$role.'" />'.
         $output .= '"multiple" size="'.$multiple.'">'."\n";                  $env{'request.course.sec'}.'</td>';
         foreach (@sections) {      } else {
             $output .= '<option value="'.$_.'">'.$_."</option>\n";          if (ref($sections_count) eq 'HASH') {
               my $currsec = 
                   &Apache::lonuserutils::course_sections($sections_count,
                                                          $protectedcourse.'_'.$role);
               $row .= '<td><table class="LC_createuser">'."\n".
                       '<tr class="LC_section_row">'."\n".
                       ' <td valign="top">'.$lt->{'exs'}.'<br />'.
                          $currsec.'</td>'."\n".
                        ' <td>&nbsp;&nbsp;</td>'."\n".
                        ' <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>'."\n";
           } else {
               $row .= '<td><input type="text" size="10" '.
                         'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'."\n";
         }          }
     }      }
     $output .= '</select>';       $row .= <<ENDTIMEENTRY;
     return $output;  <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
       $row .= &Apache::loncommon::end_data_table_row();
       return $row;
 }  }
   
 sub course_level_dc {  sub course_level_dc {
     my ($dcdom) = @_;      my ($dcdom) = @_;
     my %customroles=&my_custom_roles();      my %customroles=&Apache::lonuserutils::my_custom_roles();
       my @roles = &Apache::lonuserutils::roles_by_context('course');
     my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.      my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.                        '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="dccourse" value="'.$dcdom.'" />';                        '<input type="hidden" name="dccourse" value="" />';
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
             ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';              ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';
     my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu');      my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu');
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'typ' => "Type",  
                     'rol'  => "Role",                      'rol'  => "Role",
                     'grs'  => "Section",                      'grs'  => "Section",
                     'exs'  => "Existing sections",                      'exs'  => "Existing sections",
Line 1823  sub course_level_dc { Line 3647  sub course_level_dc {
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
                   );                    );
     my $header = '<h4>'.&mt('Course Level').'</h4>'.      my $header = '<h4>'.&mt('Course Level').'</h4>'.
                  '<table border="2"><tr><th>'.$lt{'typ'}.'</th><th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th></tr>';                   &Apache::loncommon::start_data_table().
     my $otheritems = '<tr><td><select name="crstype" onChange="javascript:setType();">'."\n".                   &Apache::loncommon::start_data_table_header_row().
                      ' <option value="">'.&mt('Please select')."\n".                   '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                      ' <option value="Course">'.&mt('Course')."\n".                   &Apache::loncommon::end_data_table_header_row();
                      ' <option value="Non-standard course">'.&mt('Non-standard course')."\n".      my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                      '</select>'."\n".  
                      '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".                       '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                      '<td><select name="role">'."\n";                       '<td><select name="role">'."\n";
     foreach  ('st','ta','ep','in','cc') {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($_);          my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$_.'">'.$plrole;          $otheritems .= '  <option value="'.$role.'">'.$plrole;
     }      }
     if ( keys %customroles > 0) {      if ( keys %customroles > 0) {
         foreach (sort keys %customroles) {          foreach my $cust (sort keys %customroles) {
             my $custrole='cr_cr_'.$env{'user.domain'}.              my $custrole='cr_cr_'.$env{'user.domain'}.
                     '_'.$env{'user.name'}.'_'.$_;                      '_'.$env{'user.name'}.'_'.$cust;
             $otheritems .= '  <option value="'.$custrole.'">'.$_;              $otheritems .= '  <option value="'.$custrole.'">'.$cust;
         }          }
     }      }
     $otheritems .= '</select></td><td>'.      $otheritems .= '</select></td><td>'.
Line 1849  sub course_level_dc { Line 3672  sub course_level_dc {
                      '<td>&nbsp;&nbsp;</td>'.                       '<td>&nbsp;&nbsp;</td>'.
                      '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.                       '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                      '<input type="text" name="newsec" value="" />'.                       '<input type="text" name="newsec" value="" />'.
                        '<input type="hidden" name="sections" value="" />'.
                      '<input type="hidden" name="groups" value="" /></td>'.                       '<input type="hidden" name="groups" value="" /></td>'.
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;
 <td><input type=hidden name="start" value=''>  <td><input type="hidden" name="start" value='' />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
 <td><input type=hidden name="end" value=''>  <td><input type="hidden" name="end" value='' />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
 ENDTIMEENTRY  ENDTIMEENTRY
     $otheritems .= "</tr></table>\n";      $otheritems .= &Apache::loncommon::end_data_table_row().
                      &Apache::loncommon::end_data_table()."\n";
     return $cb_jscript.$header.$hiddenitems.$otheritems;      return $cb_jscript.$header.$hiddenitems.$otheritems;
 }  }
   

Removed from v.1.131  
changed lines
  Added in v.1.227


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