Diff for /loncom/interface/loncreateuser.pm between versions 1.108 and 1.196

version 1.108, 2005/09/01 19:27:35 version 1.196, 2007/11/15 21:24:51
Line 64  use Apache::Constants qw(:common :http); Line 64  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::longroup;
   use Apache::lonuserutils;
   use LONCAPA qw(:DEFAULT :match);
   
 my $loginscript; # piece of javascript used in two separate instances  my $loginscript; # piece of javascript used in two separate instances
 my $generalrule;  
 my $authformnop;  my $authformnop;
 my $authformkrb;  my $authformkrb;
 my $authformint;  my $authformint;
Line 74  my $authformfsys; Line 76  my $authformfsys;
 my $authformloc;  my $authformloc;
   
 sub initialize_authen_forms {  sub initialize_authen_forms {
       my ($dom,$curr_authtype) = @_; 
     my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/);      my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/);
     $krbdefdom= uc($krbdefdom);      $krbdefdom= uc($krbdefdom);
     my %param = ( formname => 'document.cu',      my %param = ( formname => 'document.cu',
                   kerb_def_dom => $krbdefdom                     kerb_def_dom => $krbdefdom,
                   );                    domain => $dom,
                   );
       my %abv_auth = &auth_abbrev();
       if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):$/) {
           my $long_auth = $1;
           my %abv_auth = &auth_abbrev();
           $param{'curr_authtype'} = $abv_auth{$long_auth};
           if ($long_auth =~ /^krb(4|5)$/) {
               $param{'curr_kerb_ver'} = $1;
           }
       }
 # no longer static due to configurable kerberos defaults  # no longer static due to configurable kerberos defaults
 #    $loginscript  = &Apache::loncommon::authform_header(%param);  #    $loginscript  = &Apache::loncommon::authform_header(%param);
     $generalrule  = &Apache::loncommon::authform_authorwarning(%param);  
     $authformnop  = &Apache::loncommon::authform_nochange(%param);      $authformnop  = &Apache::loncommon::authform_nochange(%param);
 # no longer static due to configurable kerberos defaults  # no longer static due to configurable kerberos defaults
 #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
Line 90  sub initialize_authen_forms { Line 102  sub initialize_authen_forms {
     $authformloc  = &Apache::loncommon::authform_local(%param);      $authformloc  = &Apache::loncommon::authform_local(%param);
 }  }
   
   sub auth_abbrev {
 # ======================================================= Existing Custom Roles      my %abv_auth = (
                        krb4     => 'krb',
 sub my_custom_roles {                       internal => 'int',
     my %returnhash=();                       localuth => 'loc',
     my %rolehash=&Apache::lonnet::dump('roles');                       unix     => 'fsys',
     foreach (keys %rolehash) {                     );
  if ($_=~/^rolesdef\_(\w+)$/) {      return %abv_auth;
     $returnhash{$1}=$1;  
  }  
     }  
     return %returnhash;  
 }  }
   
 # ==================================================== Figure out author access  # ==================================================== Figure out author access
Line 113  sub authorpriv { Line 121  sub authorpriv {
     return 1;      return 1;
 }  }
   
   # ====================================================
   
   sub portfolio_quota {
       my ($ccuname,$ccdomain) = @_;
       my %lt = &Apache::lonlocal::texthash(
                      'disk' => "Disk space allocated to user's portfolio files",
                      'cuqu' => "Current quota",
                      '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;
       }
   }
   </script>
   END_SCRIPT
       if ($quotatype eq 'custom') {
           $custom_on = $custom_off;
           $custom_off = ' ';
           $showquota = $currquota;
           if ($longinsttype eq '') {
               $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=shift;      my ($r,$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 $html=&Apache::lonxml::xmlbegin();          $formtoset = 'docustom';
     my $bodytag =&Apache::loncommon::bodytag('Create Users, Change User Privileges').&Apache::loncommon::help_open_menu('',undef,undef,'',282,'Instructor Interface');          $env{'form.rolename'} = $env{'form.startrolename'};
     my $selscript=&Apache::loncommon::studentbrowser_javascript();      }
     my $sellink=&Apache::loncommon::selectstudent_link  
                                         ('crtuser','ccuname','ccdomain');      my ($jsback,$elements) = &crumb_utilities();
     my %existingroles=&my_custom_roles();  
       my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n".
           '<script type="text/javascript">'."\n".
           &Apache::lonhtmlcommon::set_form_elements($elements->{$formtoset}).
           '</script>'."\n";
   
       my %loaditems = (
                   'onload' => "javascript:setFormElements(document.$formtoset)",
                       );
       my $start_page =
    &Apache::loncommon::start_page('User Management',
          $jscript,{'add_entries' => \%loaditems,});
       if ($env{'form.action'} eq 'singleuser') {
           &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.crtuser)",
               text=>"Single user search",
               faq=>282,bug=>'Instructor Interface',});
       } elsif ($env{'form.action'} eq 'custom') {
           &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.crtuser)",
               text=>"Pick custom role",});
       }
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');
       my %existingroles=&Apache::lonuserutils::my_custom_roles();
     my $choice=&Apache::loncommon::select_form('make new role','rolename',      my $choice=&Apache::loncommon::select_form('make new role','rolename',
  ('make new role' => 'Generate new role ...',%existingroles));   ('make new role' => 'Generate new role ...',%existingroles));
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
     'siur'   => "Set Individual User Roles",                      'srch' => "User Search",
                        or    => "or",
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
                     'usrr' => "User Roles",  
                     'ecrp' => "Edit Custom Role Privileges",                      'ecrp' => "Edit Custom Role Privileges",
                     'nr'   => "Name of Role",                      'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor"                      'cre'  => "Custom Role Editor",
                       'mod'  => "to add/modify roles",
        );         );
       my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface');
     my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');      my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');      my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');
     $r->print(<<"ENDDOCUMENT");      my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');
 $html      if ($sellink) {
 <head>          $sellink = "$lt{'or'} ".$sellink;
 <title>The LearningOnline Network with CAPA</title>      } 
 $selscript      $r->print($start_page."\n".$crumbs);
 </head>      if ($env{'form.action'} eq 'singleuser') {
 $bodytag          $r->print("
 <form action="/adm/createuser" method="post" name="crtuser">  <h3>$lt{'srch'} $sellink $lt{'mod'}$helpsiur</h3>
 <input type="hidden" name="phase" value="get_user_info">  $response");
 <h2>$lt{siur}$helpsiur</h2>          $r->print(&entry_form($defdom,$srch,$forcenewuser));
 <table>      } elsif ($env{'form.action'} eq 'custom') {
 <tr><td>$lt{usr}:</td><td><input type="text" size="15" name="ccuname">          if (&Apache::lonnet::allowed('mcr','/')) {
 </td><td rowspan="2">$sellink</td></tr><tr><td>              $r->print(<<ENDCUSTOM);
 $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'}$helpecpr</h3>
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />  $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />
 <input name="customeditor" type="submit" value="$lt{'cre'}" />  <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </form>  </form>
 ENDCUSTOM  ENDCUSTOM
           }
       }
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub entry_form {
       my ($dom,$srch,$forcenewuser) = @_;
       my $userpicker = 
          &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
                                          'document.crtuser');
       my $srchbutton = &mt('Search');
       my $output = <<"ENDDOCUMENT";
   <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>
   ENDDOCUMENT
       return $output;
   }
   
   sub user_modification_js {
       my ($pjump_def,$dc_setcourse_code,$nondc_setsection_code,$groupslist)=@_;
       
       return <<END;
   <script type="text/javascript" language="Javascript">
   
       function pclose() {
           parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    "height=350,width=350,scrollbars=no,menubar=no");
           parmwin.close();
       }
   
       $pjump_def
       $dc_setcourse_code
   
       function dateset() {
           eval("document.cu."+document.cu.pres_marker.value+
               ".value=document.cu.pres_value.value");
           pclose();
     }      }
     $r->print('</body></html>');  
       $nondc_setsection_code
   
   </script>
   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) = @_;
     my $ccuname=$env{'form.ccuname'};      my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $ccdomain=$env{'form.ccdomain'};      my $sortby = $env{'form.sortby'};
   
       if (!grep(/^\Q$sortby\E$/,@fields)) {
           $sortby = 'lastname';
       }
   
       my ($jsback,$elements) = &crumb_utilities();
   
       my $jscript = (<<ENDSCRIPT);
   <script type="text/javascript">
   function pickuser(uname,udom) {
       document.usersrchform.seluname.value=uname;
       document.usersrchform.seludom.value=udom;
       document.usersrchform.phase.value="userpicked";
       document.usersrchform.submit();
   }
   
     $ccuname=~s/\W//g;  $jsback
     $ccdomain=~s/\W//g;  </script>
   ENDSCRIPT
   
     unless (($ccuname) && ($ccdomain)) {      my %lt=&Apache::lonlocal::texthash(
  &print_username_entry_form($r);                                         'usrch'          => "User Search to add/modify roles",
         return;                                         'stusrch'        => "User Search to enroll student",
                                          'usel'           => "Select a user to add/modify roles",
                                          'stusel'         => "Select a user to enroll as a student", 
                                          'username'       => "username",
                                          'domain'         => "domain",
                                          'lastname'       => "last name",
                                          'firstname'      => "first name",
                                          'permanentemail' => "permanent e-mail",
                                         );
       if ($operation eq 'createuser') {
           $r->print(&Apache::loncommon::start_page('User Management',$jscript));
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"javascript:backPage(document.usersrchform,'','')",
                 text=>"Create/modify user",
                 faq=>282,bug=>'Instructor Interface',},
                {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
                 text=>"Select User",
                 faq=>282,bug=>'Instructor Interface',});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
           $r->print("<b>$lt{'usrch'}</b><br />");
           $r->print(&entry_form($srch->{'srchdomain'},$srch));
           $r->print('<h3>'.$lt{'usel'}.'</h3>');
       } else {
           $r->print($jscript."<b>$lt{'stusrch'}</b><br />");
           $r->print(&Apache::londropadd::single_user_entry_form($srch->{'srchdomain'},$srch));
           $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
       }
       $r->print('<form name="usersrchform" method="post">'.
                 &Apache::loncommon::start_data_table()."\n".
                 &Apache::loncommon::start_data_table_header_row()."\n".
                 ' <th> </th>'."\n");
       foreach my $field (@fields) {
           $r->print(' <th><a href="javascript:document.usersrchform.sortby.value='.
                     "'".$field."'".';document.usersrchform.submit();">'.
                     $lt{$field}.'</a></th>'."\n");
       }
       $r->print(&Apache::loncommon::end_data_table_header_row());
   
       my @sorted_users = sort {
           lc($srch_results->{$a}->{$sortby})   cmp lc($srch_results->{$b}->{$sortby})
               ||
           lc($srch_results->{$a}->{lastname})  cmp lc($srch_results->{$b}->{lastname})
               ||
           lc($srch_results->{$a}->{firstname}) cmp lc($srch_results->{$b}->{firstname})
       ||
    lc($a) cmp lc($b)
           } (keys(%$srch_results));
   
       foreach my $user (@sorted_users) {
           my ($uname,$udom) = split(/:/,$user);
           $r->print(&Apache::loncommon::start_data_table_row().
                     '<td><input type="button" name="seluser" value="'.&mt('Select').'" onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".')" /></td>'.
                     '<td><tt>'.$uname.'</tt></td>'.
                     '<td><tt>'.$udom.'</tt></td>');
           foreach my $field ('lastname','firstname','permanentemail') {
               $r->print('<td>'.$srch_results->{$user}->{$field}.'</td>');
           }
           $r->print(&Apache::loncommon::end_data_table_row());
       }
       $r->print(&Apache::loncommon::end_data_table().'<br /><br />');
       if (ref($srcharray) eq 'ARRAY') {
           foreach my $item (@{$srcharray}) {
               $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n");
           }
       }
       $r->print(' <input type="hidden" name="sortby" value="'.$sortby.'" />'."\n".
                 ' <input type="hidden" name="seluname" value="" />'."\n".
                 ' <input type="hidden" name="seludom" value="" />'."\n".
                 ' <input type="hidden" name="currstate" value="select" />'."\n".
                 ' <input type="hidden" name="phase" value="get_user_info" />'."\n".
                 ' <input type="hidden" name="action" value="singleuser" />'."\n");
       $r->print($response);
       if ($operation eq 'createuser') {
           $r->print('</form>'.&Apache::loncommon::end_page());
       } else {
           $r->print('<input type="hidden" name="action" value="enrollstudent" />'."\n".
                     '<input type="hidden" name="state" value="gotusername" />'."\n");
     }      }
   }
   
   sub print_user_query_page {
       my ($r,$caller) = @_;
   # FIXME - this is for a network-wide name search (similar to catalog search)
   # To use frames with similar behavior to catalog/portfolio search.
   # To be implemented. 
       return;
   }
   
   sub print_user_modification_page {
       my ($r,$ccuname,$ccdomain,$srch,$response,$context) = @_;
       if (($ccuname eq '') || ($ccdomain eq '')) {
           my $usermsg = &mt('No username and/or domain provided.'); 
    &print_username_entry_form($r,$usermsg);
           return;
       }
       my %abv_auth = &auth_abbrev();
       my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser,
           %alerts,%curr_rules,%got_rules);
       my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
       if ($uhome eq 'no_host') {
           $newuser = 1;
           my $checkhash;
           my $checks = { 'username' => 1 };
           $checkhash->{$ccuname.':'.$ccdomain} = { 'newuser' => $newuser };
           &Apache::loncommon::user_rule_check($checkhash,$checks,
               \%alerts,\%rulematch,\%inst_results,\%curr_rules,\%got_rules);
           if (ref($alerts{'username'}) eq 'HASH') {
               if (ref($alerts{'username'}{$ccdomain}) eq 'HASH') {
                   my $domdesc =
                       &Apache::lonnet::domain($ccdomain,'description');
                   if ($alerts{'username'}{$ccdomain}{$ccuname}) {
                       my $userchkmsg;
                       if (ref($curr_rules{$ccdomain}) eq 'HASH') {  
                           $userchkmsg = 
                               &Apache::loncommon::instrule_disallow_msg('username',
                                                                    $domdesc,1).
                           &Apache::loncommon::user_rule_formats($ccdomain,
                               $domdesc,$curr_rules{$ccdomain}{'username'},
                               'username');
                       }
                       &print_username_entry_form($r,$userchkmsg);
                       return;
                   } 
               }
           }
       } else {
           $newuser = 0;
           my $currentauth = 
               &Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
           if ($currentauth =~ /^(krb4|krb5|unix|internal|localauth):/) {
               $curr_authtype = $abv_auth{$1};
               if ($currentauth =~ /^krb(4|5)/) {
                   $curr_kerb_ver = $1;
               }
           }
       }
       if ($response) {
           $response = '<br />'.$response
       }
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
   
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
Line 191  sub print_user_modification_page { Line 497  sub print_user_modification_page {
   
     my %param = ( formname => 'document.cu',      my %param = ( formname => 'document.cu',
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                   kerb_def_auth => $krbdef                    kerb_def_auth => $krbdef,
                   );                    curr_authtype => $curr_authtype,
                     curr_kerb_ver => $curr_kerb_ver,
                     domain => $ccdomain,
                   );
     $loginscript  = &Apache::loncommon::authform_header(%param);      $loginscript  = &Apache::loncommon::authform_header(%param);
     $authformkrb  = &Apache::loncommon::authform_kerberos(%param);      $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
   
     $ccuname=~s/\W//g;  
     $ccdomain=~s/\W//g;  
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $dc_setcourse_code = '';      my $dc_setcourse_code = '';
     my $loaditem;      my $nondc_setsection_code = '';                                        
     if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {  
       my %loaditem;
   
       my $groupslist;
       my %curr_groups = &Apache::longroup::coursegroups();
       if (%curr_groups) {
           $groupslist = join('","',sort(keys(%curr_groups)));
           $groupslist = '"'.$groupslist.'"';   
       }
   
       if ($env{'request.role'} =~ m-^dc\./($match_domain)/$-) {
         my $dcdom = $1;          my $dcdom = $1;
         $loaditem = qq|OnLoad="document.cu.coursedesc.value=''"|;          $loaditem{'onload'} = "document.cu.coursedesc.value='';";
           my @rolevals = ('st','ta','ep','in','cc');
           my (@crsroles,@grproles);
           for (my $i=0; $i<@rolevals; $i++) {
               $crsroles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Course');
               $grproles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Group');
           }
           my $rolevalslist = join('","',@rolevals);
           my $crsrolenameslist = join('","',@crsroles);
           my $grprolenameslist = join('","',@grproles);
           my $pickcrsfirst = '<--'.&mt('Pick course first');
           my $pickgrpfirst = '<--'.&mt('Pick group first'); 
         $dc_setcourse_code = <<"ENDSCRIPT";          $dc_setcourse_code = <<"ENDSCRIPT";
     function setCourse() {      function setCourse() {
         var course = document.cu.dccourse.value;          var course = document.cu.dccourse.value;
Line 215  sub print_user_modification_page { Line 543  sub print_user_modification_page {
             var userrole = document.cu.role.options[document.cu.role.selectedIndex].value              var userrole = document.cu.role.options[document.cu.role.selectedIndex].value
             var section="";              var section="";
             var numsections = 0;              var numsections = 0;
               var newsecs = new Array();
             for (var i=0; i<document.cu.currsec.length; i++) {              for (var i=0; i<document.cu.currsec.length; i++) {
                 if (document.cu.currsec.options[i].selected == true ) {                  if (document.cu.currsec.options[i].selected == true ) {
                     if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) {                       if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) { 
Line 236  sub print_user_modification_page { Line 565  sub print_user_modification_page {
                 else {                  else {
                     section = section + "," +  document.cu.newsec.value                      section = section + "," +  document.cu.newsec.value
                 }                  }
                 var numsplit = document.cu.newsec.value.split(/,/g);                  newsecs = document.cu.newsec.value.split(/,/g);
                 numsections = numsections + numsplit.length;                  numsections = numsections + newsecs.length;
             }              }
             if ((userrole == 'st') && (numsections > 1)) {              if ((userrole == 'st') && (numsections > 1)) {
                 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.")                  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.")
                 return;                  return;
             }              }
               for (var j=0; j<newsecs.length; j++) {
                   if ((newsecs[j] == 'all') || (newsecs[j] == 'none')) {
                       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.");
                       return;
                   }
                   if (document.cu.groups.value != '') {
                       var groups = document.cu.groups.value.split(/,/g);
                       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)) {              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.");                  alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
                 section = "";                  section = "";
             }              }
               var coursename = "_$dcdom"+"_"+course+"_"+userrole
             var numcourse = getIndex(document.cu.dccourse);              var numcourse = getIndex(document.cu.dccourse);
             if (numcourse == "-1") {              if (numcourse == "-1") {
                 alert("There was a problem with your course selection");                  alert("There was a problem with your course selection");
                 return                  return
             }              }
             else {               else {
                 var coursename = "_$dcdom"+"_"+course+"_"+userrole                  document.cu.elements[numcourse].name = "act"+coursename;
                 document.cu.elements[numcourse].name = "act"+coursename                  var numnewsec = getIndex(document.cu.newsec);
                 document.cu.elements[numcourse+4].name = "sec"+coursename                  if (numnewsec != "-1") {
                 document.cu.elements[numcourse+4].value = section                      document.cu.elements[numnewsec].name = "sec"+coursename;
                 document.cu.elements[numcourse+5].name = "start"+coursename                      document.cu.elements[numnewsec].value = section;
                 document.cu.elements[numcourse+6].name = "end"+coursename                  }
                   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();          document.cu.submit();
Line 273  sub print_user_modification_page { Line 626  sub print_user_modification_page {
         return -1;          return -1;
     }      }
 ENDSCRIPT  ENDSCRIPT
     }      } else {
     my $html=&Apache::lonxml::xmlbegin();          $nondc_setsection_code = <<"ENDSECCODE";
     my $dochead =<<"ENDDOCHEAD";  
 $html  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 <script type="text/javascript" language="Javascript">  
   
     function pclose() {  
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",  
                  "height=350,width=350,scrollbars=no,menubar=no");  
         parmwin.close();  
     }  
   
     $pjump_def  
     $dc_setcourse_code  
   
     function dateset() {  
         eval("document.cu."+document.cu.pres_marker.value+  
             ".value=document.cu.pres_value.value");  
         pclose();  
     }  
   
     function setSections() {      function setSections() {
         var re1 = /^currsec_/;          var re1 = /^currsec_/;
           var groups = new Array($groupslist);
         for (var i=0;i<document.cu.elements.length;i++) {          for (var i=0;i<document.cu.elements.length;i++) {
             var str = document.cu.elements[i].name;              var str = document.cu.elements[i].name;
             var checkcurr = str.match(re1);              var checkcurr = str.match(re1);
             if (checkcurr != null) {              if (checkcurr != null) {
                 var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;  
                 if (document.cu.elements[i-1].checked == true) {                  if (document.cu.elements[i-1].checked == true) {
                     var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;      var match = str.split('_');
                     match = re2.exec(str);                      var role = match[3];
                     var role = match[1];  
                     if (role == 'cc') {                      if (role == 'cc') {
                         alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");                          alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
                     }                      }
Line 333  $html Line 664  $html
                         if (numsec > 0) {                          if (numsec > 0) {
                             if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {                              if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {
                                 sections = sections + "," +  document.cu.elements[i+1].value;                                  sections = sections + "," +  document.cu.elements[i+1].value;
                             }                               }
                         }                          }
                         else {                          else {
                             sections = document.cu.elements[i+1].value;                                  sections = document.cu.elements[i+1].value;
                         }                          }
                         var newsecs = document.cu.elements[i+1].value;                          var newsecs = document.cu.elements[i+1].value;
    var numsplit;
                         if (newsecs != null && newsecs != "") {                          if (newsecs != null && newsecs != "") {
                             var numsplit = newsecs.split(/,/g);                              numsplit = newsecs.split(/,/g);
                             numsec = numsec + numsplit.length;                              numsec = numsec + numsplit.length;
                         }                          }
   
                         if ((role == 'st') && (numsec > 1)) {                          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.")                                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;                              return;
                         }                          }
                         else {                           else if (numsplit != null) {
                             document.cu.elements[i+2].value = sections;                              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;
                     }                      }
                 }                  }
             }              }
         }          }
         document.cu.submit();          document.cu.submit();
     }      }
 </script>  ENDSECCODE
 </head>      }
 ENDDOCHEAD      my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
     $r->print(&Apache::loncommon::bodytag(                                     $nondc_setsection_code,$groupslist);
                                      'Create Users, Change User Privileges',undef,$loaditem));  
       my ($jsback,$elements) = &crumb_utilities();
       my $javascript_validations;
       if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($uhome eq 'no_host')) {
           my ($krbdef,$krbdefdom) =
               &Apache::loncommon::get_kerberos_defaults($ccdomain);
           $javascript_validations = 
               &Apache::lonuserutils::javascript_validations('auth',$krbdefdom,undef,
                                                           undef,$ccdomain);
       }
       $js .= "\n".
          '<script type="text/javascript">'."\n".$jsback."\n".
          $javascript_validations.'</script>';
       my $start_page = 
    &Apache::loncommon::start_page('User Management',
          $js,{'add_entries' => \%loaditem,});
       &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.cu)",
          text=>"Create/modify user",
          faq=>282,bug=>'Instructor Interface',});
   
       if ($env{'form.phase'} eq 'userpicked') {
           &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.cu,'get_user_info','select')",
          text=>"Select a user",
          faq=>282,bug=>'Instructor Interface',});
       }
       &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"javascript:backPage(document.cu,'$env{'form.phase'}','modify')",
           text=>"Set user role",
           faq=>282,bug=>'Instructor Interface',});
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');
   
     my $forminfo =<<"ENDFORMINFO";      my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="cu">  <form action="/adm/createuser" method="post" name="cu">
 <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 ($uhome eq 'no_host') {
         my $home_server_list=          my $portfolioform;
             '<option value="default" selected>default</option>'."\n".          if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
                 &Apache::loncommon::home_server_option_list($ccdomain);              # Current user has quota modification privileges
                       $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);
  my %lt=&Apache::lonlocal::texthash(          }
                     'cnu'  => "Create New User",          &initialize_authen_forms($ccdomain);
                     'nu'   => "New User",          my %lt=&Apache::lonlocal::texthash(
                     'id'   => "in domain",                  'cnu'            => 'Create New User',
                     'pd'   => "Personal Data",                  'ind'            => 'in domain',
                     'fn'   => "First Name",                  'lg'             => 'Login Data',
                     'mn'   => "Middle Name",                  'hs'             => "Home Server",
                     'ln'   => "Last Name",          );
                     'gen'  => "Generation",   $r->print(<<ENDTITLE);
                     'idsn' => "ID/Student Number",  $start_page
                     'hs'   => "Home Server",  $crumbs
                     'lg'   => "Login Data"  $response
        );  
  my $genhelp=&Apache::loncommon::help_open_topic('Generation');  
         &initialize_authen_forms();  
  $r->print(<<ENDNEWUSER);  
 $dochead  
 <h1>$lt{'cnu'}</h1>  
 $forminfo  $forminfo
 <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>  
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 $loginscript  $loginscript
 </script>  </script>
 <input type='hidden' name='makeuser' value='1' />  <input type='hidden' name='makeuser' value='1' />
 <h3>$lt{'pd'}</h3>  <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain</h2>
 <p>  ENDTITLE
 <table>          $r->print('<div class="LC_left_float">'.
 <tr><td>$lt{'fn'}  </td>                    &personal_data_display($ccuname,$ccdomain,$newuser,
     <td><input type='text' name='cfirst'  size='15' /></td></tr>                                           %inst_results));
 <tr><td>$lt{'mn'} </td>           my ($home_server_pick,$numlib) = 
     <td><input type='text' name='cmiddle' size='15' /></td></tr>              &Apache::loncommon::home_server_form_item($ccdomain,'hserver',
 <tr><td>$lt{'ln'}   </td>                                                        'default','hide');
     <td><input type='text' name='clast'   size='15' /></td></tr>          if ($numlib > 1) {
 <tr><td>$lt{'gen'}$genhelp</td>              $r->print("
     <td><input type='text' name='cgen'    size='5'  /></td></tr>  <br />
 </table>  $lt{'hs'}: $home_server_pick
 $lt{'idsn'} <input type='text' name='cstid'   size='15' /></p>  <br />");
 $lt{'hs'}: <select name="hserver" size="1"> $home_server_list </select>          } else {
 <hr />              $r->print($home_server_pick);
 <h3>$lt{'lg'}</h3>          }
 <p>$generalrule </p>          if ($context eq 'domain') {
 <p>$authformkrb </p>              $r->print(&Apache::lonuserutils::forceid_change());
 <p>$authformint </p>          }
 <p>$authformfsys</p>          $r->print('</div>'."\n".'<div class="LC_left_float"><h3>'.
 <p>$authformloc </p>                    $lt{'lg'}.'</h3>');
 ENDNEWUSER          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(<<ENDPORT);
           $portfolioform
   </div><div class="LC_clear_float_footer"></div>
   ENDPORT
     } 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",                      
                     'id'   => "in domain",                      'id'   => "in domain",
                     'fn'   => "first name",  
                     'mn'   => "middle name",  
                     'ln'   => "last name",  
                     'gen'  => "generation"  
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
 $dochead  $start_page
 <h1>$lt{'cup'}</h1>  $crumbs
 $forminfo  $forminfo
 <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>  <h2>$lt{'cup'} "$ccuname" $lt{'id'} "$ccdomain"</h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         # Get the users information          $r->print('<div class="LC_left_float">'.
         my %userenv = &Apache::lonnet::get('environment',                    &personal_data_display($ccuname,$ccdomain,$newuser,
                           ['firstname','middlename','lastname','generation'],                                           %inst_results).
                           $ccdomain,$ccuname);                    '</div>');
         my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);          my $user_auth_text = 
         $r->print(<<END);              &user_authentication($ccuname,$ccdomain,$krbdefdom,\%abv_auth);
 <hr />          my $user_quota_text;
 <table border="2">          if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
 <tr>              # Current user has quota modification privileges
 <th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th>              $user_quota_text = &portfolio_quota($ccuname,$ccdomain);
 </tr>          } elsif (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
 <tr>              # Get the user's portfolio information
 END              my %portq = &Apache::lonnet::get('environment',['portfolioquota'],
         foreach ('firstname','middlename','lastname','generation') {                                               $ccdomain,$ccuname);
            if (&Apache::lonnet::allowed('mau',$ccdomain)) {  
               $r->print(<<"END");                          my %lt=&Apache::lonlocal::texthash(
 <td><input type="text" name="c$_" value="$userenv{$_}" size="15" /></td>                  'dska'  => "Disk space allocated to user's portfolio files",
 END                  'youd'  => "You do not have privileges to modify the portfolio quota for this user.",
            } else {                  'ichr'  => "If a change is required, contact a domain coordinator for the domain",
                $r->print('<td>'.$userenv{$_}.'</td>');              );
            }              $user_quota_text = <<ENDNOPORTPRIV;
   <h3>$lt{'dska'}</h3>
   $lt{'youd'} $lt{'ichr'}: $ccdomain
   ENDNOPORTPRIV
         }          }
       $r->print(<<END);          if ($user_auth_text ne '') {
 </tr>              $r->print('<div class="LC_left_float">'.$user_auth_text);
 </table>              if ($user_quota_text ne '') {
 END                  $r->print($user_quota_text);
               }
               $r->print('</div>');
   
           } elsif ($user_quota_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_quota_text.'</div>');
           }
           $r->print('<div class="LC_clear_float_footer"></div>');
           my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
         # Build up table of user roles to allow revocation of a role.          # Build up table of user roles to allow revocation of a role.
         my ($tmp) = keys(%rolesdump);          my ($tmp) = keys(%rolesdump);
         unless ($tmp =~ /^(con_lost|error)/i) {          unless ($tmp =~ /^(con_lost|error)/i) {
            my $now=time;             my $now=time;
    my %lt=&Apache::lonlocal::texthash(     my %lt=&Apache::lonlocal::texthash(
     'rer'  => "Revoke Existing Roles",      'rer'  => "Existing Roles",
                     'rev'  => "Revoke",                                          'rev'  => "Revoke",                    
                     'del'  => "Delete",                      'del'  => "Delete",
     'ren'  => "Re-Enable",      'ren'  => "Re-Enable",
Line 502  END Line 925  END
                    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 =~ /^\/(\w+)\/(\d\w+)/ ) {                 if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
    $class='Course';     $class='Course';
                    my ($coursedom,$coursedir) = ($1,$2);                     my ($coursedom,$coursedir) = ($1,$2);
    $sortkey.="\0$1";     $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);
Line 521  END Line 943  END
                            '<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'};
    } else {     } else {
        $carea=&mt('Unavailable course').': '.$area;         $carea=&mt('Unavailable course').': '.$area;
        $sortkey.="\0".&mt('Unavailable course').': '.$area;         $sortkey.="\0".&mt('Unavailable course').': '.$area;
    }     }
      $sortkey.="\0$coursedir";
                    $inccourses{$1.'_'.$2}=1;                     $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))) {
Line 542  END Line 966  END
        }         }
    }     }
                    # 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);  
                    if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {  
                        $carea.='<br />Section/Group: '.$3;  
        $sortkey.="\0$3";         $sortkey.="\0$3";
                    }                     }
                    $area=$carea;                     $area=$carea;
                } else {                 } else {
    $sortkey.="\0".$area;     $sortkey.="\0".$area;
                    # Determine if current user is able to revoke privileges                     # Determine if current user is able to revoke privileges
                    if ($area=~ /^\/(\w+)\//) {                     if ($area=~m{^/($match_domain)/}) {
                        if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||                         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;
Line 577  END Line 998  END
    }     }
                }                 }
                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 (&authorpriv($2,$1)) {
        $allowed=1;         $allowed=1;
                    } else {                     } else {
                        $allowed=0;                         $allowed=0;
                    }                     }
                }                 }
        $bgcol='77FF77';  
                my $row = '';                 my $row = '';
                $row.='<tr bgcolor="#'.$bgcol.'"><td>';                 $row.= '<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;';                        $row.='&nbsp;';
Line 600  END Line 1020  END
                }                 }
        $row.='</td><td>';         $row.='</td><td>';
                if ($allowed && !$active) {                 if ($allowed && !$active) {
                    $row.= '<input type="checkbox" name="ren:'.$thisrole.'">';                     $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
                } else {                 } else {
                    $row.='&nbsp;';                     $row.='&nbsp;';
                }                 }
        $row.='</td><td>';         $row.='</td><td>';
                if ($delallowed) {                 if ($delallowed) {
                    $row.= '<input type="checkbox" name="del:'.$thisrole.'">';                     $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
                } else {                 } else {
                    $row.='&nbsp;';                     $row.='&nbsp;';
                }                 }
        my $plaintext='';         my $plaintext='';
        unless ($croletitle) {         if (!$croletitle) {
    $plaintext=&Apache::lonnet::plaintext($role_code);                     $plaintext=&Apache::lonnet::plaintext($role_code,$class)
        } else {         } else {
            $plaintext=             $plaintext=
  "Customrole '$croletitle' defined by $croleuname\@$croleudom";   "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
        }         }
                $row.= '</td><td>'.$plaintext.                 $row.= '</td><td>'.$plaintext.
                       '</td><td>'.$area.                        '</td><td>'.$area.
Line 623  END Line 1043  END
                                                    : '&nbsp;' ).                                                     : '&nbsp;' ).
                       '</td><td>'.($role_end_time  ?localtime($role_end_time)                        '</td><td>'.($role_end_time  ?localtime($role_end_time)
                                                    : '&nbsp;' )                                                     : '&nbsp;' )
                       ."</td></tr>\n";                        ."</td>";
        $sortrole{$sortkey}=$envkey;         $sortrole{$sortkey}=$envkey;
        $roletext{$envkey}=$row;         $roletext{$envkey}=$row;
        $roleclass{$envkey}=$class;         $roleclass{$envkey}=$class;
Line 632  END Line 1052  END
            } # end of foreach        (table building loop)             } # end of foreach        (table building loop)
            my $rolesdisplay = 0;             my $rolesdisplay = 0;
            my %output = ();             my %output = ();
    foreach my $type ('Construction Space','Course','Domain','System','Unknown') {     foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
        $output{$type} = '';         $output{$type} = '';
        foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {         foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
    if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {      if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { 
        $output{$type}.=$roletext{$sortrole{$which}};         $output{$type}.=
                                &Apache::loncommon::start_data_table_row().
                                $roletext{$sortrole{$which}}.
                                &Apache::loncommon::end_data_table_row();
    }     }
        }         }
        unless($output{$type} eq '') {         unless($output{$type} eq '') {
    $output{$type} = "<tr bgcolor='#BBffBB'>".     $output{$type} = '<tr class="LC_info_row">'.
      "<td align='center' colspan='7'>".&mt($type)."</td>".       "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
                               $output{$type};                                $output{$type};
                    $rolesdisplay = 1;                     $rolesdisplay = 1;
        }         }
    }     }
            if ($rolesdisplay == 1) {             if ($rolesdisplay == 1) {
                $r->print(<<END);                 $r->print('
 <hr />  <h3>'.$lt{'rer'}.'</h3>'.
 <h3>$lt{'rer'}</h3>  &Apache::loncommon::start_data_table("LC_createuser").
 <table>  &Apache::loncommon::start_data_table_header_row().
 <tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'e  '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.
 xt'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>  '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
 END  '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                foreach my $type ('Construction Space','Course','Domain','System','Unknown') {  &Apache::loncommon::end_data_table_header_row());
                  foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
                    if ($output{$type}) {                     if ($output{$type}) {
                        $r->print($output{$type}."\n");                         $r->print($output{$type}."\n");
                    }                     }
                }                 }
        $r->print('</table>');         $r->print(&Apache::loncommon::end_data_table());
            }             }
         }  # End of unless          }  # 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  
     my $authformcurrent='';  
     my $authform_other='';  
             &initialize_authen_forms();  
     if ($currentauth=~/^krb(4|5):/) {  
  $authformcurrent=$authformkrb;  
  $authform_other="<p>$authformint</p>\n".  
                     "<p>$authformfsys</p><p>$authformloc</p>";  
     }  
     elsif ($currentauth=~/^internal:/) {  
  $authformcurrent=$authformint;  
  $authform_other="<p>$authformkrb</p>".  
                     "<p>$authformfsys</p><p>$authformloc</p>";  
     }  
     elsif ($currentauth=~/^unix:/) {  
  $authformcurrent=$authformfsys;  
  $authform_other="<p>$authformkrb</p>".  
                     "<p>$authformint</p><p>$authformloc;</p>";  
     }  
     elsif ($currentauth=~/^localauth:/) {  
  $authformcurrent=$authformloc;  
  $authform_other="<p>$authformkrb</p>".  
                     "<p>$authformint</p><p>$authformfsys</p>";  
     }  
             $authformcurrent.=' <i>(will override current values)</i><br />';  
             if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {  
  # Current user has login modification privileges  
  my %lt=&Apache::lonlocal::texthash(  
                                'ccld'  => "Change Current Login Data",  
        'enld'  => "Enter New Login Data"  
    );  
  $r->print(<<ENDOTHERAUTHS);  
 <hr />  
 <script type="text/javascript" language="Javascript">  
 $loginscript  
 </script>  
 <h3>$lt{'ccld'}</h3>  
 <p>$generalrule</p>  
 <p>$authformnop</p>  
 <p>$authformcurrent</p>  
 <h3>$lt{'enld'}</h3>  
 $authform_other  
 ENDOTHERAUTHS  
             }  
         }  ## End of "check for bad authentication type" logic  
     } ## End of new user/old user logic      } ## End of new user/old user logic
     $r->print('<hr /><h3>'.&mt('Add Roles').'</h3>');      my $addrolesdisplay = 0;
       $r->print('<h3>'.&mt('Add Roles').'</h3>');
 #  #
 # Co-Author  # Co-Author
 #   # 
     if (&authorpriv($env{'user.name'},$env{'request.role.domain'}) &&      if (&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
           $addrolesdisplay = 1;
  my $cuname=$env{'user.name'};   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(
Line 784  ENDOTHERAUTHS Line 1110  ENDOTHERAUTHS
                     '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()."\n".
 <td><input type=hidden name="start_$cudom\_$cuname\_ca" value='' />             '<td>
               <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />
              </td>
              <td>'.$lt{'cau'}.'</td>
              <td>'.$cudom.'_'.$cuname.'</td>
              <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_ca" value="" />
                <a href=
   "javascript:pjump('."'date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'ssd'}.'</a></td>
   <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_ca" value="" />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('."'date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
 <td><input type=hidden name="end_$cudom\_$cuname\_ca" value='' />            &Apache::loncommon::end_data_table_row()."\n".
 <a href=            &Apache::loncommon::start_data_table_row()."\n".
 "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>  '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
 </tr>  <td>'.$lt{'caa'}.'</td>
 <tr>  <td>'.$cudom.'_'.$cuname.'</td>
 <td><input type=checkbox name="act_$cudom\_$cuname\_aa" /></td>  <td><input type="hidden" name="start_'.$cudom.'_'.$cuname.'_aa" value="" />
 <td>$lt{'caa'}</td>  
 <td>$cudom\_$cuname</td>  
 <td><input type=hidden name="start_$cudom\_$cuname\_aa" value='' />  
 <a href=  <a href=
 "javascript:pjump('date_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 (!(&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'));
           }
     }      }
 #  #
 # Domain level  # Domain level
Line 819  ENDCOAUTH Line 1158  ENDCOAUTH
     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())) {
           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(         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;
     }      }
 #  #
 # Course level  # Course level
 #  #
     my $num_sections;  
   
     if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {      if ($env{'request.role'} =~ m{^dc\./($match_domain)/$}) {
         $r->print(&course_level_dc($1));          $r->print(&course_level_dc($1,'Course'));
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n");          $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");
       } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/$}) {
           if ($addrolesdisplay) {
               $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');
               if ($newuser) {
                   $r->print(' onClick="verify_message(this.form)" \>'."\n");
               } else {
                   $r->print('onClick="this.form.submit()" \>'."\n"); 
               }
           } else {
               $r->print('<br /><a href="javascript:backPage(document.cu)">'.
                         &mt('Back to previous page').'</a>');
           }
     } else {      } else {
         $r->print(&course_level_table(%inccourses));          $r->print(&course_level_table(%inccourses));
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()">'."\n");          $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()" />'."\n");
     }      }
     $r->print("</form></body></html>");      $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());
   }
   
   sub user_authentication {
       my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_;
       my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
       my ($loginscript,$outcome);
       if ($currentauth=~/^(krb)(4|5):(.*)/) {
           my $long_auth = $1.$2;
           my $curr_kerb_ver = $2;
           my $krbdefdom=$3;
           my $curr_authtype = $abv_auth->{$long_auth};
           my %param = ( formname      => 'document.cu',
                         kerb_def_dom  => $krbdefdom,
                         domain        => $ccdomain,
                         curr_authtype => $curr_authtype,
                         curr_kerb_ver => $curr_kerb_ver,
                             );
           $loginscript  = &Apache::loncommon::authform_header(%param);
       }
       # Check for a bad authentication type
       if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) {
           # bad authentication scheme
           my %lt=&Apache::lonlocal::texthash(
                          'err'   => "ERROR",
                          'uuas'  => "This user has an unrecognized authentication scheme",
                          'adcs'  => "Please alert a domain coordinator of this situation",
                          'sldb'  => "Please specify login data below",
                          'ld'    => "Login Data"
           );
           if (&Apache::lonnet::allowed('mau',$ccdomain)) {
               &initialize_authen_forms($ccdomain);
               my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
               $outcome = <<ENDBADAUTH;
   <script type="text/javascript" language="Javascript">
   $loginscript
   </script>
   <span class="LC_error">$lt{'err'}:
   $lt{'uuas'} ($currentauth). $lt{'sldb'}.</span>
   <h3>$lt{'ld'}</h3>
   $choices
   ENDBADAUTH
           } else {
               # This user is not allowed to modify the user's
               # authentication scheme, so just notify them of the problem
               $outcome = <<ENDBADAUTH;
   <span class="LC_error"> $lt{'err'}: 
   $lt{'uuas'} ($currentauth). $lt{'adcs'}.
   </span>
   ENDBADAUTH
           }
       } else { # Authentication type is valid
           my $authformcurrent='';
           my $authform_other='';
           &initialize_authen_forms($ccdomain,$currentauth);
           my ($authformcurrent,$authform_other,$can_modify) =
               &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>';
               }
               if ($authform_other ne '') {
                   $outcome .= $authform_other;
               }
               $outcome .= &Apache::loncommon::end_data_table_row().
                           &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_other,$show_override_msg);
       if ($currentauth=~/^krb(4|5):/) {
           $authformcurrent=$authformkrb;
           if ($can_assign{'int'}) {
               $authform_other = &Apache::loncommon::start_data_table_row().
                                 '<td>'.$authformint.'</td>'.
                                 &Apache::loncommon::end_data_table_row()."\n"
           }
           if ($can_assign{'loc'}) {
               $authform_other .= &Apache::loncommon::start_data_table_row().
                                  '<td>'.$authformloc.'</td>'.
                                  &Apache::loncommon::end_data_table_row()."\n";
           }
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^internal:/) {
           $authformcurrent=$authformint;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               $authform_other = &Apache::loncommon::start_data_table_row().
                                 '<td>'.$authformkrb.'</td>'.
                                 &Apache::loncommon::end_data_table_row()."\n";
           }
           if ($can_assign{'loc'}) {
               $authform_other .= &Apache::loncommon::start_data_table_row().
                                  '<td>'.$authformloc.'</td>'.
                                  &Apache::loncommon::end_data_table_row()."\n";
           }
           if ($can_assign{'int'}) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^unix:/) {
           $authformcurrent=$authformfsys;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               $authform_other = &Apache::loncommon::start_data_table_row().
                                 '<td>'.$authformkrb.'</td>'.
                                 &Apache::loncommon::end_data_table_row()."\n";
           }
           if ($can_assign{'int'}) {
               $authform_other .= &Apache::loncommon::start_data_table_row().
                                  '<td>'.$authformint.'</td>'.
                                  &Apache::loncommon::end_data_table_row()."\n"
           }
           if ($can_assign{'loc'}) {
               $authform_other .= &Apache::loncommon::start_data_table_row().
                                  '<td>'.$authformloc.'</td>'.
                                  &Apache::loncommon::end_data_table_row()."\n";
           }
           if ($can_assign{'fsys'}) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^localauth:/) {
           $authformcurrent=$authformloc;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               $authform_other = &Apache::loncommon::start_data_table_row().
                                 '<td>'.$authformkrb.'</td>'.
                                 &Apache::loncommon::end_data_table_row()."\n";
           }
           if ($can_assign{'int'}) {
               $authform_other .= &Apache::loncommon::start_data_table_row().
                                  '<td>'.$authformint.'</td>'.
                                  &Apache::loncommon::end_data_table_row()."\n"
           }
           if ($can_assign{'loc'}) {
               $show_override_msg = 1;
           }
       }
       if ($show_override_msg) {
           $authformcurrent.= ' <span class="LC_cusr_emph">'.
                               &mt('will override current values').
                               '</span><br />';
       }
       return ($authformcurrent,$authform_other,$show_override_msg); 
   }
   
   sub personal_data_display {
       my ($ccuname,$ccdomain,$newuser,%inst_results) = @_; 
       my ($output,%userenv);
       if (!$newuser) {
           # Get the users information
           %userenv = &Apache::lonnet::get('environment',
                      ['firstname','middlename','lastname','generation',
                       'permanentemail','id'],$ccdomain,$ccuname);
       }
       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 @userinfo = ('firstname','middlename','lastname','generation',
                       'permanentemail','id');
       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 ($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 {
               if (&Apache::lonnet::allowed('mau',$ccdomain)) {
                   $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';
               } else {
                   $output .= $userenv{$item};
               }
           }
           $output .= &Apache::lonhtmlcommon::row_closure(1);
       }
       $output .= &Apache::lonhtmlcommon::end_pick_box();
       return $output;
 }  }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my $r=shift;      my ($r) = @_; 
     my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $env{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
     my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';      my $error     = '<span class="LC_error">'.&mt('Error').': ';
     my $end       = '</body></html>';      my $end       = '</span><br /><br />';
     # Print header      my $rtnlink   = '<a href="javascript:backPage(document.userupdate,'.
     my $html=&Apache::lonxml::xmlbegin();                      "'$env{'form.prevphase'}','modify')".'" />'.
     $r->print(<<ENDTHREEHEAD);                      &mt('Return to previous page').'</a>'.&Apache::loncommon::end_page();
 $html  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 ENDTHREEHEAD  
     my $title;      my $title;
     if (exists($env{'form.makeuser'})) {      if (exists($env{'form.makeuser'})) {
  $title='Set Privileges for New User';   $title='Set Privileges for New User';
     } else {      } else {
         $title='Modify User Privileges';          $title='Modify User Privileges';
     }      }
     $r->print(&Apache::loncommon::bodytag($title));  
       my ($jsback,$elements) = &crumb_utilities();
       my $jscript = '<script type="text/javascript">'."\n".
                     $jsback."\n".'</script>'."\n";
   
       $r->print(&Apache::loncommon::start_page($title,$jscript));
       &Apache::lonhtmlcommon::add_breadcrumb
          ({href=>"javascript:backPage(document.userupdate)",
            text=>"Create/modify user",
            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=>"Select a user",
                faq=>282,bug=>'Instructor Interface',});
       }
       &Apache::lonhtmlcommon::add_breadcrumb
          ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",
            text=>"Set user role",
            faq=>282,bug=>'Instructor Interface',},
           {href=>"/adm/createuser",
            text=>"Result",
            faq=>282,bug=>'Instructor Interface',});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
   
       my %disallowed;
       $r->print(&update_result_form($uhome));
     # Check Inputs      # Check Inputs
     if (! $env{'form.ccuname'} ) {      if (! $env{'form.ccuname'} ) {
  $r->print($error.&mt('No login name specified').'.'.$end);   $r->print($error.&mt('No login name specified').'.'.$end.$rtnlink);
  return;   return;
     }      }
     if (  $env{'form.ccuname'}  =~/\W/) {      if (  $env{'form.ccuname'} ne 
     &LONCAPA::clean_username($env{'form.ccuname'}) ) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, @, and underscores are valid').'.'.
   $end);    $end.$rtnlink);
  return;   return;
     }      }
     if (! $env{'form.ccdomain'}       ) {      if (! $env{'form.ccdomain'}       ) {
  $r->print($error.&mt('No domain specified').'.'.$end);   $r->print($error.&mt('No domain specified').'.'.$end.$rtnlink);
  return;   return;
     }      }
     if (  $env{'form.ccdomain'} =~/\W/) {      if (  $env{'form.ccdomain'} ne
     &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt ('Invalid domain name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.
   $end);    $end.$rtnlink);
  return;   return;
     }      }
     if (! exists($env{'form.makeuser'})) {      if (! exists($env{'form.makeuser'})) {
Line 943  ENDTHREEHEAD Line 1559  ENDTHREEHEAD
         # 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 965  ENDNEWUSERHEAD Line 1579  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' => 1, 
               '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'},          my $home = &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').': '.$home.' '.
                   $Apache::lonnet::libserv{$home});                    &Apache::lonnet::hostname($home));
     } 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 1008  ENDMODIFYUSERHEAD Line 1645  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);    
  }   }
     }      }
     ##      ##
     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          # Check to see if we need to change user information
         foreach ('firstname','middlename','lastname','generation') {          foreach my $item ('firstname','middlename','lastname','generation','permanentemail','id') {
             # 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; 
           }
           # Check to see if we can change the ID/student number
           my $forceid = $env{'form.forceid'};
           my $recurseid = $env{'form.recurseid'};
           my $newuser = 0;
           my $disallowed_id = 0;
           my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
           if (!$forceid) {
               $env{'form.cid'} = $userenv{'id'};
           } elsif ($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') {
                      $disallowed_id = 1;
                   }
               }
           }
           my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota,
               $inststatus,$isdefault,$defquotatext);
           my ($defquota,$settingstatus) = 
               &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
           my %changeHash;
           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 != $userenv{'portfolioquota'}) {
                       $quotachanged = &quota_admin($newportfolioquota,\%changeHash);
                   }
               } else {
                   $quotachanged = &quota_admin('',\%changeHash);
                   $newportfolioquota = $defquota;
                   $isdefault = 1; 
               }
           } else {
               $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;
                   $isdefault = 1;
               }
           }
           if ($isdefault) {
               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});
                   }
               }
         }          }
         if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}) &&           if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}) && 
             ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||              ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
              $env{'form.cmiddlename'} ne $userenv{'middlename'} ||               $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
              $env{'form.clastname'}   ne $userenv{'lastname'}   ||               $env{'form.clastname'}   ne $userenv{'lastname'}   ||
              $env{'form.cgeneration'} ne $userenv{'generation'} )) {               $env{'form.cgeneration'} ne $userenv{'generation'} ||
                $env{'form.cid'} ne $userenv{'id'}                 ||
                $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} )) {
               $namechanged = 1;
           }
           if ($namechanged) {
             # Make the change              # Make the change
             my %changeHash;  
             $changeHash{'firstname'}  = $env{'form.cfirstname'};              $changeHash{'firstname'}  = $env{'form.cfirstname'};
             $changeHash{'middlename'} = $env{'form.cmiddlename'};              $changeHash{'middlename'} = $env{'form.cmiddlename'};
             $changeHash{'lastname'}   = $env{'form.clastname'};              $changeHash{'lastname'}   = $env{'form.clastname'};
             $changeHash{'generation'} = $env{'form.cgeneration'};              $changeHash{'generation'} = $env{'form.cgeneration'};
               $changeHash{'id'}         = $env{'form.cid'};
               $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
             my $putresult = &Apache::lonnet::put              my $putresult = &Apache::lonnet::put
                 ('environment',\%changeHash,                  ('environment',\%changeHash,
                  $env{'form.ccdomain'},$env{'form.ccuname'});                   $env{'form.ccdomain'},$env{'form.ccuname'});
Line 1048  ENDMODIFYUSERHEAD Line 1765  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"
    );     );
Line 1058  ENDMODIFYUSERHEAD Line 1778  ENDMODIFYUSERHEAD
     <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>
       <th>$lt{'id'}</th>
       <th>$lt{'mail'}</th>
       <th>$lt{'disk'}</th></tr>
 <tr><td>$lt{'prvs'}</td>  <tr><td>$lt{'prvs'}</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>
       <td>$userenv{'id'}</td>
       <td>$userenv{'permanentemail'} </td>
       <td>$oldportfolioquota Mb</td>
   </tr>
 <tr><td>$lt{'chto'}</td>  <tr><td>$lt{'chto'}</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>
       <td>$env{'form.cid'} </td>
       <td>$env{'form.cpermanentemail'} </td>
       <td>$newportfolioquota Mb $defquotatext </td></tr>
 </table>  </table>
 END  END
                   if (($forceid) && ($recurseid) && (!$disallowed_id) &&
                       (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
                       my %userupdate = (
                                     lastname   => $env{'form.clasaname'},
                                     middlename => $env{'form.cmiddlename'},
                                     firstname  => $env{'form.cfirstname'},
                                     generation => $env{'fora.cgeneration'},
                                     id         => $env{'form.cid'},
                                );
                       my $idresult = &propagate_id_change($env{'form.ccname'},
                                       $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>');
             }              }
         }  else { # End of if ($env ... ) logic          }  else { # End of if ($env ... ) logic
               my $putresult;
               if ($quotachanged) {
                   $putresult = &Apache::lonnet::put
                                    ('environment',\%changeHash,
                                     $env{'form.ccdomain'},$env{'form.ccuname'});
               }
             # They did not want to change the users name but we can              # They did not want to change the users name but we can
             # still tell them what the name is              # still tell them what the name is
     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'} eq '') {
                   $r->print('</h4>');
               } else {
                   $r->print('&nbsp;&nbsp;('.$lt{'mail'}.': '.
                             $userenv{'permanentemail'}.')</h4>');
               }
               if ($putresult eq 'ok') {
                   if ($oldportfolioquota != $newportfolioquota) {
                       $r->print('<h4>'.$lt{'disk'}.': '.$newportfolioquota.' Mb '. 
                                 $defquotatext.'</h4>');
                       &Apache::lonnet::appenv('environment.portfolioquota' => $changeHash{'portfolioquota'});
                   }
               }
         }          }
     }      }
     ##      ##
     my $now=time;      my $now=time;
       my $rolechanges = 0;
     $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 = &classlist_drop($scope,$env{'form.ccuname'},
                      $env{'course.'.$cid.'.num'}.':classlist:'.   $env{'form.ccdomain'},$now);
                          &Apache::lonnet::escape($env{'form.ccuname'}.':'.      $r->print($result);
                              $env{'form.ccdomain'}).'='.  
                          &Apache::lonnet::escape($now.':'),  
                      $env{'course.'.$cid.'.home'}).'</b><br />');  
  }   }
     }       }
     if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {      if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {
 # Revoke custom role  # Revoke custom role
  $r->print(&mt('Revoking custom role').   $r->print(&mt('Revoking custom role:').
                       ' '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'.                        ' '.$4.' by '.$3.':'.$2.' in '.$1.': <b>'.
                       &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},                        &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
   $env{'form.ccuname'},$1,$2,$3,$4).    $env{'form.ccuname'},$1,$2,$3,$4).
  '</b><br />');   '</b><br />');
     }      }
  } elsif ($_=~/^form\.del/) {              $rolechanges ++;
     if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {   } elsif ($key=~/^form\.del/) {
         $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.      if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
                      &Apache::lonnet::assignrole($env{'form.ccdomain'},  # Delete standard role
                      $env{'form.ccuname'},$1,$2,$now,0,1).'<br />');   my ($scope,$role) = ($1,$2);
  if ($2 eq 'st') {   my $result =
     $1=~/^\/(\w+)\/(\w+)/;      &Apache::lonnet::assignrole($env{'form.ccdomain'},
     my $cid=$1.'_'.$2;   $env{'form.ccuname'},
     $r->print(&mt('Drop from classlist').': <b>'.   $scope,$role,$now,0,1);
  &Apache::lonnet::critical('put:'.          $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
                              $env{'course.'.$cid.'.domain'}.':'.        '<b>'.$result.'</b>').'<br />');
                      $env{'course.'.$cid.'.num'}.':classlist:'.   if ($role eq 'st') {
                          &Apache::lonnet::escape($env{'form.ccuname'}.':'.      my $result = &classlist_drop($scope,$env{'form.ccuname'},
                              $env{'form.ccdomain'}).'='.   $env{'form.ccdomain'},$now);
                          &Apache::lonnet::escape($now.':'),      $r->print($result);
                      $env{'course.'.$cid.'.home'}).'</b><br />');  
  }   }
     }               }
  } elsif ($_=~/^form\.ren/) {      if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                   my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
   # Delete custom role
                   $r->print(&mt('Deleting custom role [_1] by [_2]:[_3] in [_4]',
                         $rolename,$rnam,$rdom,$url).': <b>'.
                         &Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
                            $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
                            0,1).'</b><br />');
               }
               $rolechanges ++;
    } elsif ($key=~/^form\.ren/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
     if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {  # Re-enable standard role
       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 = &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')) {
                             $output = "Error: $result\n";                              $output = "Error: $result\n";
                         } else {                          } else {
Line 1165  END Line 1942  END
                 } else {                  } else {
     my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},      my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                $env{'form.ccuname'},$url,$role,0,$now);                                 $env{'form.ccuname'},$url,$role,0,$now);
     $output = &mt('Re-Enabling [_1] in [_2]: [_3]',      $output = &mt('Re-enabling [_1] in [_2]: <b>[_3]</b>',
       $role,$url,$result).'<br />';        $role,$url,$result).'<br />';
  }   }
                 $r->print($output);                  $r->print($output);
     }       }
  } elsif ($_=~/^form\.act/) {  # Re-enable custom role
       if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
                   my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
                   my $result = &Apache::lonnet::assigncustomrole(
                                  $env{'form.ccdomain'}, $env{'form.ccuname'},
                                  $url,$rdom,$rnam,$rolename,0,$now);
                   $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',
                             $rolename,$rnam,$rdom,$url,$result).'<br />');
               }
               $rolechanges ++;
    } elsif ($key=~/^form\.act/) {
             my $udom = $env{'form.ccdomain'};              my $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 1190  END Line 1977  END
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);                  my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));                      $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));
                 } else {                  } else {
                     foreach (sort {$a cmp $b} keys %sections) {      my %curr_groups =
                         my $securl = $url.'/'.$_;   &Apache::longroup::coursegroups($one,$two);
         $r->print(&commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                           if (($sec eq 'none') || ($sec eq 'all') || 
                               exists($curr_groups{$sec})) {
                               $disallowed{$sec} = $url;
                               next;
                           }
                           my $securl = $url.'/'.$sec;
           $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
                     }                      }
                 }                  }
     } elsif ($_=~/^form\.act\_([^\_]+)\_(\w+)\_([^\_]+)$/) {      } 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 1213  END Line 2007  END
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
                 } else {                  } else {
                       my %curr_groups = 
    &Apache::longroup::coursegroups($one,$two);
                     my $emptysec = 0;                      my $emptysec = 0;
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                         $sec =~ s/\W//g;                          $sec =~ s/\W//g;
                         if ($sec ne '') {                            if ($sec ne '') {
                               if (($sec eq 'none') || ($sec eq 'all') || 
                                   exists($curr_groups{$sec})) {
                                   $disallowed{$sec} = $url;
                                   next;
                               }
                             my $securl = $url.'/'.$sec;                              my $securl = $url.'/'.$sec;
                             $r->print(&commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));
                         } else {                          } else {
                             $emptysec = 1;                              $emptysec = 1;
                         }                          }
                     }                      }
                     if ($emptysec) {                      if ($emptysec) {
                         $r->print(&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\_([^\_]+)\_([^\_]+)$/) {      } 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 1243  END Line 2044  END
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);                  my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,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(&commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));
                         } else {                          } else {
                             $emptysec = 1;                              $emptysec = 1;
                         }                          }
                     }                      }
                     if ($emptysec) {                      if ($emptysec) {
                         $r->print(&commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                          $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
                     }                      }
                 }                  }
     } else {      } else {
  $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br />');   $r->print('<p><span class="LC_error">'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$key.'</tt></span></p><br />');
             }              }
  }               foreach my $key (sort(keys(%disallowed))) {
                   if (($key eq 'none') || ($key eq 'all')) {  
                       $r->print('<p>'.&mt('[_1] may not be used as the name for a section, as it is a reserved word.',$key));
                   } else {
                       $r->print('<p>'.&mt('[_1] may not be used as the name for a section, as it is the name of a course group.',$key));
                   }
                   $r->print(' '.&mt('Please <a href="javascript:history.go(-1)">go back</a> and choose a different section name.').'</p><br />');
               }
               $rolechanges ++;
    }
     } # End of foreach (keys(%env))      } # End of foreach (keys(%env))
 # Flush the course logs so reverse user roles immediately updated  # Flush the course logs so reverse user roles immediately updated
     &Apache::lonnet::flushcourselogs();      &Apache::lonnet::flushcourselogs();
     $r->print('<p><a href="/adm/createuser">Create/Modify Another User</a></p>');      if (!$rolechanges) {
     $r->print('</body></html>');          $r->print(&mt('No roles to modify'));
       }
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub commit_customrole {  sub update_result_form {
     my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_;      my ($uhome) = @_;
     my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url.      my $outcome = 
                          ($start?', '.&mt('starting').' '.localtime($start):'').      '<form name="userupdate" method="post" />'."\n";
                          ($end?', ending '.localtime($end):'').': <b>'.      foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') {
               &Apache::lonnet::assigncustomrole(          $outcome .= '<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n";
                  $udom,$uname,$url,$three,$four,$five,$end,$start).      }
                  '</b><br />';      foreach my $item ('sortby','seluname','seludom') {
     return $output;          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="singleuser" />'."\n".
                   '</form>';
       return $outcome;
 }  }
   
 sub commit_standardrole {  sub classlist_drop {
     my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_;      my ($scope,$uname,$udom,$now) = @_;
     my $output;      my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
     my $logmsg;      my $cid=$cdom.'_'.$cnum;
     if ($three eq 'st') {      my $user = $uname.':'.$udom;
         my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec);      if (!&active_student_roles($cnum,$cdom,$uname,$udom)) {
         if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) {   my $result = 
             $output = "Error: $result\n";       &Apache::lonnet::cput('classlist',
         } else {    { $user => $now },
             $output = &mt('Assigning').' '.$three.' in '.$url.    $env{'course.'.$cid.'.domain'},
                ($start?', '.&mt('starting').' '.localtime($start):'').    $env{'course.'.$cid.'.num'});
                ($end?', '.&mt('ending').' '.localtime($end):'').   return &mt('Drop from classlist: [_1]',
                ': <b>'.$result.'</b><br />'.     '<b>'.$result.'</b>').'<br />';
                &mt('Add to classlist').': <b>ok</b><br />';  
         }  
     } else {  
         $output = &mt('Assigning').' '.$three.' in '.$url.  
                ($start?', '.&mt('starting').' '.localtime($start):'').  
                ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.  
                &Apache::lonnet::assignrole(  
                    $udom,$uname,$url,$three,$end,$start).  
                    '</b><br />';  
     }      }
     return $output;  
 }  }
   
 sub commit_studentrole {  sub active_student_roles {
     my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_;      my ($cnum,$cdom,$uname,$udom) = @_;
     my $linefeed =  '<br />'."\n";      my %roles = 
     my $result;   &Apache::lonnet::get_my_roles($uname,$udom,'userroles',
     if (defined($one) && defined($two)) {        ['future','active'],['st']);
         my $cid=$one.'_'.$two;      return exists($roles{"$cnum:$cdom:st"});
         my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid);  }
         my $secchange = 0;  
         my $expire_role_result;  sub quota_admin {
         my $modify_section_result;      my ($setquota,$changeHash) = @_;
         unless ($oldsec eq '-1') {      my $quotachanged;
             unless ($sec eq $oldsec) {      if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
                 $secchange = 1;          # Current user has quota modification privileges
                 my $uurl='/'.$cid;          $quotachanged = 1;
                 $uurl=~s/\_/\//g;          $changeHash->{'portfolioquota'} = $setquota;
                 if ($oldsec) {  
                     $uurl.='/'.$oldsec;  
                 }  
                 $expire_role_result = &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',time);  
                 $result = $expire_role_result;  
             }  
         }  
         if (($expire_role_result eq 'ok') || ($secchange == 0)) {  
             $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid);  
             if ($modify_section_result =~ /^ok/) {  
                 if ($secchange == 1) {  
                     $$logmsg .= "Section for $uname switched from old section: $oldsec to new section: $sec".$linefeed;  
                 } elsif ($oldsec eq '-1') {  
                     $$logmsg .= "New student role for $uname in section $sec in course $cid".$linefeed;  
                 } else {  
                     $$logmsg .= "Student $uname assigned to unchanged section $sec in course $cid".$linefeed;  
                 }  
             } else {  
                 $$logmsg .= "Error when attempting section change for $uname from old section $oldsec to new section: $sec in course $cid -error: $modify_section_result".$linefeed;  
             }  
             $result = $modify_section_result;  
         } elsif ($secchange == 1) {  
             $$logmsg .= "Error when attempting to expire role for $uname in old section $oldsec in course $cid -error: $expire_role_result".$linefeed;  
         }  
     } else {  
         $$logmsg .= "Incomplete course id defined.  Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed";  
         $result = "Error: incomplete course id\n";  
     }      }
     return $result;      return $quotachanged;
 }  }
   
 sub build_roles {  sub build_roles {
Line 1364  sub build_roles { Line 2150  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 1381  sub build_roles { Line 2167  sub build_roles {
             $num_sections ++;              $num_sections ++;
         }          }
     }      }
                                                                                        
     return $num_sections;      return $num_sections;
 }  }
   
 # ========================================================== Custom Role Editor  # ========================================================== Custom Role Editor
   
 sub custom_role_editor {  sub custom_role_editor {
     my $r=shift;      my ($r) = @_;
     my $rolename=$env{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     if ($rolename eq 'make new role') {      if ($rolename eq 'make new role') {
Line 1397  sub custom_role_editor { Line 2183  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::bodytag(      my %full=();
                      'Create Users, Change User Privileges').'<h2>');      my %courselevel=();
       my %courselevelcurrent=();
     my $syspriv='';      my $syspriv='';
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
       my $body_top;
       my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]);
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
       $body_top .= '<h2>';
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $body_top .= &mt('Existing Role').' "';
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
  ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);   ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);
     } else {      } else {
  $r->print(&mt('New Role').' "');   $body_top .= &mt('New Role').' "';
  $roledef='';   $roledef='';
     }      }
     $r->print($rolename.'"</h2>');      $body_top .= $rolename.'"</h2>';
 # ------------------------------------------------------- What can be assigned?      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
     my %full=();   my ($priv,$restrict)=split(/\&/,$item);
     my %courselevel=();          if (!$restrict) { $restrict='F'; }
     my %courselevelcurrent=();  
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {  
  my ($priv,$restrict)=split(/\&/,$_);  
         unless ($restrict) { $restrict='F'; }  
         $courselevel{$priv}=$restrict;          $courselevel{$priv}=$restrict;
         if ($coursepriv=~/\:$priv/) {          if ($coursepriv=~/\:$priv/) {
     $courselevelcurrent{$priv}=1;      $courselevelcurrent{$priv}=1;
Line 1434  sub custom_role_editor { Line 2220  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 1445  sub custom_role_editor { Line 2231  sub custom_role_editor {
     }      }
     my %systemlevel=();      my %systemlevel=();
     my %systemlevelcurrent=();      my %systemlevelcurrent=();
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict='F'; }          if (!$restrict) { $restrict='F'; }
         $systemlevel{$priv}=$restrict;          $systemlevel{$priv}=$restrict;
         if ($syspriv=~/\:$priv/) {          if ($syspriv=~/\:$priv/) {
     $systemlevelcurrent{$priv}=1;      $systemlevelcurrent{$priv}=1;
  }   }
  $full{$priv}=1;   $full{$priv}=1;
     }      }
       my ($jsback,$elements) = &crumb_utilities();
       my $button_code = "\n";
       my $head_script = "\n";
       $head_script .= '<script type="text/javascript">'."\n";
       my @template_roles = ("cc","in","ta","ep","st");
       foreach my $role (@template_roles) {
           $head_script .= &make_script_template($role);
           $button_code .= &make_button_code($role);
       }
       $head_script .= "\n".$jsback."\n".'</script>'."\n";
       $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.form1,'pickrole','')",
          text=>"Pick custom role",
          faq=>282,bug=>'Instructor Interface',},
         {href=>"javascript:backPage(document.form1,'','')",
            text=>"Edit custom role",
            faq=>282,bug=>'Instructor Interface',});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
   
       $r->print($body_top);
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
     'prv'  => "Privilege",      'prv'  => "Privilege",
     'crl'  => "Course Level",      'crl'  => "Course Level",
                     'dml'  => "Domain Level",                      'dml'  => "Domain Level",
                     'ssl'  => "System Level"                      'ssl'  => "System Level");
        );      $r->print('Select a Template<br />');
       $r->print('<form action="">');
       $r->print($button_code);
       $r->print('</form>');
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form method="post">  <form name="form1" method="post">
 <input type="hidden" name="phase" value="set_custom_roles" />  <input type="hidden" name="phase" value="set_custom_roles" />
 <input type="hidden" name="rolename" value="$rolename" />  <input type="hidden" name="rolename" value="$rolename" />
 <table border="2">  
 <tr><th>$lt{'prv'}</th><th>$lt{'crl'}</th><th>$lt{'dml'}</th>  
 <th>$lt{'ssl'}</th></tr>  
 ENDCCF  ENDCCF
     foreach (sort keys %full) {      $r->print(&Apache::loncommon::start_data_table().
  $r->print('<tr><td>'.&Apache::lonnet::plaintext($_).'</td><td>'.                &Apache::loncommon::start_data_table_header_row(). 
     ($courselevel{$_}?'<input type="checkbox" name="'.$_.':c" '.  '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.
     ($courselevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').  '</th><th>'.$lt{'ssl'}.'</th>'.
                 &Apache::loncommon::end_data_table_header_row());
       foreach my $priv (sort keys %full) {
           my $privtext = &Apache::lonnet::plaintext($priv);
           $r->print(&Apache::loncommon::start_data_table_row().
             '<td>'.$privtext.'</td><td>'.
       ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c" '.
       ($courselevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>'.
     ($domainlevel{$_}?'<input type="checkbox" name="'.$_.':d" '.      ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d" '.
     ($domainlevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').      ($domainlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td><td>'.      '</td><td>'.
     ($systemlevel{$_}?'<input type="checkbox" name="'.$_.':s" '.      ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s" '.
     ($systemlevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').      ($systemlevelcurrent{$priv}?'checked="1"':'').' />':'&nbsp;').
     '</td></tr>');      '</td>'.
                &Apache::loncommon::end_data_table_row());
       }
       $r->print(&Apache::loncommon::end_data_table().
      '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
      '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.
      '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".   
      '<input type="reset" value="'.&mt("Reset").'" />'."\n".
      '<input type="submit" value="'.&mt('Define Role').'" /></form>'.
         &Apache::loncommon::end_page());
   }
   # --------------------------------------------------------
   sub make_script_template {
       my ($role) = @_;
       my %full_c=();
       my %full_d=();
       my %full_s=();
       my $return_script;
       foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
           my ($priv,$restrict)=split(/\&/,$item);
           $full_c{$priv}=1;
       }
       foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
           my ($priv,$restrict)=split(/\&/,$item);
           $full_d{$priv}=1;
       }
       foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
           my ($priv,$restrict)=split(/\&/,$item);
           $full_s{$priv}=1;
       }
       $return_script .= 'function set_'.$role.'() {'."\n";
       my @temp = split(/:/,$Apache::lonnet::pr{$role.':c'});
       my %role_c;
       foreach my $priv (@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_c{$priv_item} = 1;
       }
       foreach my $priv_item (keys(%full_c)) {
           my ($priv, $dummy) = split(/\&/,$priv_item);
           if (exists($role_c{$priv})) {
               $return_script .= "document.form1.$priv"."_c.checked = true;\n";
           } else {
               $return_script .= "document.form1.$priv"."_c.checked = false;\n";
           }
       }
       my %role_d;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_d{$priv_item} = 1;
       }
       foreach my $priv_item (keys(%full_d)) {
           my ($priv, $dummy) = split(/\&/,$priv_item);
           if (exists($role_d{$priv})) {
               $return_script .= "document.form1.$priv"."_d.checked = true;\n";
           } else {
               $return_script .= "document.form1.$priv"."_d.checked = false;\n";
           }
       }
       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";
           }
     }      }
     $r->print(      $return_script .= '}'."\n";
    '<table><input type="submit" value="'.&mt('Define Role').'" /></form></body></html>');      return ($return_script);
   }
   # ----------------------------------------------------------
   sub make_button_code {
       my ($role) = @_;
       my $label = &Apache::lonnet::plaintext($role);
       my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';    
       return ($button_code);
 }  }
   
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my $r=shift;      my ($r) = @_;
   
     my $rolename=$env{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
       if (!$rolename) {
     unless ($rolename) {   &custom_role_editor($r);
  &print_username_entry_form($r);  
         return;          return;
     }      }
       my ($jsback,$elements) = &crumb_utilities();
       my $jscript = '<script type="text/javascript">'.$jsback."\n".'</script>';
   
       $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
       &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"javascript:backPage(document.customresult,'pickrole','')",
             text=>"Pick custom role",
             faq=>282,bug=>'Instructor Interface',},
            {href=>"javascript:backPage(document.customresult,'selected_custom_edit','')",
             text=>"Edit custom role",
             faq=>282,bug=>'Instructor Interface',},
            {href=>"javascript:backPage(document.customresult,'set_custom_roles','')",
             text=>"Result",
             faq=>282,bug=>'Instructor Interface',});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
   
     $r->print(&Apache::loncommon::bodytag(  
                      'Create Users, Change User Privileges').'<h2>');  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
       $r->print('<h3>');
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $r->print(&mt('Existing Role').' "');
     } else {      } else {
  $r->print(&mt('New Role').' "');   $r->print(&mt('New Role').' "');
  $roledef='';   $roledef='';
     }      }
     $r->print($rolename.'"</h2>');      $r->print($rolename.'"</h3>');
 # ------------------------------------------------------- What can be assigned?  # ------------------------------------------------------- What can be assigned?
     my $sysrole='';      my $sysrole='';
     my $domrole='';      my $domrole='';
     my $courole='';      my $courole='';
   
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict=''; }          if (!$restrict) { $restrict=''; }
         if ($env{'form.'.$priv.':c'}) {          if ($env{'form.'.$priv.'_c'}) {
     $courole.=':'.$_;      $courole.=':'.$item;
  }   }
     }      }
   
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict=''; }          if (!$restrict) { $restrict=''; }
         if ($env{'form.'.$priv.':d'}) {          if ($env{'form.'.$priv.'_d'}) {
     $domrole.=':'.$_;      $domrole.=':'.$item;
  }   }
     }      }
   
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$item);
         unless ($restrict) { $restrict=''; }          if (!$restrict) { $restrict=''; }
         if ($env{'form.'.$priv.':s'}) {          if ($env{'form.'.$priv.'_s'}) {
     $sysrole.=':'.$_;      $sysrole.=':'.$item;
  }   }
     }      }
     $r->print('<br />Defining Role: '.      $r->print('<br />Defining Role: '.
Line 1550  sub set_custom_role { Line 2453  sub set_custom_role {
  $env{'user.name'},   $env{'user.name'},
  $rolename));   $rolename));
     }      }
     $r->print('</body></html>');      $r->print('<p><a href="javascript:backPage(document.customresult,'."'pickrole'".')">'.&mt('Create or edit another custom role').'</a></p><form name="customresult" method="post">');
       $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'</form>');
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
       my $context;
       if ($env{'request.course.id'}) {
           $context = 'course';
       } elsif ($env{'request.role'} =~ /^au\./) {
           $context = 'construction_space';
       } else {
           $context = 'domain';
       }
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['action','state']);
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"/adm/createuser",
             text=>"User Management"});
       my ($permission,$allowed) = &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));
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=upload&state=',
                 text=>"Upload Users List"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List',
                                                      'User_Management_Upload'));
           $r->print('<form name="studentform" method="post" '.
                     'enctype="multipart/form-data" '.
                     ' action="/adm/createuser">'."\n");
           if (! exists($env{'form.state'})) {
               &Apache::lonuserutils::print_first_users_upload_form($r,$context);
           } elsif ($env{'form.state'} eq 'got_file') {
               &Apache::lonuserutils::print_upload_manager_form($r,$context);
           } elsif ($env{'form.state'} eq 'enrolling') {
               if ($env{'form.datatoken'}) {
                   &Apache::lonuserutils::upfile_drop_add($r,$context);
               }
           } else {
               &Apache::lonuserutils::print_first_users_upload_form($r,$context);
           }
           $r->print('</form>'.&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=expire',
                 text=>"Expire User Roles"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles',
                                                         'User_Management_Drops'));
           if (! exists($env{'form.state'})) {
               &Apache::lonuserutils::print_expire_menu($r,$context);
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonuserutils::expire_user_list($r);
           } else {
               &Apache::lonuserutils::print_expire_menu($r,$context);
           }
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'singleuser' && $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'})) ||               if ($env{'form.phase'} eq 'get_user_info') {
         (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) ||                   my ($currstate,$response,$forcenewuser,$results) = 
         (&Apache::lonnet::allowed('cep',$env{'request.course.id'})) ||                      &user_search_result($srch);
  (&authorpriv($env{'user.name'},$env{'request.role.domain'})) ||                  if ($env{'form.currstate'} eq 'modify') {
         (&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))) {                      $currstate = $env{'form.currstate'};
        &Apache::loncommon::content_type($r,'text/html');                  }
        $r->send_http_header;                  if ($currstate eq 'select') {
        unless ($env{'form.phase'}) {                      &print_user_selection_page($r,$response,$srch,$results,
    &print_username_entry_form($r);                                                 'createuser',\@search);
        }                  } elsif ($currstate eq 'modify') {
        if ($env{'form.phase'} eq 'get_user_info') {                      my ($ccuname,$ccdomain);
            &print_user_modification_page($r);                      if (($srch->{'srchby'} eq 'uname') && 
        } elsif ($env{'form.phase'} eq 'update_user_data') {                          ($srch->{'srchtype'} eq 'exact')) {
            &update_user_data($r);                          $ccuname = $srch->{'srchterm'};
        } elsif ($env{'form.phase'} eq 'selected_custom_edit') {                          $ccdomain= $srch->{'srchdomain'};
            &custom_role_editor($r);                      } else {
        } elsif ($env{'form.phase'} eq 'set_custom_roles') {                          my @matchedunames = keys(%{$results});
    &set_custom_role($r);                          ($ccuname,$ccdomain) = split(/:/,$matchedunames[0]);
        }                      }
    } else {                      $ccuname =&LONCAPA::clean_username($ccuname);
       $env{'user.error.msg'}=                      $ccdomain=&LONCAPA::clean_domain($ccdomain);
         "/adm/createuser:mau:0:0:Cannot modify user data";                      if ($env{'form.forcenewuser'}) {
       return HTTP_NOT_ACCEPTABLE;                           $response = '';
    }                      }
    return OK;                      &print_user_modification_page($r,$ccuname,$ccdomain,
 }                                                     $srch,$response,$context);
                   } elsif ($currstate eq 'query') {
                       &print_user_query_page($r,'createuser');
                   } else {
                       &print_username_entry_form($r,$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);
               }
           } elsif ($env{'form.phase'} eq 'update_user_data') {
               &update_user_data($r);
           } else {
               &print_username_entry_form($r,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'}) {
           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);
               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());
           }
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=listusers',
                 text=>"List Users"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
                                                         'User_Management_List'));
           &Apache::lonuserutils::print_userlist($r,undef,$permission,$context,
                        $formname,$totcodes,$codetitles,$idlist,$idlist_titles);
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=drop',
                 text=>"Expire Users"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles',
                                                         'User_Management_Drops'));
           if (! exists($env{'form.state'})) {
               &Apache::lonuserutils::print_expire_menu($r,$context);
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonuserutiles::expire_user_list($r);
           } else {
               &print_expire_menu($r,$context);
           }
           $r->print(&Apache::loncommon::end_page());
       } else {
           $r->print(&header());
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));            $r->print(&print_main_menu($permission));
           $r->print(&Apache::loncommon::end_page());
       }
       return OK;
   }
   
   sub header {
       my ($jscript,$loaditems) = @_;
       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);
       }
       return $start_page;
   }
   
   sub add_script {
       my ($js) = @_;
       return '<script type="text/javascript">'."\n".$js."\n".'</script>';
   }
   
   ###############################################################
   ###############################################################
   #  Menu Phase One
   sub print_main_menu {
       my ($permission) = @_;
       my @menu =
           (
             { text => 'Upload a File of Users to Modify/Create Users and/or Add roles',
               help => 'User_Management_Upload',
               action => 'upload',
               permission => $permission->{'cusr'},
               },
             { text => 'Create User/Set User Roles for a single user',
               help => 'User_Management_Single_User',
               action => 'singleuser',
               permission => $permission->{'cusr'},
               },
             { text => 'Display Lists of Users',
               help => 'User_Management_List',
               action => 'listusers',
               permission => $permission->{'view'},
               },
   #          { text => 'Expire User Roles',
   #            help => 'User_Management_Drops',
   #            action => 'expire',
   #            permission => $permission->{'cusr'},
   #            },
             { text => 'Edit Custom Roles',
               help => 'Custom_Role_Edit',
               action => 'custom',
               permission => $permission->{'custom'},
             },
           );
       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 get_permission {
       my ($context) = @_;
       my %permission;
       if ($context eq 'course') {
           if ((&Apache::lonnet::allowed('cta',$env{'request.course.id'})) ||
               (&Apache::lonnet::allowed('cin',$env{'request.course.id'})) ||
               (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) ||
               (&Apache::lonnet::allowed('cep',$env{'request.course.id'})) ||
               (&Apache::lonnet::allowed('cst',$env{'request.course.id'}))) {
               $permission{'cusr'} = 1;
               $permission{'view'} =
                    &Apache::lonnet::allowed('vcl',$env{'request.course.id'});
   
           }
           if (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) {
               $permission{'custom'} = 1;
           }
           if (&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) {
               $permission{'view'} = 1;
               if (!$permission{'view'}) {
                   my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
                   $permission{'view'} =  &Apache::lonnet::allowed('vcl',$scope);
                   if ($permission{'view'}) {
                       $permission{'view_section'} = $env{'request.course.sec'};
                   }
               }
           }
       } elsif ($context eq 'construction_space') {
           $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});
           $permission{'view'} = $permission{'cusr'};
       } else {
           if ((&Apache::lonnet::allowed('cad',$env{'request.role.domain'})) ||
               (&Apache::lonnet::allowed('cli',$env{'request.role.domain'})) ||
               (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) ||
               (&Apache::lonnet::allowed('csc',$env{'request.role.domain'})) ||
               (&Apache::lonnet::allowed('cdg',$env{'request.role.domain'})) || 
               (&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))) {
               $permission{'cusr'} = 1;
           }
           if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) {
               $permission{'custom'} = 1;
           }
           $permission{'view'} = $permission{'cusr'};
       }
       my $allowed = 0;
       foreach my $perm (values(%permission)) {
           if ($perm) { $allowed=1; last; }
       }
       return (\%permission,$allowed);
   }
   
   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 ($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($srch,%srch_results);
                           } else {
                               $currstate = 'modify';
                           }
                       } else {
                           %srch_results = &Apache::lonnet::usersearch($srch);
                           ($currstate,$response,$forcenewuser) =
                               &build_search_response($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($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($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($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($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($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($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 ($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 $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 />';
               }
           }
       }
       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',
          },
          docustom => {
              rolename => 'selectbox',
              newrolename => 'textbox',
          },
          studentform => {
              srchterm => 'text',
              srchin => 'selectbox',
              srchby => 'selectbox',
              srchtype => 'selectbox',
              srchdomain => 'selectbox',
          },
       );
   
       my $jsback .= qq|
   function backPage(formname,prevphase,prevstate) {
       formname.phase.value = prevphase;
       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 1607  sub course_level_table { Line 3203  sub course_level_table {
             'act'  => "Activate",              'act'  => "Activate",
             'rol'  => "Role",              'rol'  => "Role",
             'ext'  => "Extent",              'ext'  => "Extent",
             'grs'  => "Group/Section",              'grs'  => "Section",
             'sta'  => "Start",              'sta'  => "Start",
             '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'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$_; }          my $type=$coursedata{'type'};
  my $bgcol=$thiscourse;   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  $bgcol=~s/[^7-9a-e]//g;  
  $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);  
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count = ();          my %sections_count;
         my $num_sections = 0;  
         if (defined($env{'request.course.id'})) {          if (defined($env{'request.course.id'})) {
             if ($env{'request.course.id'} eq $domain.'_'.$cnum) {              if ($env{'request.course.id'} eq $domain.'_'.$cnum) {
                 $num_sections = &Apache::loncommon::get_sections($domain,$cnum,\%sections_count);                  %sections_count = 
       &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
  foreach  ('st','ta','ep','ad','in','cc') {   foreach my $role ('st','ta','ep','in','cc') {
     if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {      if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
  my $plrole=&Apache::lonnet::plaintext($_);   my $plrole=&Apache::lonnet::plaintext($role);
  $table .= <<ENDEXTENT;   $table .= &Apache::loncommon::start_data_table_row().
 <tr bgcolor="#$bgcol">  '<td><input type="checkbox" name="act_'.$protectedcourse.'_'.$role.'" /></td>
 <td><input type="checkbox" name="act_$protectedcourse\_$_"></td>  <td>'.$plrole.'</td>
 <td>$plrole</td>  <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
 <td>$area<br />Domain: $domain</td>          if ($role ne 'cc') {
 ENDEXTENT                      if (%sections_count) {
         if ($_ ne 'cc') {                          my $currsec = &course_sections(\%sections_count,$protectedcourse.'_'.$role);
                     if ($num_sections > 0) {  
                         my $currsec = &course_sections($num_sections,\%sections_count,$protectedcourse.'_'.$_);  
                         $table .=                           $table .= 
                     '<td><table border="0" cellspacing="0" cellpadding="0">'.                      '<td><table class="LC_createuser">'.
                      '<tr><td valign="top">'.$lt{'exs'}.'<br />'.                       '<tr class="LC_section_row">
                           <td valign="top">'.$lt{'exs'}.'<br />'.
                         $currsec.'</td>'.                          $currsec.'</td>'.
                      '<td>&nbsp;&nbsp;</td>'.                       '<td>&nbsp;&nbsp;</td>'.
                      '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.                       '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.
                      '<input type="text" name="newsec_'.$protectedcourse.'_'.$_.'" value="" /></td>'.                       '<input type="text" name="newsec_'.$protectedcourse.'_'.$role.'" value="" />'.
                      '<input type="hidden" '.                       '<input type="hidden" '.
                      'name="sec_'.$protectedcourse.'_'.$_.'"></td>'.                       'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'.
                      '</tr></table></td>';                       '</tr></table></td>';
                     } else {                      } else {
                         $table .= '<td><input type="text" size="10" '.                          $table .= '<td><input type="text" size="10" '.
                      'name="sec_'.$protectedcourse.'_'.$_.'"></td>';                       'name="sec_'.$protectedcourse.'_'.$role.'" /></td>';
                     }                      }
                 } else {                   } else { 
     $table .= '<td>&nbsp</td>';      $table .= '<td>&nbsp</td>';
                 }                  }
  $table .= <<ENDTIMEENTRY;   $table .= <<ENDTIMEENTRY;
 <td><input type=hidden name="start_$protectedcourse\_$_" value=''>  <td><input type="hidden" name="start_$protectedcourse\_$role" value='' />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$_.value,'start_$protectedcourse\_$_','cu.pres','dateset')">$lt{'ssd'}</a></td>  "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\_$_" value=''>  <td><input type="hidden" name="end_$protectedcourse\_$role" value='' />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$_.value,'end_$protectedcourse\_$_','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$role.value,'end_$protectedcourse\_$role','cu.pres','dateset')">$lt{'sed'}</a></td>
 ENDTIMEENTRY  ENDTIMEENTRY
                 $table.= "</tr>\n";                  $table.= &Apache::loncommon::end_data_table_row();
             }              }
         }          }
         foreach (sort keys %customroles) {          foreach my $cust (sort keys %customroles) {
     if (&Apache::lonnet::allowed('ccr',$thiscourse)) {      if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
  my $plrole=$_;   my $plrole=$cust;
                 my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}.                  my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}.
     '_'.$env{'user.name'}.'_'.$plrole;      '_'.$env{'user.name'}.'_'.$plrole;
  $table .= <<END;   $table .= &Apache::loncommon::start_data_table_row().
 <tr bgcolor="#$bgcol">  '<td><input type="checkbox" name="act_'.$customrole.'" /></td>
 <td><input type="checkbox" name="act_$customrole"></td>  <td>'.$plrole.'</td>
 <td>$plrole</td>  <td>'.$area.'</td>'."\n";
 <td>$area</td>                  if (%sections_count) {
 END                      my $currsec = &course_sections(\%sections_count,$customrole);
                 if ($num_sections > 0) {  
                     my $currsec = &course_sections($num_sections,\%sections_count,$customrole);  
                     $table.=                      $table.=
                    '<td><table border="0" cellspacing="0" cellpadding="0">'.                     '<td><table class="LC_createuser">'.
                    '<tr><td valign="top">'.$lt{'exs'}.'<br />'.                     '<tr class="LC_section_row"><td valign="top">'.
                      $currsec.'</td>'.                     $lt{'exs'}.'<br />'.$currsec.'</td>'.
                    '<td>&nbsp;&nbsp;</td>'.                     '<td>&nbsp;&nbsp;</td>'.
                    '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.                     '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.
                    '<input type="text" name="newsec_'.$customrole.'" value="" /></td>'.                     '<input type="text" name="newsec_'.$customrole.'" value="" /></td>'.
                    '<input type="hidden" '.                     '<input type="hidden" '.
                    'name="sec_'.$customrole.'"></td>'.                     'name="sec_'.$customrole.'" /></td>'.
                    '</tr></table></td>';                     '</tr></table></td>';
                 } else {                  } else {
                     $table .= '<td><input type="text" size="10" '.                      $table .= '<td><input type="text" size="10" '.
                      'name="sec_'.$customrole.'"></td>';                       'name="sec_'.$customrole.'" /></td>';
                 }                  }
                 $table .= <<ENDENTRY;                  $table .= <<ENDENTRY;
 <td><input type=hidden name="start_$customrole" value=''>  <td><input type="hidden" name="start_$customrole" value='' />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">$lt{'ssd'}</a></td>  "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=''>  <td><input type="hidden" name="end_$customrole" value='' />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$customrole.value,'end_$customrole','cu.pres','dateset')">$lt{'sed'}</a></td></tr>  "javascript:pjump('date_end','End Date $plrole',document.cu.end_$customrole.value,'end_$customrole','cu.pres','dateset')">$lt{'sed'}</a></td>
 ENDENTRY  ENDENTRY
                  $table .= &Apache::loncommon::end_data_table_row();
            }             }
  }   }
     }      }
     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_sections {
     my ($num_sections,$sections_count,$role) = @_;      my ($sections_count,$role) = @_;
     my $output = '';      my $output = '';
     my @sections = (sort {$a <=> $b} keys %{$sections_count});      my @sections = (sort {$a <=> $b} keys %{$sections_count});
     if ($num_sections == 1) {      if (scalar(@sections) == 1) {
         $output = '<select name="currsec_'.$role.'" >'."\n".          $output = '<select name="currsec_'.$role.'" >'."\n".
                   '  <option value="">Select</option>'."\n".                    '  <option value="">Select</option>'."\n".
                   '  <option value="">No section</option>'."\n".                    '  <option value="">No section</option>'."\n".
Line 1732  sub course_sections { Line 3328  sub course_sections {
     } else {      } else {
         $output = '<select name="currsec_'.$role.'" ';          $output = '<select name="currsec_'.$role.'" ';
         my $multiple = 4;          my $multiple = 4;
         if ($num_sections <4) { $multiple = $num_sections; }          if (scalar(@sections) < 4) { $multiple = scalar(@sections); }
         $output .= '"multiple" size="'.$multiple.'">'."\n";          $output .= 'multiple="multiple" size="'.$multiple.'">'."\n";
         foreach (@sections) {          foreach my $sec (@sections) {
             $output .= '<option value="'.$_.'">'.$_."</option>\n";              $output .= '<option value="'.$sec.'">'.$sec."</option>\n";
         }          }
     }      }
     $output .= '</select>';       $output .= '</select>'; 
Line 1744  sub course_sections { Line 3340  sub course_sections {
   
 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 $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="" />';                        '<input type="hidden" name="dccourse" value="" />';
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
                      ('cu','dccourse','dcdomain','coursedesc').'</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,$dcdom);  
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'crl'  => "Course Level",  
                     'crt'  => "Course Title",  
                     'rol'  => "Role",                      'rol'  => "Role",
                     'grs'  => "Group/Section",                      'grs'  => "Section",
                     'exs'  => "Existing sections",                      'exs'  => "Existing sections",
                     'new'  => "Define new section",                       'new'  => "Define new section", 
                     'sta'  => "Start",                      'sta'  => "Start",
Line 1764  sub course_level_dc { Line 3357  sub course_level_dc {
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
                   );                    );
     my $header = '<h4>'.$lt{'crl'}.'</h4>'.      my $header = '<h4>'.&mt('Course Level').'</h4>'.
                  '<table border="2"><tr><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><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'".'cu'."'".','."'".'dccourse'."'".','."'".'dcdomain'."'".','."'".'coursedesc'."',''".')" /></td>'.                   &Apache::loncommon::start_data_table_header_row().
                    '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                    &Apache::loncommon::end_data_table_header_row();
       my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                        '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                      '<td><select name="role">'."\n";                       '<td><select name="role">'."\n";
     foreach  ('st','ta','ep','ad','in','cc') {      foreach  my $role ('st','ta','ep','in','cc') {
         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 1785  sub course_level_dc { Line 3382  sub course_level_dc {
                      ' <option value=""><--'.&mt('Pick course first').'</select></td>'.                       ' <option value=""><--'.&mt('Pick course first').'</select></td>'.
                      '<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="" /></td>'.                       '<input type="text" name="newsec" value="" />'.
                        '<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.108  
changed lines
  Added in v.1.196


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.